Soru tarihi:
"Delegasyon" deseni, nesne yönelimli programlamanın birçok dilinde bilinen bir ilkedir, bir nesnenin işini başka bir nesneye aktarma prensibidir. Java’da delegasyon elle gerçekleştirilmektedir — iç alan ve yöntemlerin proxy’lenmesi aracılığıyla. Kotlin’de delegasyon, by anahtar kelimesi aracılığıyla sözdizimi seviyesine alınmıştır.
Problem:
Java'da delegasyon deseninin uygulanması "ilahi" proxy sınıflarına, aşırı şablon kod içeren ve arayüzün korunması için büyük bir çaba gerektiren durumlara yol açmaktadır. Arayüz sözleşmelerinin güncellenmesini sağlamak ve delegeları değiştirmek zorlaşmaktadır.
Çözüm:
Kotlin, bir arayüzü doğrudan uygulamak yerine, tüm yöntemlerini başka bir nesneye devrederek sınıflar oluşturmayı mümkün kılar; örneğin class Foo(...) : MyInterface by delegateObj. Bu, tekrarı ortadan kaldırarak esneklikten ödün vermeden okunabilir kod yazmayı sağlar.
Kod örneği:
interface Base { fun print() } class BaseImpl(val x: Int) : Base { override fun print() = println(x) } class Derived(b: Base) : Base by b fun main() { Derived(BaseImpl(42)).print() // 42 }
Anahtar özellikler:
Delegant sınıf, delegasyona rağmen belirli bir yöntemin davranışını değiştirebilir mi?
Evet — eğer arayüzün yöntemini açıkça delegat sınıfında (Derived) uygularsak, belirli bir yöntemin delegasyonu "geçersiz kılacaktır".
Örnek:
class Derived(b: Base) : Base by b { override fun print() = println("Geçersiz kılındı!") }
Farklı nesnelere birkaç arayüzü aynı anda devretmek mümkün mü?
Hayır, Kotlin’de doğrudan birkaç farklı arayüzü aynı anda farklı nesnelere devretmek mümkün değildir. Manuel delegasyon ile bir sınıf yazmak ya da miras alma ve delegasyonu birleştirmek gerekecek, eğer mimari bunu destekliyorsa.
Delegasyon, yalnızca arayüzlerle mi yoksa soyut sınıflarla da mı çalışır?
Delegasyon yalnızca arayüzler üzerinde mümkündür, soyut sınıflarda değildir — çünkü soyut sınıfların durumları ve korunmuş yöntemleri bulunabilir, bu da by ile delegasyon açıklamasıyla uyumsuzdur.
Geliştirici, büyük bir arayüz için bir dizi yöntemin delegasyon modelini manuel olarak uygular. Arayüz genişledikçe, yeni proxy yöntemlerini eklemeyi unutur. Kod büyür, hatalar çoğalır.
Artılar:
Eksiler:
Arayüz için otomatik delegasyon sağlamak amacıyla by sözdizimi kullanılmıştır. Uygulamayı değiştirmek ve delegayı değiştirmek kolaydır, sözleşmeyi korurken hata yapma riski düşüktür.
Artılar:
Eksiler: