ProgramlamaKotlin geliştiricisi, Android geliştiricisi, Backend geliştiricisi

Kotlin'de destructuring declarations nedir? Nasıl çalışırlar, nasıl bildirip kullanılırlar, hangi durumlarda gereklidirler ve hangi kısıtlamalar vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • Anlaşmaya göre çalışır: component1, component2 vb. metodların varlığı
  • Destructuring, data class, Pair, Triple, koleksiyonlar ve manuel olarak componentN uygulayan kullanıcı sınıflarında desteklenir
  • For döngüsünde, bir fonksiyondan dönüş yaparken, when/if içinde ve lambdalar içerisinde doğrudan destructuring yapılabilir.

Kandırmaca Soruları.

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()

Tipik hatalar ve anti-paternler

  • ComponentN olmayan sıradan bir sınıfı destructuring yapma girişimi
  • Destructuring ile açıkça adlandırılmış parametrelerin birleştirilmesi; bu okuma kolaylığını azaltır
  • Destructuring'in, özelliklere açıkça erişmenin daha iyi olduğu yerlerde kullanılması

Gerçekten bir örnek

Olumsuz durum

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ı:

  • Hızlı ve özlü
  • İki/üç değer işleme yaparken daha az kod

Eksileri:

  • Bakımı zor: alanların sırası kritiktir, yapıcı değişti — sorun
  • Yeniden yapılandırma tehlikeli, hatalar gizli olarak ortaya çıkar

Olumlu durum

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ı:

  • Özlü kayıt
  • Okuma daha kolay

Eksileri:

  • Karmaşık yapılarda kod yine de daha az okunabilir hale gelir