5-Dependency Inversion Principle (Solid Principle)

Özetler DIP, class’lar arasındaki bağımlılığı hiyerarşik olarak yönetip türayen(alt sınıf) sınıflarda yapılan değişikliğin türetilen(üst sınıf) sınıflarda değişikliğe maruz bırakmamasını sağlamaktır. DIP’e göre sınıflar arasındaki bağımlılık olabildiğince az seviyede olmalıdır.

Dependency Inversion PRinciple’ye göre:

  • Üst seviye sınıflar, alt seviye sınıflara bağlı olmamalıdır, ilişki abstraction veya interface kullanarak sağlanmalıdır.
  • Abstraction(soyutlama) detaylara bağlı olmamalıdır, tam tersi detaylar abstraction’lara bağlı olmalıdır.
  • Hiyerarşideki sınıfları soyut kavramlar üzerinden yönetilmelidir. Üst ve alt sınıflar arasında soyutlama katmanı oluşturmalıyız.

Farklı bir özetle, sınıflar arasındaki bağımlık olabildiğince az olmalıdır ve üst sınıflar alt sınıflara bağımlı olmamalıdır.

Burada sadece class düşünülmemeli, metot veya özellik olarak da düşünülmelidir. Bir sınıfın, metodun veya özelliğin, onu kullanan diğer sınıflara karşı olan bağımlılığı en aza indirilmelidir.

DIP’e göre tasarlanmış mimaride, üst sınıflarda yapılan davranış değişikliklerinde, alt seviye davranışlarının bu değişime uyum sağlaması gerekir. Alt sınıflarda yapılan davranış değişikliklerinde ise üst sınıfların bu davranış değişikliği karşısında bozulmaması gerekmektedir.

Üst Sınıflar -> Soyutlama Katmanı -> Alt Sınıflar

Örnek:

Oluşturduğumuz validation örneğinde DIP’e aykırı olarak, yüksek seviyeli class düşük seviyeli sınıflara bağımlıdır. Validation sınıfı SmsValidation ve Email sınıfına bağımlı haldedir.

  public enum ValidationType{
    Email,
    Sms
  }

  public class Validation 
    {

        //Yüksek seviyeli sınıf
        EmailValidation emailValidation = new EmailValidation();
        SmsValidation smsValidation = new SmsValidation();

        public bool IsValid(ValudationType type, string values)
        {
            switch (type){
            case ValidationType.Email:
            emailValidation.IsValid(values);
            break;
            case ValidationType.Sms
            smsValidation.IsValid(values);
            break;
            default;
            }         
            //Operations
            return true;
        }

    }

    public class SmsValidation
    {

        //Düşük seviyeli sınıf  
        public bool IsValid(string values)
        {
            //Operations
            return true;
        }
    }

    public class EmailValidation
    {

        //Düşük seviyeli sınıf
        public bool IsValid(string values)
        {
            //Operations
            return true;
        }
    }

DIP’e uyarak:

Sınıflar arasındaki bağımlılığı Interface ile soyutlaştırarak sınıflar arasındaki bağımlılığı bu şekilde yönettik. Alt seviyeli sınıflar üst seviyeli sınıfa bağımlı hale geldi. Alt seviye sınıfları interface’e bağımlı hale getirdik.

    public class Validation
    {
        IMessageValidation messageValidation;
        public Validation(IMessageValidation messageValid)
        {
            messageValidation = messageValid;
        }

        public bool IsValid(string values)
        {
            messageValidation.IsValid(values);
            //Operations
            return true;
        }
    }

    public interface IMessageValidation
    {
        bool IsValid(string values);
    }

    public class SmsValidation : IMessageValidation
    {
        public bool IsValid(string values)
        {
            //Operations
            return true;
        }
    }

    public class EmailValidation : IMessageValidation
    {
        public bool IsValid(string values)
        {
            //Operations
            return true;
        }
    }

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir