Harun Özer


Proje veya dijital katalog yaptırmak için
iletişim formu doldurabilirsiniz..

<< Liskov Substitution Principle - Liskov Yerdeğiştirme Prensibi | Interface Segregation Principle>>

Dependency Inversion Principle

Yazar harunozer 03 November 2013

Dependency Inversion Principle Dependency Inversion Principle (Bağımlılıkların tersine çevrilmesi prensibi) alt sınıf ile üst sınıf arasında kesin bir bağ olmamasını savunur.

Yani nesneler arasındaki bağ sınıflar ile değil arayüzler veya abstract sınıflar ile kurulur. Böylece işlemleri gerçekleştiren sınıflarda bir değişiklik olsa veya aynı türde farklı bir tip de eklense üst sınıflarda bir değişiklik yapılması gerekmeyecektir.

Şimdi Dependency Inversion prensibini bir örnek uygulamayla daha iyi anlamaya çalışalım. Örneğin bir animasyon editör uygulaması yazıyoruz. Bu editörde hazırladığımız projeyi publish ettiğimizde javascript ve gerekli dosyaları oluşturup html çıktısı veriyor olsun (tabiki biz sadece konsola bir şeyler yazacağız) .

class CompilerHtml
    {
        public string Project { get; set; }
        public void Publish()
        {
            Console.WriteLine("Proje Publish Edildi.");
        }
    }
 
    class ProjectCompiler
    {
        CompilerHtml p;
        public ProjectCompiler(CompilerHtml proje)
        {
            p = proje;
        }
 
        public void Publish()
        {
            p.Publish();
        }
 
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            ProjectCompiler pw = new ProjectCompiler(new CompilerHtml());
            pw.Publish();
            Console.ReadKey();
        }
    }
Uygulamamızda üst seviye sınıf olan ProjectCompiler sınıfı alt sınıfı olan ProjectManager sınıfına sıkı bir şekilde bağlıdır. Çünkü ProjectCompiler sınıfı sadece ProjectManager sınıfı ile işlem yapabilir. Diyelim ki ilerleyen zamanlarda editörümüzün apk olarak da compile etmesini istiyoruz. Bu durumda ProjectManager sınıfı gibi yeni bir sınıfı oluşturulup ProjectCompiler sınıfında da değişiklik yapmamız gerekecektir. Fakat uygulama kodumuzu Dependency Inversion prensibine göre düzenlersek bu sorun ortadan kalkacaktır. Uygulamamızın düzenlenmiş hali şöyle olacaktır.

interface IProjectCompiler
    {
        string Project { get; set; }
        void Publish();
    }
 
 
    class CompilerHtml : IProjectCompiler
    {
 
        public string Project { get; set; }
 
        public void Publish()
        {
            Console.WriteLine("Project Html Compile");
        }
    }
 
    class CompilerAPK : IProjectCompiler
    {
        public string Project { get; set; }
 
        public void Publish()
        {
            Console.WriteLine("Project APK Compile");
        }
    }
 
    class CompilerManager
    {
        IProjectCompiler pc;
        public CompilerManager(IProjectCompiler ProjectCompiler)
        {
            pc = ProjectCompiler;
        }
 
        public void Publish()
        {
            pc.Publish();
        }
 
    }
 
    class Program
    {
        static void Main(string[] args)
        {
 
            CompilerManager cm = new CompilerManager(new CompilerHtml());
            cm.Publish();
 
            cm = new CompilerManager(new CompilerAPK());
            cm.Publish();
 
            Console.ReadKey();
            
        }
    }
 
Uygulamamızın düzenlenmiş halinde projemizin değişik türlerde compile edilmesi için compile yapacak sınıfların uygulaması gereken IProjectCompiler arayüzünü oluşturduk. CompilerHtml ve CompilerAPK sınıflarımızı da bu arayüzden türeterek farklı compiler sınıflar yapmış olduk. CompilerManager sınıfımızda ise Compile yapacak sınıfların türetilmesi gereken arayüz üzerinden işlem yaptık. Böylece yeni compile sınıflar eklesek bile CompilerManager üst sınıfını değiştirmemize gerek kalmadan, IProjectCompiler arayüzünden türetip Publish metodunu yazmamız yeterli olacaktır.
Örnek uygulama kodlarını aşağıdaki linkten indirebilirsiniz.

DependencyInversionPrincipleSample.rar

Tam Sayfa
Tags Tasarım Prensipleri,
Kategoriler Tasarım Prensipleri
İşlemler
Bu Makale 3  Kez Beğenildi.
İsim :    
e-Mail :    
Web Site :  
İmage :  
Güvenlik Kodu :  

Güvenlik Resmi
Resmi Yenile
    
Yorum :  
Tasarım Desenleri ve Mimarileri