Makus Bağımlılık Prensibi

Merhabalar,

Bugün sizlerle Makus Bağımlılık Prensibini(Dependency Inversion Principle) öğreneceğiz. Hazırsanız zaman kaybetmeden başlayalım 🙂

Yazılım uygulamalarını tasarlarken alt düzey sınıfları, temel ve birincil işlemleri ve üst seviye sınıfları karmaşık iş mantığı kapsayan sınıflar olarak düşünülmelidir. Gerçek anlamda yapılacak işler alt seviye sınıflarına yaptırılmalıdır. Bu tür yapıları uygulamak için doğal bir yol, alt seviye sınıfları yazmak ve karmaşık üst seviyeye sınıflar ile tasarım yapmakla olur. Üst seviye sınıflar başkaları tarafından tanımlandığından bunu yapmak mantıklı bir yol gibi görünür. Fakat bu esnek bir tasarım değildir. Alt seviye bir sınıf değiştirilmek istenirse yapılacaklar değişime kapalı olacaktır.

Klavyeden karakter okuyan ve bunları yazıcıya yazan bir kopyalama modülünü ele alalım. İş mantığı içeren üst seviye sınıf Copy sınıfıdır. Alt seviye sınıfları KeyboardReader ve PrinterWriter’dir.

Kötü bir tasarımda üst seviye sınıf doğrudan alt sınıfları kullanır ve alt seviyeli sınıflara büyük ölçüde bağlıdır. Böyle durumda, çıktıyı yeni bir FileWriter sınıfına yönlendirecek şekilde tasarım bir değiştirmek isteniyorsa, Copy sınıfında değişiklikler yapılması gerekir.

Bunun gibi problemlerden kaçınmak için üst seviye sınıflar ile alt seviye sınıflar arasında bir soyutlama katmanı oluşturulabilir. Üst seviye modüller karmaşık mantık içerdiklerinden, alt seviyeli modüllere bağımlı olmamalı, böylece yeni soyutlama katmanı alt seviyeli modüllere bağımlı olarak oluşturulmamalıdır. Alt seviyeli modüller, soyutlama katmanına dayalı olarak oluşturulmalıdır.

Makus Bağımlılık Prensibi (Dependency Inversion Principle)

Üst seviye modüller alt düzey modüllere bağlı olmamalıdır. Her ikiside soyutlamalara bağımlı olmalıdır. Soyutlamalar ayrıntılara dayanmamalıdır. Ayrıntılar soyutlamalara bağlı olmalıdır.

Aşağıda, Makus Bağımlılık Prensibini destekleyecek şekilde geliştirilen kod yapısı bulunmaktadır. Bu tasarımda IWorker arayüzü aracılığıyla yeni bir soyutlama katmanı eklenmiştir. SuperWorkers sınıfı tasarıma eklendiğinde Manager sınıfına ilave bir değişiklik gerekmeyecektir. Manager sınıfında mevcut olan eski işlevselliği etkilemek için risk en aza indirgendiğinden değişikliğe gerek kalmamıştır. Manager sınıfı için birim test varsa onunda tekrar yazılmasına gerek kalmamıştır.

public interface IWorker {

    public void work();
}
public class Worker implements IWorker{

    @Override
    public void work() {

    }
}
public class SuperWorker implements IWorker{

    @Override
    public void work() {
        
    }
}
public class Manager {

    private IWorker worker;

    public void setWorker(IWorker worker) {
        this.worker = worker;
    }

    public void manage(){

        worker.work();
    }
}

Bu ilke uygulandığında üst seviye sınıflar doğrudan alt seviye sınıflarını bilmezler, ara yüzleri soyut katman olarak kullanırlar. Bu durumda, üst seviye sınıflardaki yeni alt seviyeli nesnelerin oluşturulması new operatörü kullanarak gerçekleştirilmez. 

Makus Bağımlılık Prensibi, her sınıf veya her modül için körü körüne uygulanmamalıdır. Gelecekte değişmeden kalması muhtemel bir sınıfımız var ise, bu ilkeyi veya başka bir ilkeyi uygulamaya hiç gerek yoktur.

Evet Arkadaşlar, Makus Bağımlılık Prensibi nedir ondan bahsettik ve örnek yaptık. Bir sonraki yazıda görüşmek üzere 🙂 Kendinize iyi bakın.

Not : Bu blog yazısı Yahya Şirin‘in ders notlarından yararlanılarak yazılmıştır.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir