DEV Community

Mehmet
Mehmet

Posted on • Edited on

DEPENDENCY INJECTİON VE DELEGASYON (DELEGATİON)

Dependency injection ve delegasyon ikisi de başka bir sınıf ile işlerini gerçekleştiriyorlar. Peki aralarında ki fark ne?

Avam lisanıyla anlatayım.

DEPENDENCY INJECTİON:
Kısaca sınıf içerisinde sınıf tanımlamamaya denir.

Dependency injection bunu yapma diyor.

//YANLIŞ BUNU YAPMA
class Araba{
   class Motor{}    
}
Enter fullscreen mode Exit fullscreen mode

Ana sınıf için başka bir sınıf gerekli ise yani ana sınıf başka bir sınıfa bağımlı ise yani ana sınıf o başka sınıf olmadan görevlerini yerine getiremiyor ise,

  • yeni bir sınıf tanımla,
  • tanımladığın bu sınıftan bir nesne üret,
  • ana sınıfa bu nesneyi property (özellik, değişken, sınıf değişkeni, variable ne derseniz) olarak,
  • constructor injection, setter injection, interface injection veya dagger (dagger hilt), koin gibi framework yöntemlerinden biriyle sınıfa dahil et.

İşte buna dependency injection diyorlar.

Peki nasıl yapacağız?

//BUNU YAPACAĞIZ
//Kotlin ile yazıldı

//Motor sınıfı
class Motor{ }

//Araba sınıfı
class Araba(var motor: Motor){ } //constructor injection yöntemi

//Main fonksiyonu
fun main( ) {
   val motor = Motor()
   val araba = Araba(motor)
}   
Enter fullscreen mode Exit fullscreen mode

Örnek: Araba üretiyoruz, arabanın içerisinde motor olması lazım. Ancak motoru biz araba fabrikamızda üretmiyoruz, dışarıdan alıp arabamıza monte ediyoruz.

Bu örneği kodlama lisanıyla anlatacak olursak;
Araba sınıfımız var, bu sınıf içerisinde bir motor sınıfı yazıp motor nesnesi oluşturmuyoruz. Dışarıda bir Motor sınıfı oluşturup bu oluşturduğumuz sınıftan motor nesnesini araba sınıfımıza yukarıda bahsettiğim yöntemlerden birisi ile property olarak dahil ediyoruz.

Burada dikkat edilecek hususlar;

  • Motor arabaya dışarıdan veriliyor (enjekte ediliyor).
  • Araba sınıfı motorun nasıl üretildiğini bilmek zorunda değil.

Örneğimizi koda dökersek;

// Kotlin ile yazıldı

// Motor sınıfı
class Motor {
    fun calistir() {
        println("Motor çalışıyor")
    }
}

// Araba sınıfı - Dependency Injection ile motor ekliyoruz
class Araba(val motor: Motor) { //constructor injection yöntemi
    fun sur() {
        motor.calistir()
        println("Araba hareket ediyor")
    }
}

// Main fonksiyonu
fun main() {
    // Motor nesnesini dışarıda oluşturup arabaya monte ediyoruz
    val motor = Motor()
    val araba = Araba(motor)

// Araba sürme işlemi
araba.sur()
}

/*
Çıktı:
Motor çalışıyor
Araba hareket ediyor
*/
Enter fullscreen mode Exit fullscreen mode

DELEGASYON:
Sınıfımızda olması gereken bir işlevi (fonksiyonu) sınıfımız içinde tanımlamayıp onu başka bir sınıfa (başka sınıfın fonksiyonuna) yaptırıyoruz yani işimizi devrediyoruz.

Örnek: Kamyonetimiz ile bir yükü A noktasından B noktasına taşımamız gerekiyor. Bu işi biz yapmıyoruz, bir şoför tutup kamyoneti sürme işlevini şoföre yaptırıyoruz.

Bu örneği kodlama lisanıyla anlatacak olursak;
Kamyonet sınıfımız var ve bu sınıf içerisinde "tasima" fonksiyonu olması lazım, ama biz Kamyonet sınıfımız içerisinde tasima fonksiyonu tanımlamıyoruz. Var olan "Tasima" sınıfının "yukTasi" fonksiyonuna bu işi yaptırıyoruz.

Burada dikkat edilecek hususlar;

  • Kontrol hala bizde yük taşıma işi bizim işimiz,
  • Ama işi yapan başka biri, şoför.

Örneğimizi koda dökersek;

// Kotlin ile yazıldı

// Tasima sınıfı
class Tasima {
    fun yukTasi() {
        println("Yük taşınıyor")
    }
}

// Kamyonet sınıfı - Delegasyon kullanarak taşımayı başka sınıfa yaptırıyoruz
class Kamyonet(val tasima: Tasima) {
    }

// Main fonksiyonu
fun main() {
    // Taşıma sınıfını oluşturup Kamyonet'e devrediyoruz
    val tasima = Tasima()
    val kamyonet = Kamyonet(tasima)
    // Yük taşıma işlemi
    kamyonet.tasima.yukTasi()
}
/*
Çıktı:
Yük taşınıyor
*/
Enter fullscreen mode Exit fullscreen mode

"by" Anahtar Kelimesi
Kotlin'de delegasyon, by anahtar kelimesi ile gerçekleştirilir. Bir sınıf, başka bir sınıfın davranışlarını devralmak için by ifadesini kullanarak bir delegasyon örneği oluşturur. Örneğin:

interface Tasima {
    fun tasi()
}

class Kamyon : Tasima {
    override fun tasi() {
        println("Kamyon ile taşıma yapılıyor")
    }
}

class Surucu(private val tasima: Tasima) : Tasima by tasima 

fun main() {
    val surucu = Surucu(Kamyon())
    surucu.tasi() //Çıktı: Kamyon ile taşıma yapılıyor
}
Enter fullscreen mode Exit fullscreen mode

Özetle;

  1. Dependency Injection da nesnelerin birbirine olan bağımlılıklarını
    yönetmek için ana sınıf içerisinde yeni bir sınıf tanımlanmamakta,
    başka bir sınıfın nesnesi, ana sınıfa property (sınıf değişkeni)
    olarak alınmakta,
    Delegasyon da ise bir işlev bir fonksiyon başka bir sınıfa
    yaptırılmakta.

  2. Dışarıdan başka bir sınıfın property'sine ihtiyaç var ise dependency
    injection
    ,
    dışarıdan başka bir sınıfın fonksiyonuna ihtiyaç var ise
    delegasyon.

  3. Dependency Injection, bir sınıfın ihtiyaç duyduğu nesneleri
    dışarıdan alması;
    Delegasyon kendisine lazım olan ama kendinde olmayan bir işlevi
    (fonksiyonu) başka bir sınıfa yaptırmasıdır.

  4. Kotlinde delegasyon "by" anahtar kelimesi ile yapılır

Sağlıcakla kalın…

Top comments (0)