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}45val 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 == 02fun Int.isOdd(): Boolean = this % 2!= 03fun Int.double(): Int = this * 24fun Int.triple(): Int = this * 3Bir 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:
1fun String.toUser(): User {2val parts = this.split(",")3return User(parts[0], parts[1].toInt())4}56val userData = "Ali,30"7val user = userData.toUser()8println(user.name) // AliBurada 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 null23val numbers = listOf(1, 2, 3)4println(numbers.second()) // 2Bu 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.
0 yorum