ProgramlamaKotlin Geliştirici

Kotlin'da arayüz delegasyonunda 'by' operatörü nasıl çalışır? Arayüz delegasyonu ile özellik delegasyonu arasındaki farklar nelerdir, artıları ve eksileri nelerdir, bir kod örneği verin.

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

Cevap.

by operatörü ile arayüz delegasyonu, bir sınıfın arayüz üzerindeki tüm çağrıları belirli bir vekil nesneye yönlendirmesine olanak tanır. Bu, kodun tekrarını azaltır ve bileşim (composition) desenini uygular.

Örnek:

interface Logger { fun log(message: String) } class ConsoleLogger: Logger { override fun log(message: String) = println("LOG: $message") } class Service(logger: Logger): Logger by logger { fun doWork() { log("Service is working") } } val service = Service(ConsoleLogger()) service.doWork() // LOG: Service is working

Özellik delegasyonundan farklar:

  • Arayüz delegasyonu sınıflara ve arayüzün tüm üyelerine uygulanır.
  • Özellik delegasyonu (val/var x by ...) belirli bir özelliğe uygulanır ve vekil arayüzünü (örneğin, ReadWriteProperty) uygulama gerektirir.
  • Arayüz delegasyonu, uygulamanın kompaktlığını sağlar, ancak vekil arayüzünün tüm API'sini dışarıya açar.

Artıları:

  • Decorator ve delegasyon deseninin uygulanmasını önemli derecede kolaylaştırır.
  • Bileşim yoluyla standart arayüzlerin davranışını değiştirmeye imkan tanır.

Eksileri:

  • Arayüzün tüm yöntemleri her zaman delege edilir, ayrı çağrıları "kesmek" mümkün değildir, açıkça yeniden tanımlama gerektirir.
  • Aynı yöntemlere sahip birden fazla arayüzü miras alırken belirsizlik ortaya çıkabilir.

Yanlış anlamalara dayanan sorular.

Arayüz delegasyonu (by), bir nesneyi alan aracılığıyla arayüzü uygulamaktan nasıl farklıdır?

Cevap: Delegasyon (by ile) otomatik olarak arayüzün tüm yöntemlerini delege nesne üzerinden uygular. Eğer yalnızca delege nesnesini bir alan olarak saklayıp yöntemlerini manuel olarak çağırırsanız, arayüzün her yöntemini elle yazmanız gerekir - bu da tekrar ve hatalara yol açar. Ayrıca, by ile delegasyon daha fazla okunabilirlik ve daha az boilerplate kodu sunar:

// Delegasyon olmadan class Service2(private val logger: Logger): Logger { override fun log(message: String) = logger.log(message) }

Konunun inceliklerini bilmediğiniz için gerçek hata örnekleri:


Hikaye

Projede Logger arayüzü için el ile dekoratör deseni uygulanmaya çalışıldı, arayüze sonradan eklenen bir ek yöntemi uygulamayı unuttular. Proje derlendi ama yeni fonksiyon çalışmadı, çünkü uygulama "boştu". by ile arayüz delegasyonu bu hatanın önüne geçerdi: Tüm yeni yöntemler otomatik olarak delege tarafından uygulanırdı.


Hikaye

by ile arayüz delegasyonunda, geliştirici arayüzün bir yöntemini yeniden tanımladı, ancak diğer yöntemlerin yine de delege üzerinden geçtiğini unuttu. Sonuç olarak, bir kısım fonksiyon "olağan dışı" çalıştı - hata işlevsel iş metotlarında uzun süre yakalanamadı.


Hikaye

by ile çakışan yöntemlere sahip birden fazla arayüz delegasyonu uygulamaya çalıştılar, çakışma oluştu - derleyici belirsizlik hatası vermeye başladı, yoksa proje derlenemedi, tekrarlanan yöntemleri açıkça yeniden tanımlamak zorunda kaldılar.