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{}
}
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)
}
Ö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
*/
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
*/
"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
}
Özetle;
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.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.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.Kotlinde delegasyon "by" anahtar kelimesi ile yapılır
Sağlıcakla kalın…
Top comments (0)