Kotlin Cheat-Sheet

Sonunda benim de Kotlin üzerine konuşmamın zamanı geldi 🙂 Kotlin son birkaç yıldır inanılmaz popüler olmuş durumda, benim içinse yazılan kodları okumaktan aktif olarak kotlin yazmaya geçişim biraz daha yeni. Bu yüzden üzerine bir de konuşma hazırladım. Slaytlara linkten erişebilirsiniz.
Şimdi eğer hala Java ve Kotlin arasında seçim noktasındaysanız ki olabilir çünkü Java çok eski bir dil. Genelde herkesin en iyi bildiği dil 😀 Kotlin’e geçmeli mi yoksa bildiğimiz gibi devam mı etmeli. Tabi burada farklı stratejilerle ilerlenebilir. Tamamen Kotlin’e geçme, Java ve Kotlin’i beraber destekleme ya da hiç geçmeme gibi 😀
Aslında Kotlin’in official dil olarak kabul edilmesinin sebebi popüler olması değil, komunitenin Kotlin’in avantajlarından dolayı Kotlin’e geçmesi sonucuydu. Hepsinin değil ama en çok kullanılan özelliklerin yazıda üzerinden geçeceğim. Umarım güzel bir cheat-sheet olmuş olur herkes için.

Kotlin’in çok çok kısa tarihçesine girersek de Jetbrains ekibi tarafından geliştirildi.
2011 yılında public oldu ancak 2016 yılında ilk 1.0 stable versiyon çıktı. Yani baya yeni.
Java’yla %100 uyumlu, en çok çabalanan şeylerden biri de bu o yüzden hiç düşünmeden geçiş de yapılabilir.

Peki Kotlin’e geçmek şu noktada bakınca sadece faydalı olduğu için mi? Değil, birkaç nokta daha var. Kotlin open source olarak lisanslı. Yani teorik olarak Jetbrains dışında da geliştirilmeye devam edilebilir. Google zaten 2. official dili olarak Kotlini 2017 de duyurmuştu ancak sonrasında da giderek kullanım arttı. Yeni codelablerin sunumların hepsi şu an Kotlin’le. Developer.android’de kod örnekleri default kotlin geliyor. Dili değiştirirsek Java oluyor. Google’ın giderek artan supportunu da düşünürsek uzun vadede Kotlin öğrenmiş olmak Android için faydalı olacak. Bi diğer yandan Java ekosistemi de Kotlin’e kucak açmış durumda. Spring 5’le Kotlin supportu duyurulmuştu. Gradle scripltlerini kotlinle yazabiliyoruz. Junit5 da Kotlin’i destekliyor.

O zaman hayat kurtarıcı bazı kotlin featurelarının üzerinden geçmeye başlıyorum. Elvis operator olmasaydı null checkleri nasıl yapacaktık. Üstteki ilk görsel bunu tam olarak gösteriyor. Null değer atamak yerine basitçe elvis operatörle değişkeni verebiliriz. Benim en sevdiklerimden.

Bir diğer hayatımızı kolaylaştıran feature’sa string templateler. Değişkenin başına $ ekleyerek basitçe stringi formatlayabiliyoruz.

Yukarıdaki görseller ise Desctructuring örneği. Şöyleki elimde bir objem var. İçindeki değişkenleri hızlıca variable’lara atamak istiyorum ya da bi fonksiyon çağıracağım bir obje dönüyor ve o alanlara hızlıca erişmek istiyorum. Android ktx de daha fazla sayıda da destructing tanımı bulunmakta bu arada. Mesela Color için. Destructuring tam olarak bu işe yarıyor. Yalnız bu şekilde erişebilmek için componentin(component n) methodlarının yer alması gerekli. Eğer classımız dataclass’sa bunun için ekstra bir şey yapmamıza gerek yok. Ancak değilse bir yukardaki görseldeki gibi tanımlamız gerekir.

Kotlin’in standart Pair class’ı da function returni için kullanılabilirdi ama diğer şekilde biz customize edebiliyoruz.

En güzel örneği de sanırım sancısız bir şekilde maps’de kullanabilmemiz. Böyle olmasaydı tek tek atamamız gerekecekti.

Dönülen result bir obje ama biz tek bir değeri kullanmak istiyorsak, kullanmak istemediklerimizi underscore da yapabiliriz.

Sıradaki when. When aslında java’daki switch’e denk geliyor ama biraz super güçleri olan bir switch olarak düşünebiliriz kendisini. Value, enum, range of numbers burada her şeyi case olarak kullanabiliriz.

Hala devam ediyor mu bilmiyorum ama Hacettepe’nin şöyle bir tarzı vardı. 2 haftada bir farklı bir dilde ödev verip, o dili öğrenip sonrasında tabi ödevi de tamamlamamız beklenirdi. Zamanında çok acı çektik ama bu sayede yeni bir dile adaptasyon süremiz hem azaldı hem de çok fazla farklı dil görmüş olduk. Aslında hepsi arasında en hızlı alıştığım ve de yazdıkça öğrendikçe daha çok sevdiğim bir Kotlin oldu. Bu arada tüm dilleri denedim de en iyisi bunu buldum gibi bir yanlış anlaşılma da olmasın. Henüz hiç deneyimim olmayan çok fazla popüler dil olmakla beraber naçizane değerlendirmem benim bilgi dağarcığımda Kotlin’in en kolay öğrenebilir olduğu yönünde 🙂 Bir de şu konu var ki yazılımcılar da aynı zamanda kullanıcılar. Bir yazılım dilinin kullanıcıları. Tabi burada biz yazılımcılar hiç bir uygulama kullanmıyoruz değil de 😀 geliştirme noktasındaki konumumuz bu şekilde. Kotlin’se bir developerın ihtiyaçlarını karşılayıp kendi ihtiyaçları için yeni eklentiler geliştirebileceği en developer friendly dillerden. Tabi ki benzer başka diller de vardır.

For looplar range expressionlar ve descturingle beraber kullanıldığında super power elde etmiş oluyor. Bir super power feature’ımız daha olmuş oldu. 

Properties. Değişkenler mutable ya da read only immutable olabilir. Val olanlar immutable, var olanlar ise mutable değişkenler. Default olarak her değişkenin get ve seti var. Ama görseldeki örnek gibi custom bir şey yapmak istiyorsanız override edebilirsiniz de. En sevdiğim yanlarından biri bu getter setter. Javadaki milyonlarda gereksiz methoddan kurtulmuş oluyoruz.

Data classes. Aslında önceki feature’ları anlatırken de  bi adı geçti. Bir data class’da ihtiyacımız olan equals, hashcode, toString methodlar biz bir şey yapmadan implement edilmiş olur. Ayrıca daha önce dediğimiz componentN methodları da yer alıyor. Data class’da bu methodlar constructorda yer alan değişkenler için yaratılır. Tabi ki constructor dışında da değişkenler olabilir ama bunlar bu methodlaraa katılmayacaktır.

Mesela name constructor da age ise class’ın içerisinde olsun. İsimler aynı yaşlar farklı da olsa iki objeceyi equals’la karşılatırdığımızda aynı olduğu sonucunu göreceğiz.
Peki method kalabalığını kabul ettik, Java’da bu methodları yazmak çok mu zor, onu da geçtik iyi bir plugin zaten generate ediyor. Ama yeni bir değişken geldiğinde ya da gittiğinde tekrar müdahale etmemiz gerekiyor. Kotlin’de data class olarak tanımladığımızda ise yapmamız gereken herhangi bir şey yok.

Bir diğer çokça kullanılan özellik ise copy. Mesela objeyi klonlayacağız ama sadece bir variable’ın değerini değiştirmek istiyoruz. Basitçe yapabiliriz. Copy’de constructor’a hangi değişkeni verirsek onu update edecek. Java’da clonnable olarak tanımlayıp clone’unu aldıktan sonra değiştirmek istediğimiz değişkeni set etmemiz lazımdı. Biraz daha fazla iş.
Ama şöyle bir sorun da var ne kadar çok öğrenirsek ben kendimi newbie olarak görüyorum şu an ve dilin ne kadar çok özelliğini görürsek o kadar çok rahata alışıyoruz. Sonra old school bir dil kullanmamız gerekirse nasıl yaparız bilmiyorum 😀

Visilibility. Kotlin’de eğer farklı bir takı koymaysanız default olarak tüm değişkenler public’dir. Private ve protected javada alışık olduğumuzdan farklı değil. Internalsa sadece o modül içerisinde visible. Mesela bir sdk yazıyorsunuz. O modül içerisinde public olmasını istediğiniz bir değişkeni internal olarak tanımlayabilirsiniz, dışarıdaki diğer modüllerden görülmüyor olacaktır.

Default arguments. Bu da kotlinin yine kodu çok sadeleştiren ve okunurluğunu arttıran özelliklerinden biri. Bi yerden çağırdığınızda bir alan değişken başka yerden diğeri, bu arttığı noktada sadece parametreleri için yazılmış milyonlarca methoda sebep olabilir.Ha bunu design patternlar aracılılığıya tabi daha temiz de yapabilirsiniz. Ama hiç çaba sarfetmeden temiz bir koda da ulaşmak mümkün görüldüğü gibi.

Sealed classes. Sealed classes da enumların extentionı. Extend eden diğer type olarak kullanılacak classların da aynı dosya içerisinde tanımlanması gerekli. Eğer sınırlı bir set compare edilecekse kullanmak çok avantajlı.

Android projesi özelindeyse birçok yerde kullanılabilir. Network requestinin resultı da buna güzel bir örnek. Normalde nası yapardık. İki farklı obje dönerdik. Instancelarına bakardık ya da iki farklı methodu observe ederdik, hangisine düşerse vs.

Lazy. Güzel bir caching örneği. Bir kere init edilip, sonrasındaki tüm callarda ilk değer kullanılır. Değişmeyecek ve performans kaybına neden olan hesaplamaların kullanımı için çok güzel bir örnek.

lateinit. Biliyorum çok fazla feature için favorim dedim ama bu da gerçekten favorim. Şimdi normalde kotlin eğer optional olarak tanımlamazsak değer atamadan geçmemize izin vermiyor. Ki baya da güzel birşey. Nullsafe yapmış oluyoruz ama tanımladığımız anda değil de o class içerisinde bi yerde mutlaka init edeceğimiz değerler de oluyor. İşte bunlar için de lateinit mükemmel çözüm.

require ve check’in her ikisi de boolean parametre alıyor. Bizim istrue dememizden farkı anlamlı exceptionlar fırlatıyor olmaları. Require illegalArgumentEx, check illegal state

Bir üstteki örnekteki kullanım ise ktx kütüphanesinden bir örnek. Bundle’ı çok basit bir şekilde create etmemizi sağlıyor.

Peki Java’dan Kotlin’i nasıl çağıracağız? Eğer direk ismiyle çağırmak istiyorsak JvmName annotation’ında class name’le aynı bir tanımlamak yapmak yeterli olacak. 

Extention functions. Sona güzel bir feature daha sakladım. Extention function’lar için sanırım dili customize etmemize yarıyor dersem çok da yanlış bir şey demiş olmam. Mesela String’i extend edip bir method daha ekleyebiliriz.

Ve Parcelize. Kendimiz yaptığımızda baş belası ama hep hiç duyulan feature. Yine yakın zamanda release etmiş olan feature’lardan biri.

Referanslar:

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Create a free website or blog at WordPress.com.

Up ↑