Kotlin Extension Function Yanlış Kullanımı: Okunabilirliği Bozma Tuzakları

Kotlin'in extension fonksiyonları kodu temiz görünmesini sağlar, ama sınırını aşarsanız bir kaosa dönüşür. Sorun şu: her şeye extension yazabildiğin için, yazmamalı olduğun yerlerde de yazarsın.

En yaygın tuzak, iş mantığını extension'a gömüp, kodun nereden geldiğini kaybetmektir. Bir örnek:

1fun String.isValidEmail(): Boolean {
2return this.contains("@") && this.contains(".")
3}
4
5val email = "user@example.com"
6if (email.isValidEmail()) {
7println("Geçerli email")
8}

Bu basit görünse de, bir başka dosyadan bakan birisi isValidEmail()'in nereden geldiğini hemen anlamaz. IDE'de git tanımına tıklarsa bulur ama akış kırılır.

İkinci tuzak, standart sınıflara çok fazla extension yazmaktır. Mesela:

1fun Int.isEven(): Boolean = this % 2 == 0
2fun Int.isOdd(): Boolean = this % 2!= 0
3fun Int.double(): Int = this * 2
4fun Int.triple(): Int = this * 3

Bir kaç tane iyidir, ama yüzlerce extension yazarsan, başka bir geliştiricinin 5.someFunction() gördüğünde ne yaptığını bilmesi zorlaşır.

Üçüncü hata, extension'ları domain-spesifik olmayan yerlerde kullanmaktır. Mesela bir API cevabını parse eden extension:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1fun String.toUser(): User {
2val parts = this.split(",")
3return User(parts[0], parts[1].toInt())
4}
5
6val userData = "Ali,30"
7val user = userData.toUser()
8println(user.name) // Ali

Burada String sınıfının toUser() methodu olması mantıksızdır. Bunun yerine bir UserParser sınıfı ya da User.fromString() companion function daha açıktır.

Doğru kullanım şu:

  • Extension'lar utility işleri için: List.isEmpty() gibi.
  • DSL oluştururken: lambda receiver'lar ile.
  • Domain modeline ait, açık amaçlı işlemler için.

Bir iyi örnek:

1fun <T> List<T>.second(): T? = if (this.size > 1) this[1] else null
2
3val numbers = listOf(1, 2, 3)
4println(numbers.second()) // 2

Bu açık, güvenli ve yeniden kullanılabilir.

Kodu okuyan biri, extension fonksiyonların tanımını hemen bulabilmelidir. Eğer gizli kalırsa, extension'u yazma.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz