Scala Class, Object and Method 2

Merhaba arkadaslar, bu yazımda class method yapılarına biraz daha değinmeye çalışacağım.

Class yapısına tekrar bir göz atalım;

Yukarıdaki şekilde {} kullanmadan kodu derlersek basarılı bir sekilde derlenecektir. Compiler otomatik olarak şunları oluşturacaktır;

*  İlk olarak Scala private yada protected kullanılmamışsa default olarak public yapar classımızı.

* number değişkenimiz val(immutable) olduğundan dolayı private final olarak oluşturuldu ve public number(); ile getter methodunu oluşturdu.

* creditLimit değişkenimiz inin private declarasyonu ve var(mutable) olduğundan dolayı getter ve settter methodları oluturuldu.

* Eğer constructor içerisinde parametreleri var yada val olarak tanımlamaz isek Scala private field ve private getter , setter methodlarını oluşturacaktır.

* { } öncesindeki CreditCard(val number: Int, var creditLimit: Int) ifadesi primary constructor’dur. Constructorları overloaded edebiliriz;

* private var creditType : String = _ ile yeni bir field tanımladık ve _  ile default değer verdik. Reference type  için null, int için 0 double icin 0.0 vs. underscore(_) karekteri default değer atamak için kullanılır. Ancak val değişkenlerde kullanılamaz(immutable olduğu için).

* def ile yeni bir method tanımlar gibiyiz anca isim olarak this kullanarak constructor olduğunu belirtmiş olduk.

* creditType adında yeni bir field oluşturduk dedik. JavaBean gibi getter setter methodlarının oluşturulmasını istiyorsak eğer field declarasyonu yapmadan önce annotation kullanabiliriz. Bu sayede Scala bize getter ve setter methodlarını (JavaBean olarak) oluşturacaktır.

*  credit.setCreditType(“”) ve credit.getCreditType() methodları oluşacaktır.

* instance oluşturalım;

 

Case Class

Pattern matching ve regular expression konularına girmekle beraber burada biraz match yapısına değiniceğim.

Eşzamanlı programlarda actorler arası mesajlaşmada alınan tipe göre işlem yapılması gerekebilir. Farklı format ve farklı tipte veriler gelebilir.  Öncelikle matching literale bakalım;

Java’da nasıl yaparız bir ona bakalım;

Scala ;

* activity methodunu “Sunday” ile çağırdığımızda “Eat, sleep, repeat…” çıktısını üretecektir. Tüm caseler için şunu yazabiliriz;

* match deyimi Any referansları ile çalışır. Yukarda biz String yolladık.

* Şuanki hali ile case’lerle eşleşmeyen bir day yolladığımızda MatchError exception fırlatıcaktır. default case durumu için wildcard kullanmalıyız;

^ satırını ekleyelim ve activity(“Wednesday”) ile çağırdığımızda default case ile eşleşecek ve ilgili çıktıyı vericektir

* case olarak tuple, list içinde pattern matching kullanabiliriz.

* Methodumuzun Any type kabul ettiğini gözden kaçırmayalım.

* List matching;

* processItem(List(“çay”,”sever”) ile çağırdığımızda “ÇaySever” yazacaktır.

Array explosion(_*) kullanımı;

* Eğer daha fazla item geliceğini tahmin ediyorsak _* sembolünü kullarak bunu match edebiliriz;

* processItem(List(“çay”,”sever”,”daha fazla çay sever”)) ile çağırdığımızda  “çaydan başka şeyler de seviliyormuş” çıktısı vericektir. İlk iki item olan “çay” ve “sever” aynı olmak zorundadır. Fazladan gelen itemlere referance verebiliriz. Şöyleki ;

* @ _* ile other referance aldık. Şu şekilde çağıralım;  processItem(List(“kahve”,”sever”,”başka şeyler”,”başka şeyler”))

* Bize çıktı olarak KahveSever and List(başka şeyler, başka şeyler) vericektir.

* case’ler birbiri ile aynı olmak zorunda değildir, aynı anda Int, String, tuple vs. handle edilebilir.

Case Class

Case class’lar matching pattern’larda actorler arası mesajlaşmada ve compile zamanlı hataları yakalamada kullanışlıdır. Normal class’lardan pek farkı olamamakla beraber case class şu özelliklere sahiptir;

  • Pattern matchingde kullanılabilir.
  • hashcode ve equals methodu otomatik olarak oluşturulur.
  • Constructor parametreleri için otomatik olarak getter methodlarını oluşturur.

Scala consolda şunları yazalım;

* class tanımının önüne case koyarak case class oluşturabiliriz. Yukarıdaki case ve noncase class nesnelerinin karşılaştırılması sonucu false ve true olarak gerçekleşti. Case class otomatik olaral equals’ı impelemente eder. == burada equals’ı çağırır. Değer olarak compare eder , referance compare için eq yada ne kullanılabilir.

* Yukardaki sınıfları yazalım. Daha sonra extends konusuna değineceğim ama şu anlık burada konumuzla ilgili değil.

* Yeni bir sınıf oluşturalım ve proces methodunu yazalım;

* Yukarda göreceğiniz üzere request olarak Sell, Buy ve bunların değişik versiyonları (constant olarak 100 yada if şartı koyma gibi) gelmekte. Gelen case class otomatik olarak equals implemantasyonu gerçekleştiğinden değersel olarak karşılaştırılır. Test edelim;

 

 

* Dikkat ederseniz Hedge case classını match etmedik. Eğer runtime anında Hedge gelirse problem çıkacaktır. Bunu önlemek için Trade sınıfını şu şekilde değiştirelim;

* Bu şekilde değiştirdiğimizde aslında bir uyarı/hata oluşacaktır. Scala compiler bizi Hedge içinde match pattern uygulamamızı isteyecektir. Sealed sayesinde runtime anında çıkabilecek hataları compile anında önleyebiliriz. Aslında şunu demiş oluyoruz Scala compiler’a; file içerisinde Trade sınıfını extends eden başka case class yok. Ve case class’ların tamamı için match pattern uyguladım.

* Case class’ların bir özelliği de copy methoduna sahip olmaısıdır. Bir case class tanımı yapıldığında case class için copy methodu oluşturulur. copy methodu clone oluşturur aslında.  Örneğin;

Scala Method

Method declarasyonunun şu şekilde oldugunu bilelim;

 

* Methodları şu şekillerde çağırabiliriz ;

 

* Eğer methodumuz 0 yada 1 parametre alıyor ise dot(.) ve () kullanımı zorunlu değildir. Eğer 1 den fazla parametre alıyor ise parantez kullanımı zorunludur ancak dot(.) kullanmak yine zorunlu değildir.

* Java’daki var-args yapısının bir benzerini Scala’da yapabiliriz;

* Method parametrelerinde default değer atayabiliriz;

* Daha sonra anonymous, Currying ve nested functionlara değineceğim.

* Yazımı burada sonlandırıyorum. Bir sonraki yazıda görüşmek üzere.

~ Alican Akkuş

 

1208 Total Views 2 Views Today