Sayfalar

14 Şubat 2013 Perşembe

Dependency Inversion Principle (DIP)

Dependency Inversion prensibi, bağımlılığın tersine çevrilmesi olarak tanımlanır. Bu prensip; birbirleri ile bağımlı sınıflardan alt seviye sınıfda yapılan bir değişikliğin üst seviye sınıfıda etkileyeceğinden, sınıflar arasında ki bağın gevşek bağlı (loosely coupled) olmasını önermektedir.  Bahsettiğim bu bağımlı durumu daha iyi gözlemleyebilmek için aşağıda verdiğim Console uygulaması örneğini inceleyelim.

using System;
namespace NonDIP
{
    public partial class ExportToXls
    {
        public void ExportTo(string filePath, string data)
        {
            //buraya xls dosyası oluşturacak kodu yazabilirsiniz.
            Console.WriteLine("Xls dosyası oluşturuldu.");
        }
    }
}

"ExportToXls" isimli bir sınıf oluşturduk. Bu sınıfda oluşturduğumuz ExportTo()  isimli method'umuzun; kendisine parametre olarak geçtiğimiz data ile parametre olarak geçtiğimiz dosya yolunda, bu datayı kullanarak xls formatında bir dosya oluşturduğunu düşünelim.

using System;
namespace NonDIP
{
    public partial class ExportManager
    {
        ExportToXls _export { get; set; }

        public ExportManager(ExportToXls export)
        {
            this._export = export;
        }

        public void ExportToXls(string filePath, string data)
        {
            _export.ExportTo(filePath, data);
        }
    }
}

using System;
namespace NonDIP
{
    class Program
    {
        static void Main(string[] args)
        {
            ExportManager emXls = new ExportManager(new ExportToXls());
            emXls.ExportToXls("xls dosya adı", "data");
        }
    }
}


Şimdi uygulamamıza birde Pdf dosyası oluşturmak istediğimizi varsayalım ve bu amaçla " ExportToPdf " isimli bir sınıf ve methodlarını ekleyelim.

using System;
namespace NonDIP
{
    public partial class ExportToPdf
    {
        public void ExportTo(string filePath, string data)
        {
            //buraya pdf dosyası oluşturacak kodu yazabilirsiniz.
            Console.WriteLine("Pdf dosyası oluşturuldu.");
        }
    }
}

"ExportToPdf" sınıfımızdaki ExportTo () methodumuzu kullanabilmek için, "ExportManager "  sınıfımızı aşağıdaki gibi değiştirmemiz gerekmektedir. Bu gereklilik, sınıflar arası bağımlılıktan kaynaklanmaktadır.

using System;
namespace NonDIP
{
    public partial class ExportManager
    {
        ExportToXls _exportXls { get; set; }
        ExportToPdf _exportPdf { get; set; }

        public ExportManager(ExportToXls export)
        {
            this._exportXls = export;
        }

        public ExportManager(ExportToPdf export)
        {
            this._exportPdf = export;
        }

        public void ExportToXls(string filePath, string data)
        {
            _exportXls.ExportTo(filePath, data);
        }

        public void ExportToPdf(string filePath, string data)
        {
            _exportPdf.ExportTo(filePath, data);
        }
    }
}

using System;
namespace NonDIP
{
    class Program
    {
        static void Main(string[] args)
        {
            ExportManager emXls = new ExportManager(new ExportToXls());
            emXls.ExportToXls("xls dosya adı", "data");

            ExportManager emPdf = new ExportManager(new ExportToPdf());
            emPdf.ExportToPdf("pdf dosya adı", "data");
        }
    }
}

Birde Dependency Inversion Principle kullanarak, yukarıdaki işlemleri tekrarlayalım ve aradaki farkı görelim.

using System;
namespace DIP
{
    public partial interface IExport
    {
        void ExportTo(string filePath, string data);
    }
}

using System;
namespace DIP
{
    public partial class ExportToXls : IExport
    {
        public void ExportTo(string filePath, string data)
        {
            //buraya xls dosyası oluşturacak kodu yazabilirsiniz.
            Console.WriteLine("Xls dosyası oluşturuldu.");
        }
    }
}

"ExportToXls" sınıfımızı bu sefer,  oluşturduğumuz "IExport"  isimli arayüzünden türettik ve "ExportManager" sınıfımızı da aşağıdaki gibi değiştirdik.

using System;
namespace DIP
{
    public partial class ExportManager
    {
        IExport _export { get; set; }
        public ExportManager(IExport export)
        {
            this._export = export;
        }

        public void ExportTo(string filePath, string data)
        {
            _export.ExportTo(filePath, data);
        }
    }
}

Yine bir önceki örneğimizdeki gibi, "ExportToPdf" sınıfımızı ve methodlarını oluşturalım ve tek fark olarak bu sınıfımızı da "IExport" arayüzünden türetelim.

using System;
namespace DIP
{
    public partial class ExportToPdf : IExport
    {
        public void ExportTo(string filePath, string data)
        {
            //buraya pdf dosyası oluşturacak kodu yazabilirsiniz.
            Console.WriteLine("Pdf dosyası oluşturuldu.");
        }
    }
}

Şimdi de "ExportManager " sınıfında hiç bir değişiklik yapmadan nasıl Pdf ve Xls oluşturduğumuza bir bakalım.

using System;
namespace DIP
{
    class Program
    {
        static void Main(string[] args)
        {
            ExportManager emPdf = new ExportManager(new ExportToPdf());
            emPdf.ExportTo("pdf dosya adı", "data");

            ExportManager emXls = new ExportManager(new ExportToXls());
            emXls.ExportTo("xml dosya adı", "data");
        }
    }
}

İşte bu kadar... :)

Hiç yorum yok:

Yorum Gönder

Yorumunuzu bırakın.