ProgramlamaBackend geliştirici

Kotlin'de delegation pattern nedir ve dil kullanarak nesneler arasında davranışı nasıl devredebiliriz?

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

Cevap

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:

  • Arayüz yöntemlerinin deklaratif delegasyonu
  • Şablon kodun azaltılması
  • Delegasyon mantığının esnek değiştirilmesi ve uygulamanın değiştirilmesi

Kandırmaca sorular.

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.

Tipik hatalar ve anti-desainler

  • Soyut sınıflar için delegasyonu kullanma isteği (derleyici buna izin vermez)
  • Tek sınıf aracılığıyla çoklu delegasyon denemeleri
  • Karmaşık üretim kodunda genişletilebilirliğin göz ardı edilmesi

Gerçek hayat örneği

Olumsuz durum

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:

  • Her delegasyon mantığı üzerinde net kontrol

Eksiler:

  • Sınıf aşırı yüklenmesi
  • Bakım pahalıya mal oluyor

Olumlu durum

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:

  • Hızlı entegrasyon ve delege değiştirme
  • Daha az kod, daha az hata

Eksiler:

  • Sadece arayüzlerle sınırlama
  • Delegat sınıfındaki yöntemi geçersiz kılarken öngörülemeyen sonuçlar olabilir