Play Framework Sinir Stresleri – 1

Herkese merhaba,

Uzun aradan sonra play framework kullanarak birşeyler yapmam gerekti ki, yeni bir versiyonu çıkmış ve arkadaşlar  base versiyonu güncellemişler. Bunun sonucu olarak hepinizin eninde sonunda alacağı bir hata olan aşağıdaki güzellikle karşılaştım:

[error] (*:update) sbt.ResolveException: download failed: org.slf4j#slf4j-api;1.6.6!slf4j-api.jar
[info] Updating {file:/path/to/your/workspace/}asante...
[warn]  [NOT FOUND  ] org.slf4j#slf4j-api;1.6.6!slf4j-api.jar (0ms)
[warn] ==== local: tried
[warn]   /path/to/your/play/home/play-2.1.1/repository/local/org.slf4j/slf4j-api/1.6.6/jars/slf4j-api.jar
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::              FAILED DOWNLOADS            ::
[warn]  :: ^ see resolution messages for details  ^ ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: org.slf4j#slf4j-api;1.6.6!slf4j-api.jar
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
 İnternette aradığımda karşıma saçma sapan blog yazıları çıktı. Bu sebeple bu yazıyı yazma ihtiyacı duydum. Arkadaşlar bu hatanın sebebi, makinanıza kurulu olan Play versiyonu ile projenin Play versiyonunun farklı olmasıdır!!!! Bunu plugins.sbt den düzelttiğinizde sorun ortadan kalkacak.
Satir atlama
Örneğin sizde 2.1.1 vardı ve uygulama 2.1.3 kullanıyorsa bu hatayla karşılaşacaksınız demektir. Versiyonunuzu güncelleyin ve ilerlemeye devam edin.
Satir atlama : )
Web’de de karşınıza çıkan yok efendim 2.0.7 yap geçer, 2.1.5 te bu sorun yok gibi izansız ifadelere de önem vermeyin.
Satir atlama
İyi kodlamalar!

Scala’da case classes, pattern eşleştirme ve exception handling

Evet arkadaşlar selamlar,

Bu blogda arada sırada Scala yazmaya çalışıyorum. Bu ay da Scala’nın bazı özelliklerinden kısaca bahsedeyim istedim. Bu yazıda case classes, kısaca pattern matching ve exception mantığından bahsedeceğim sizlere.

Case classes, normal class mantığından bir kaç sentaktik şeker vererek ayrılan bir olgu. Case class kullandığınız zaman constructorda verdiğiniz parametreler için otomatik olarak içerde private alanlar oluşturuluyor ve bu alanlara yine constructorda verdiğiniz parametre isimlerinden erişebiliyorsunuz. Bu sayede basit POJO lar oluşturmak oldukça kolay hale geliyor. Basit bir örnek vermek gerekirse:

case class Person(firstName: String, lastName: String)

val me = Person("Erkan", "Ahmet")
val first = me.firstName
val last = me.lastName

if (me == Person(first, last)) {
  println("Found myself!")
  println(me)
}

Gördüğünüz gibi bütün sınıf tek bir satırdan oluşmakta. Gerçi bu kavramın adındaki Case nedir diye düşünenleriniz vardır, az bekleyin.

Gelelim pattern matching’e. Java da bu mantık switch case ler üzerinden yürüyor bildiğiniz gibi. Yalnız bu yapı sadece primitif tipleri kontrol edebiliyor. Bu da sizi eninde sonunda bir integer a yada bir enum değerine kadar indirebiliyor. O kadar karmaşık sınıflar yazıyor ama karşılaştıramıyoruz.

Bu soruna Scala’da amcalar neşter atmışlar. Temelde Java’dan ayrıldığı bir kaç noktayı aktaralım:

  1. Case statementları birbiri içine girmezler, yani gidip de hepsine break yazmak zorunda değilsiniz.
  2. Case statementları bir değer dönerler, bunu olduğu gibi kullanabilirsiniz, bu sayede daha az satır kod yazmış olursunuz.
  3. Case statementlar, patternleri eşleştirebilirler, bunun en güzel örneği ise case class kullanımında görülür.

object Scenario{
def apply(user: String, action: GameElement) = {
action match {
case workout: Workout => new WorkoutScenario( workout, user )
case like: Like => new SocialScenario( like, user )
}
}
 }

 

 
Örnekte gördüğünüz üzere, action nesnesi match blokuna sokuldu. Match blokunda, bu action sınıfından türemiş diğer sınıflarla karşılaştırıldı. Bunlar Workout ve Like. Bunlardan hangisi ile eşleştiyse de, buna uygun bir nesne üretildi ve geri dönüldü. İşte ben buna factory pattern derim. Hatta demem, çünkü ortada pattern denecek kadar bir kod parçası yok. : )

Peki gelelim exception handlinge. Scala bu işe de el atmış durumda. Normalde bir noktadan exception throw ederdiniz. Burada sorun yok. Fakat yakalayacağınız yerde, her bir exception tipi için ayrı ayrı blok açar ve ne yapacağınızı şaşırdınız. Scala ise exception handling’de de pattern matching kullanarak, işimizi bir adım daha kolaylaştırıyor.

Örnek vermek gerekirse

</pre>
<address>try{

workoutItems.foreach(item => {
...
if (repeat <= set.repeat_number.toInt) {</address><address>              ....
throw BadgeWon("pushup badge won!")
}

})
}
})

}
catch {
case e:BadgeWon => println("found the badge: " + e.message)
case e => {
println("general exception" + e.getMessage )
e.printStackTrace()
}
}</address><address>
Gördüğünüz gibi çok daha kısa bir kod parçası ile, exceptionlarınızı da yönetmeyi başardınız. Scala kullandıkça özelliklerini daha da çok seveceksiniz.
Önümüzdeki yazıda function literals konusuna değinmek istiyorum, herkese iyi günler!

Scala 101 gibi bir yazı

Selam arkadaşlar,

İşyerinde yine bir teknolojik atılım gerçekleştirdik ve JVM üzerinde çalışan fonksiyonel ve nesne yönelimli dil olan Scala’yı projelerimizde kullanmaya başladık.

Açıkçası ne zamandır fonksiyonel dilleri kullanmak istiyordum ama fırsatım olmuyordu, javascriptte jquery kullanmaktan öteye gidememiştik. Sonuç olarak Scala kullanmaya başlayarak zihinsel haritamızda büyük bir atılım yapmış olduk.

Peki fonksiyonel programlama nedir? Çok kısa bir tanımla açıklama gerekirse, programlarınızı statementlar yerine fonksiyonlar olarak düşünmektir. Yani mümkün olduğu kadar en küçük birimlerin fonksiyonlardan oluşması olarak adlandırabiliriz. Bu tanımdan hareketle fonksiyonel dillerin bunu sağlayabilmesi için fonksiyonları temel veri yapılarından sayması gerekir. Bu sağlandığında fonksiyonları parametre olarak kullanabilir, değişkenlere atayabilir, gerektiğinde çağırabilirsiniz. Bir diğer gerekli özellik ise, fonksiyonların sadece aldığı parametrelere göre dönüş değerleri üretmesidir. Yani gönderdiğiniz parametrelerde değişiklik yapılmamalıdır.

Bunlardan yola çıkarak Scala’daki (diğer fonksiyonel dillerde de kullanılmakta olan) bir kaç temel özellikten bahsedeyim.

  1. Fonksiyon literalleri : Scala da sadece fonksiyon tanımlamak zorunda değilsiniz, şunu da yapabilirsiniz: val ekle = (x: Int, y: Int) => x + y . Bu aşamada fonksiyonu istediğiniz zaman çağırabilir, diğer fonksiyonların içinde kullanabilirsiniz, parametre olarak geçebilirsiniz.
  2. map fonksiyonu : Bir liste üzerindeki tüm elemanlar üzerinde çalışıp, yeni bir liste üreten fonksiyon.
  3. filter fonksiyonu : Bir liste üzerindeki tüm elemanlar üzerinde çalışıp, verilen teste uygun olanlardan yeni bir liste üreten fonksiyon.

Bu 3 temel özellik ile yazdığınız programlar hem çok kısalır hem de anlaşılması daha kolay olur. Ufak tefek fonksiyonları birbirleriyle kullanarak çok anlamlı ve işlevsel programlar yazabilirsiniz. (Tıpkı Unix command line araçları gibi)

Map ve fonksiyon literallerine bir örnek :

scala> val l = List(1,2,3,4,5)

scala> l.map( x => x*2 )

res60: List[Int] = List(2, 4, 6, 8, 10)

Bunların üzerine daha çok gideceğiz ilerideki yazılarda, takibe devam!