Vurucu giriş fotoğrafı

Kotlin’e geçiş

You can check english version from here:

Merhaba,

Bu platformdaki ilk storyim olacak, biraz acemi ve heyacanlı gelebilir okuyanlar için, şimdiden özür diliyorum :)

Google IO 17'ye kadar herhangi bir Android projesine başlayacak olsam ya da varolan projeye yeni bir şeyler ekleyecek olsaydım Java’yı tercih ederdim, fakat artık odak noktam Kotlin üzerinde.

Sizlere öğrenmeniz gereken yeni dilin neden Kotlin olması gerektiğini anlatmaya çalışacağım, yavaşça başlayalım.

İlk kez karşılaşanlar için tanımlamak gerekirse Kotlin static typed bir yazılım dilidir. JetBrains tarafından geliştirilmiştir ki aynı zamanda Intellij ve ReSharper diye bildiğimiz IDE ve eklentinin de geliştiricisidir. JVM (Java Virtual Machine), (iOS???), Android ve front-end uygulama geliştirmelerinde kullanılabilir. Ben anlatımımda Java ve Kotlin üzerine yoğunlaşacağım. Biraz daha içine girebilmek için birkaç başlık ile inceleyelim:

  • Az ama öz — Concise
  • Güvenli — Safe
  • Çok yönlü — Versatile
  • Birlikte çalışabilir — Interoperable

Az ama öz — Concise

Boilerplate kod dediğimiz, geliştirme esnasında yazmak zorunda olduğumuz copy/paste edilebilir kodlara çoğumuz aşinayız. Örnek olarak Java’da encapsulator metotlar verilebilir (getter/setter). Günümüz gelişmiş IDE’leri bu kodların çoğunu otomatik oluşturabiliyor, fakat yine de bizim yazmak zorunda kaldığımız ve bunaltıcı bloklar olabiliyor.

Boilerplate kodu minimale indirgemek çoğu yazılımcının nihai isteğidir diyebiliriz, Java için Kotlin de bunu sağlamayı amaçlıyor. Aslında sadece Java için değil genel bir yazılım dili olarak yazılması zorunlu kodu minimize tutuyor.

Yakın bir örnekle bahsettiğim durumu inceleyelim:

  • Java koduyla binlerce örnekte kullanılan User sınıfını tanımlıyorum:
public final class User {
@NotNull
private final
String name;
private final int age;

User(@NotNull String name, int age) {
super();
if (name == null) {
throw new RuntimeException("Name can't be null");
}
this.name = name;
this.age = age;
}
@NotNull
public final String getName() {
return this.name;
}
public final int getAge() {
return this.age;
}
public int hashCode() {
return "User(name=" + this.name + ", age=" + this.age + ")";
}
public boolean equals(Object otherObject) {
if(this != otherObject) {
if(otherObject instanceof User) {
User otherUser = (User) otherObject;
return this.name.equals(otherUser.name)
&& this.age == otherUser.age;
}
return false;
} else {
return true;
}
}
}

Bir data objesi oluşturabilecek neredeyse bütün özellikleri taşıyor bu sınıf ve 36 satır aldı tanımlamamız.

  • Kotlin ile aynı sınıfı tanımladığımızda:
data class User(val name: String, var age:Int)

Tek satırla bu işlemi gerçekleştirebiliyoruz, “data class” tipi Java’da kullanılan sınıfın bütün encapsulator, hashCode ve equals metotlarını içerisinde bulunduruyor.


Güvenli — Safe

Kotlin’in bir yazılım dili olarak nasıl güvenli/oluşabilecek hatalardan uzak olduğundan bahsetmeden önce birkaç açıklamada bulunmak istiyorum.

  • The Billion $ Mistake: Null referans kavramını hayatımıza 1965’te nesne yönelimli programlama ile uğraşırken sokan Tony Hoare 2009 yılında bir geliştirmeyi yaparken tanımlanacak bütün referansların güvenli olmasını sağlamak için implement etmesi çok kolay olduğu için null referansı yerleştiriyor. Bunu da sonrasında yaşattığı streslere ve hüzünlere ithafen milyon dolarlık hata olarak tanımlıyor ve özürlerine ekliyor.

NullPointerException olarak bildiğimiz baş belası hatadan bahsedeyim. Bu hatayı bir objenin olmayan/null bir referansına erişmeye çalıştığımızda alıyoruz ve çoğumuzu çileden çıkaran bir durum. Bilinen ve kullanılan çoğu dilde bu durum karşımıza bir objenin ya da metodun tanımlanmamış/silinmiş artık null olan bir referansına erişmek istediğimizde hata olarak fırlatılıyor.

Kotlin bunun önüne geçmek için referansları null olabilir ve olamaz ayrımlarıyla bölüyor. Fakat tabii ki Kotlin için tamamen null-safe o zaman demek hatalı kaçıyor bu durumda.

Not: Swift kodlama dilinden bilinen “unwrapping (?) of optional” özelliğine benzer Kotlin’de nullable için soru işareti (?) ve non-null tanımlar için iki ünlem işareti (!!) kullanılır.
Bu ayrım tamamen bizim tarafımızdan sağlanır, eğer bir değerin kesinlikle null gelmeyeceğini biliyorsak bunu non-null tanımlayabilir, öbür taraftan beklediğimiz bir değerin her zaman dolu geleceğinden emin değilsek bunu nullable tanımlayabiliriz.

var/val tanımlarında Kotlin compile time’da müdahale ederek olası null hatalarını engellemiş oluyor, şu örnekle inceleyebiliriz:

var s: String = "wow"
s = null // compile error

var h: String? = "hots"
h = null // no problem
val i = h.length        // compile error: b might be null

Tabii böyle bir engel kullanışsız gözükebilir, fakat Kotlin’in typed bir program dili olması sayesinde gelen bir özellik olan smart cast ile aşağıdaki şekilde nullable bir tipi non-null olacak şekilde cast edebiliriz.

if (h == null) return
val i = h.length // no problem

Ayrıca üstteki örneğe bir benzer yaklaşım ile safe call (?.) da kullanabiliriz.

val i = h?.length       // type of i is nullable Int

Bahsedilen safe call aynı zamanda iç içe geçmiş if-not-null kontrollerini egale etmek için de kullanılabilir.

Basitçe örnek vermek gerekirse bir null referansa erişimi engellemek için yaptığımız kontrol Java’da aşağıdaki şekilde:

private String getInnerInnerString() {
if(this.object != null && this.object.innerObject != null
&& this.innerObject.innerInnerString != null) {
return this.innerObject.innerInnerString;
}
return "player_unknown_battleground";
}

Kotlin ile bu örneği aşağıdaki şekilde indirgiriyoruz:

fun getInnerInnerObject():String? {
return this?.object?.innerObject?.innerInnerString ?: "player_unknown_battleground"
}

Üstteki örnekte “innerInnerString” değerine erişene kadar herhangi bir değer null ise Kotlin direkt “unknown” değerini döndürecek ve NPE önlenmiş olacak.

Bunların haricinde diyelim ki non-null bir objeye erişmeniz/tanımlamanız ve erişilemiyorsa hata fırlatmanız gerekiyor, o zaman aşağıdaki yaklaşımları izleyebilirsiniz:

val i = h?.length ?: throw NullPointerException()
val i = h!!.length

Çok yönlü — Versatile

Güvenli olması konusunda çok fazla Java ile karşılaştırma yapıp kodun içine daldım :)

Geri toparlama amacıyla Kotlin JVM ve Android haricine değinelim biraz.

Günümüzde ve yakın zamanda geliştirilen bir çok dil platform bağımlılığından uzak, global bir yapıda ve açık kaynaklı karşımıza geliyor. Örneğin Swift bir yandan iOS ile uygulama geliştirmede primary yazılım dili olmaya çabalarken bir yandan da backend (IBM’s Kitura) olarak kullanılabilecek bir dil olduğunu kanıtlıyor.

Kotlin bu çeşitlilik ve platform bağımsızlığı konusunda dörde ayrılmış durumda:

Kotlin kullanarak iOS platformuna uygulama geliştirmek de mümkün. Fakat teoirede kanıtlanmış olarak mümkün, tamamen Kotlin ile diyemeyiz buna daha çok bir hack tadında. 👀


Birlikte çalışabilir — Interoperable

Buradaki türkçe karşılık her ne kadar hoşuma gitmese de açıklamaya şu şekilde dökebiliriz; Interoperable olması demek Java ile yazılmış her şeyin kullanılabilir veya Kotlin ile birlikte derlenebilir olması anlamına geliyor.

Dile adaptasyonu maksimize eden bir kolaylık bu aslında; yani kısaca Java ile yazdığınız her şeyi Kotlin ile yazabilirsiniz, Kotlin ile nasıl yazacağınızı bilmiyorsanız Java ile yazıp Kotline çevirebilirsiniz ve nasıl yazıldığını rahatlıkla öğrenebilirsiniz.


Kotlin comes from industry, not academia. It solves problems faced by working programmers today.

Hafiften toparlarken Kotlin’i biraz daha öveceğim :)

Kotlin akademik çerçevede yazılmış bir yazılım dili değil, bizim gibi sektörün içinde olan ve karşılaştığımız her zorluğu görmüş bir endüstri ürünü.

Kotlin öğrenmeye başlamak için bir şeylerden vazgeçmek ya da bir ücret ödemek zorunda değilsiniz, açık kaynaklı bir yazılım dili. 🆓 💪

Hepsinden öte kaliteli bir Java-Kotlin çeviriciye sahip.

Java için bir projede kullandığım 1000+ satırlık kompleks bir Util sınıfını bile herhangi bir hata vermeksizin çevirebilen bir kalitede. 😱😱😱

İlginizi çekebilecek ve bana bu içeriği oluşturmamda yardımcı olan diğer story linkleri:

Like what you read? Give Canberk Ozcelik a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.