Bu yazının konusu Fonksiyonlar olacak.
Fun anahtar kelimesi kullanılarak üretilirler. Fun kelimesinden sonraki kelime ( parantezine kadar fonksiyon ismini gösterir. a: Int ve b: Int değişken isimleri ve tiplerini, : Int return tipini gösterir.
Kullanımı :
Daha kısa hali :
return tipine sahip olmayan :
Başka Class larda bulunan fonksiyonlar şu şekilde çağırılır :
Parametreler name: type şeklinde tanımlanır.
Default değerler = kullanılarak tanımlanır. Override edilen methodlar daima bu default değeri kullanırlar. Ancak override dilen methodlar bu default değeri gösteremezler.
Eğer bir fonksiyon fazla sayıda parametreye sahipse, fonksiyonu çağırabilmek için parametrelerin hepsini fonksiyona göndermek zorunda değiliz.
Bu fonksiyonu şu şekillerde çağırabiliriz:
Ancak default değerler olmazsa bu fonksiyonu ancak şu şekilde çağırabiliriz:
Aklınıza gelen soruyu duyar gibi oluyorum. Hemen cevap vereyim :
Tek-İfade fonksiyonları (Single-Expression)
Tek bir methoda aynı tipte birden fazla parametre göndereceksek bu tipi kullanmalıyız.
Bu fonksiyonunu çağırılışı şu şekildedir:
Kotlin iç içe fonksiyonları desteklemektedir. Ve içerideki fonksiyon dışarıdaki fonksiyonun değişkenlerine ulaşabilmektedir.
Fonksiyonu bir aritmetik operatör gibi kullanmamızı sağlar. Böylece noktalara ve parantezlere ihtiyaç duymayız. Hemen örneğini iliştireyim :
Çıktı şu şekilde olacaktır :
Java Generic yapısının aynısını taşımaktadır.
Sınıf veya obje içerisinde yazılmış sınıflardır.
Kullanımı :
Bu tip fonksiyonlar Android uygulama geliştirme dünyasında bize pek çok yardımı olabilecek olan fonksiyonlardır. Ne yazık ki Android framework bazen işleri gereğinden fazla zorlaştırabiliyor ve Java’da bulabildiğimiz tek çare kendi wrapper larımızı veya static methodlarla dolu utility sınıflarımızı yazmak oluyor. Bu da okunabilirlik açısından çok da iyi bir çözüm olmuyor. İşte burada Kotlin’in özelliği olan Extension Fonksiyonlar yardımımıza Framework sınıflarına ekleme yaparak koşuyor.
Kısaca Extension Fonksiyonlar, Framework sınıflarının kendi kodlarına dokunmadan bazı fonksiyonalitelerini değiştirebilmemize olanak sağlıyor.
View sınıfına, visible isimli view’ı visible yapacak bir fonksiyon lazım olsun.
İşte bu kadar.
Android dünyasından birkaç örnek daha vermek istiyorum bu konuda. Dikkat Android dünyasından vereceğim örnekler için Android programlamayı biraz kurcalamış olmanızı tavsiye ederim.
Adapter sınıfları içerisinde bir view’ı inflate edebilmek için yazdığımız kod şudur :
Ancak neden ViewGroup sınıfına inflate özelliğini katmayalım ki?
Ve bu fonksiyonun kullanımı :
Çok basit bir örnek daha vereyim. Eğer Picasso kütüphanesini kullanıyorsanız bilirsiniz :
Peki bunu ImageView sınıfına eklemek neden mümkün olmasın ? Adeta ImageView sınıfının içine loadUrl isimli bir method gömdüğünüzü ve başka hiçbir methoda dokunmadığınızı düşünün. Utility sınıfı yok. Static method yok. extends ImageView yok. Tek bir methodu herhangi bir isme sahip herhangi bir sınıfta bu şekilde yazdığınız anda koca ImageView sınıfına bir method eklemiş oluyorsunuz.
Ve kullanımı şu şekilde
Çok iyi değil mi Ey Android uygulama geliştiricileri? Başta Erdem abi? :D
Gelecek yazılarda Android referansları çok daha fazla olacak. Ve tabiiki Kotlin kullanarak 0dan bir Android projesi yazacağım bu blog yazılarında. Kotlin fonksiyonlarından en sonununcusuna gelelim:
Bazı algoritmalar Recursive fonksiyonlar kullanmadan loop yapısına ihtiyaç duyarlar. Stack overflow riski olmadan Kotlin’de bize bunu sağlayan yapı tailrec yapısıdır. Fonksiyon tanımlarının başına ekleyerek bu yapıyı kullanabiliriz.
Geleneksel yolda şu şekilde yazılan recursive fonksiyon :
Kotlin’in tailrec özelliği sayesinde şuna dönüşür:
Bu fonksiyon cosinus değerini hesaplayan bir fonksiyondur. Sonuç değişmez olana kadar çalışmaya devam eder. Kısaca recursivedir. Tailrec kullanabilmek için fonksiyon son işlem olarak kendisini çağırmak zorundadır. Try catch finally yapılarında kullanılamaz. Şu anda sadece JVM backendinde kullanılan bir yapıdır.