Kotlin’de Kullanmamız Gereken Özellikler ve En Çok Yapılan Hatalar

Merve Tafralı
4 min readMay 18, 2023

--

Herkese merhaba!

Bugün beraber Kotlin’i daha etkili nasıl kullanabiliriz ve nerelere dikkat etmeliyiz konularını inceleyeceğiz.

Öncelikle kullanmamız gereken özellikleri inceleyeceğiz,

1. Extension Function

Kotlin dilinde extension fonksiyonları, bir sınıfın veya bir türün (Int, String vb.) mevcut fonksiyonelitesini genişletmek için kullanılır.

Extension fonksiyonları, var olan bir sınıfın veya veri tipinin işlevselliğini genişletmek için kullanılan önemli bir araçtır. İşlevselliği genişletmek, kod tekrarını azaltabilir, daha açık ve okunaklı kod yazmayı sağlayabilir ve uygulama geliştirme sürecini hızlandırabilir.

Extension fonksiyonları ayrıca, mevcut sınıfların işlevselliğini değiştirmeden yeni özellikler eklemeye olanak tanır. Bu, kodun daha modüler ve yeniden kullanılabilir olmasını sağlar. Örneğin, bir String veri tipine yeni bir özellik eklemek istiyorsanız, extension fonksiyonları kullanarak bu özelliği yazabilirsiniz, böylece var olan String sınıfına bir değişiklik yapmanız gerekmez.

Extension fonksiyonları ayrıca, yazdığınız kodun daha açık ve anlaşılır olmasına da yardımcı olabilir. Özellikle, uzun zincirleme fonksiyon çağrıları içeren kodlarda, extension fonksiyonları kullanarak daha okunaklı ve anlaşılır kodlar yazabilirsiniz.

Sonuç olarak, extension fonksiyonları kod tekrarını azaltır, kodun yeniden kullanılabilirliğini artırır ve daha açık ve okunaklı kod yazmanıza yardımcı olur.

Örnek olarak, aşağıdaki kodda, “hello world” String’i için bir extension fonksiyonu yazılım ve bu fonksiyon tüm kelimelerin ilk harfini büyük harfe dönüştürüyor:

fun String.toTitleCase(): String {
return split(" ").joinToString(" ") { it.capitalize() }
}

Bu extension fonksiyonu kullanarak, “hello world” string’imizi büyük harflerle yazdırabiliriz:

val helloWorld = "hello world"
val titleCase = helloWorld.toTitleCase()
println(titleCase) // Output: Hello World

2. Sealed Classes

Kotlin’deki sealed classes, belirli bir sınıf hiyerarşisinde sınırlı sayıda alt sınıfın oluşturulmasına izin veren bir sınıf türüdür. Bu alt sınıflar, sealed class içinde tanımlanır ve genellikle örüntü eşleme (pattern matching) gibi durumlarda kullanılır.

Bir örnek vermek gerekirse, bir dizi şekil nesnesi düşünelim. Şekil sınıfı, alt sınıflar olarak Daire, Kare ve Üçgen şekillerini içerebilir. Ancak, başka şekil türleri eklenmesini engellemek için, şekil sınıfını sealed class olarak tanımlayabiliriz.

sealed class Sekil

class Daire(val yaricap: Double) : Sekil()
class Kare(val kenarUzunlugu: Double) : Sekil()
class Ucgen(val taban: Double, val yukseklik: Double) : Sekil()

Yukarıdaki örnekte, Sekil sınıfı sealed class olarak tanımlanır ve alt sınıfları Daire, Kare ve Üçgen şekillerini içerir. Bu şekilde, başka bir geliştiricinin yanlışlıkla yeni bir şekil türü eklemesi engellenir.

Sealed class’lar ayrıca, örüntü eşleme gibi durumlarda kullanılabilir. Örneğin, yukarıdaki şekillerden herhangi birinin alanını hesaplayan bir fonksiyon yazalım:

fun hesaplaAlan(sekil: Sekil): Double {
return when (sekil) {
is Daire -> Math.PI * sekil.yaricap * sekil.yaricap
is Kare -> sekil.kenarUzunlugu * sekil.kenarUzunlugu
is Ucgen -> 0.5 * sekil.taban * sekil.yukseklik
}
}

Yukarıdaki kodda, when ifadesi kullanılarak, sealed class alt sınıfları eşlenir ve her alt sınıf için ayrı bir işlem yapılır. Bu örnekte, farklı şekil türlerinin alanlarının hesaplanmasını sağlamak için sealed class kullanıldı.

Sonuç olarak, sealed classes, belirli bir sınıf hiyerarşisinde sınırlı sayıda alt sınıfın oluşturulmasına izin veren bir sınıf türüdür. Bu alt sınıfların kullanımı, yanlışlıkla yeni alt sınıfların eklenmesini önlemeye yardımcı olur ve örüntü eşleme gibi durumlarda kullanılabilir.

3. High-Order Functions

Kotlin’de higher-order functions, diğer fonksiyonları parametre olarak alan veya başka bir fonksiyonu döndüren fonksiyonlardır. Bu, kodun daha modüler ve yeniden kullanılabilir olmasını sağlar.

Higher-order functions, özellikle Lambda Expressions (Anonim Fonksiyonlar) ile birlikte kullanıldığında oldukça güçlüdür. Lambda Expressions, bir fonksiyonu tanımlamak yerine, kod bloklarını bir değer olarak tanımlamanızı sağlar.

Örneğin, aşağıdaki higher-order fonksiyon, bir lambda ifadesi alır ve iki tamsayı parametresi olan bir fonksiyon döndürür:

fun toplamaFonksiyonu(): (Int, Int) -> Int {
return { a, b -> a + b }
}

Yukarıdaki kodda, toplamaFonksiyonu() higher-order fonksiyonu, bir lambda ifadesi döndürür. Bu lambda ifadesi, iki tamsayı parametresi alan ve toplama işlemini gerçekleştiren bir fonksiyondur.

Higher-order fonksiyonlar ayrıca, örneğin filtreleme veya sıralama gibi işlemleri yapmak için kullanılabilir. Örneğin, aşağıdaki higher-order fonksiyon, bir koleksiyonu ve bir lamba ifadesi alır ve lamba ifadesinin şartını sağlayan elemanları içeren yeni bir koleksiyon döndürür:

fun filtrelemeFonksiyonu(koleksiyon: List<Int>, sart: (Int) -> Boolean): List<Int> {
val sonuc = mutableListOf<Int>()
for (eleman in koleksiyon) {
if (sart(eleman)) {
sonuc.add(eleman)
}
}
return sonuc
}

Yukarıdaki kodda, filtrelemeFonksiyonu() higher-order fonksiyonu, bir koleksiyon ve bir lamba ifadesi alır. Lamba ifadesi, koleksiyondaki her elemanın şartını kontrol eder ve şartı sağlayan elemanları yeni bir koleksiyona ekler. Bu örnekte, higher-order fonksiyon kullanılarak, farklı şartlara göre filtrelenmiş bir koleksiyon elde edilir.

Higher-order fonksiyonlar, daha modüler ve yeniden kullanılabilir kod yazmanızı sağlar. Lambda ifadeleri ile birlikte kullanıldığında, özellikle filtreleme veya sıralama gibi işlemler için oldukça kullanışlıdırlar.

4. Type Aliases

Kotlin’de type aliases, var olan bir veri tipine alternatif bir isim vermenizi sağlayan bir özelliktir. Bu sayede kodun daha okunaklı ve anlaşılır hale gelmesini sağlar.

Type aliases, özellikle uzun ve karmaşık veri tiplerinin kullanıldığı durumlarda yararlıdır. Örneğin, aşağıdaki örnek, “Map<String, Map<String, Int>>” yerine “JsonData” adında bir type alias kullanır:

typealias JsonData = Map<String, Map<String, Int>>

fun parseJson(json: String): JsonData {
// Json verisini parse etmek için gereken kodlar
}

Yukarıdaki kodda, “JsonData” adında bir type alias tanımlanmıştır. Bu type alias, “Map<String, Map<String, Int>>” veri tipine eşdeğerdir. Daha sonra, “parseJson” fonksiyonu bu type alias kullanarak bir JSON verisini parse eder. Bu sayede, kod daha okunaklı ve anlaşılır hale gelir.

Son olarak Kotlin’de hayat kurtaran default extensionslardan bahsetmek istiyorum.

Kotlin’de default extension fonksiyonları, bir sınıfa özgü olmayan fonksiyonlardır. Bu fonksiyonlar, Kotlin standard kütüphanesinde yer almaktadır ve birçok farklı veri tipi için kullanılabilirler. Buradaki linkten methodları inceleyerek kod yazarken zaman kazanabiliriz :)

Single, first, last, filter, map, let, apply , with ve take gibi kod yazarken okunurluğu ve zaman kazamanı attıracak methodları kullanmayı alışkanlık haline getirmeliyiz.

Bir sonra ki yazımız da sık yapılan hataları inceleyeceğiz :)

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

No responses yet

Write a response