Sorunun Tarihi: Kotlin, başlangıcından itibaren nesnelerden, koleksiyonlardan, fonksiyonların döndürdüğü verilere kolayca değer çıkarmayı sağlayan «destructuring» mekanizmasını desteklemektedir. Bu mekanizma, Scala ve JavaScript gibi dilleri ilham alarak geliştirilmiştir (ES6 destructuring).
Sorun: Klasik OOP dillerinde bir nesnenin birden fazla özelliğini çıkarmak için ya her bir alana açıkça erişmek ya da ara yapılar kullanmak gerekiyordu, bu da laf kalabalığı yaratıyordu. Özellikle döngülerde, Map'ten çiftleri işlerken ya da data class ile çalışırken bu oldukça rahatsız ediciydi.
Çözüm: Destructuring declarations, bir nesneden değerleri tek bir satırda birkaç değişken olarak tanımlayıp atamaya olanak tanır; bu, sınıfların bileşen fonksiyonları (componentN) uygulaması sayesinde olmuştur.
Kod örneği:
data class Person(val name: String, val age: Int) val (n, a) = Person("Alex", 25) println("Ad: $n, Yaş: $a") // Ad: Alex, Yaş: 25 val map = mapOf(1 to "a", 2 to "b") for ((key, value) in map) println("$key = $value")
Anahtar özellikler:
Herhangi bir sınıfı destructuring yapabilir miyiz?
Hayır. componentN metodlarının olması şarttır. Data class ve standart çiftler/üçlüler bunları zaten içerir. Normal sınıflar için manuel olarak eklenebilir.
Örnek:
class Point(val x: Int, val y: Int) { operator fun component1() = x operator fun component2() = y } val (cx, cy) = Point(5, 10)
Daha az componentN olan bir nesneyi destructuring yapmaya çalışırsak ne olur?
Derleyici, sahip olduğu componentN'den daha fazla değişken bildirmeye çalışırsanız hata verir:
data class OnlyX(val x: Int) val (x, y) = OnlyX(5) // Hata! component2() yok
Fonksiyonda dönen değeri destructuring yapmak mümkün mü?
Evet! Fonksiyonlar bir çift (Pair), üçlü (Triple) veya data class döndürebilir – destructuring bunu destekler:
fun coords() = Pair(1, 2) val (x, y) = coords()
Bir fonksiyona beş alana sahip bir data class gönderilir; destructuring beş değişkenle kullanılır. Zamanla bir alan eklenirse — desen tüm analiz mantığını gözden geçirmeyi gerektirir, bazı yerlerde kullanılmayan değişkenler ortaya çıkar.
Artıları:
Eksileri:
Destructuring yalnızca 2-3 alana sahip data class için (örneğin, x, y koordinatları) veya yapı kesinlikle sabit olduğu sürece bir haritayı (map) döngüyle işlerken kullanılır.
Artıları:
Eksileri: