Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Açık Kapalı Prensibi(Open Closed Principle – OCP)

Açık Kapalı Prensibi(Open Closed Principle - OCP)

Merhaba,

Bir önceki yazımızda SOLID prensiplerinden S olan Tek Sorumluluk Prensibi(Single Responsibility Principle – SRP)‘ni incelemiştik. Bu yazımızda ise sıradaki timsaline denk gelen Açık Kapalı Prensibi – Open Closed Principle (OCP)’yi izah edeceğim.

Her yazılım geliştirici bilir ki, yazılım kaçınılmaz değişim demektir. Ben görmedim ki, bir müşteri istediğini başında %90 izah edebilsin. Bakın %100’de değilim bile. Türkiye’de bir yazılıma, başlangıç noktas ile bitiş noktasına kadar olan süreçte yaşayabileceği tüm evrimleri yaşatabilmekteyiz elhamdülillah… Olmayan features(özellikler), eklentiler yahut modüller sonradan plana dahil edilmektedir. Eee haliyle var olan yazılımı bu planlar doğrultusunda durmadan değiştirme görevide biz yazılımcılara düşmektedir.

Yazılım değişim dediysek eğer OCP olmazsa olmaz temel teşkil eden bir prensiptir. Bunun sebebide işin doğasında değişikliğin yatmasıdır.

Şimdi düşünün ki, öyle bir tasarım yapacağız ki, öyle bir kod yazacağız ki, gelen yenilemeler var olanı bozmayacak, kodlarımızda değişiklik yapmak zorunda kalmayacağız. Sade ve sadece ekleme ve değiştirme yapacağımız kısım bizim muhattabımız olacak.

Var mı böyle bir dünya?

Ee var ki burada konuşuyoruz 🙂

OCP prensibi,

“sınıflar gelişmeye açık lakin değişmeye kapalı olmalıdır”

demektedir. Değişime kapalıdan kasıt, kodda gereksiz yerlerin değiştirilmesidir.

    class AIslemi
    {
        public bool Islem() { Console.WriteLine("AIslemi"); return true; }
    }
    class BIslemi
    {
        public bool Islem() { Console.WriteLine("BIslemi"); return true; }
    }
    class CIslemi
    {
        public bool Islem() { Console.WriteLine("CIslemi"); return true; }
    }
    enum IslemTipi
    {
        AIslemi,
        BIslemi,
        CIslemi
    }

    class IslemYapici
    {
        AIslemi aIslemi;
        BIslemi bIslemi;
        CIslemi cIslemi;

        public IslemYapici()
        {
            aIslemi = new AIslemi();
            bIslemi = new BIslemi();
            cIslemi = new CIslemi();
        }

        public void IslemiYap(IslemTipi islemTipi)
        {
            switch (islemTipi)
            {
                case IslemTipi.AIslemi:
                    aIslemi.Islem();
                    break;
                case IslemTipi.BIslemi:
                    bIslemi.Islem();
                    break;
                case IslemTipi.CIslemi:
                    cIslemi.Islem();
                    break;
            }
        }
    }

Yukarıdaki örnek kod bloğunu ele alalım. “IslemYapici” sınıfımız “AIslemi”, “BIslemi” ve “CIslemi” sınıflarını bu şekilde kullanırsa eğer yeni bir “DIslemi” söz konusu olduğunda “IslemYapici” sınıfın değiştirilmesi gerekecektir. Bu tarz bir tasarım bağımlılılardan dolayı hatalıdır. Doğal olarak OCP’ye de aykırıdır.

İşte bu tarz bir durumda aşağıdaki gibi bir tasarım OCP’ye uygun bir yaklaşım olacaktır ve yeni ekleme sonucunda bir tek gerekli olan sınıf inşa edilecek lakin “IslemYapici” sınıf değiştirilmeyecektir.

    interface Islem
    {
        bool Islem();
    }
    class AIslemi : Islem
    {
        public bool Islem() { Console.WriteLine("AIslemi"); return true; }
    }
    class BIslemi : Islem
    {
        public bool Islem() { Console.WriteLine("BIslemi"); return true; }
    }
    class CIslemi : Islem
    {
        public bool Islem() { Console.WriteLine("CIslemi"); return true; }
    }
    class IslemYapici
    {
        Islem islem;

        public IslemYapici(Islem islem)
        {
            this.islem = islem;
        }

        public void IslemiYap()
        {
            islem.Islem();
        }
    }

Gördüğünüz gibi “IslemYapici” sınıfımızda yaptığımız her yeni entegrasyonda ilgili sınıf hangi tipin verildiğiyle ilgilenmeyecek, doğal olarak bağımlılık minimize edilmiş olacaktır. Arayüz sayesinde bu işlemi gerçekleştirmekteyiz. İşte bu arayüz sayesinde sınıfımızı genişletmiş oluyor, değişikliği önlemiş oluyoruz.

Bu prensip(OCP) sayesinde 2 günde yapılan işi 3 günde değiştirmek zorunda kalmaktan kurtuluyoruz.

Açık Kapalı Prensibi(Open Closed Principle - OCP) Açık Kapalı Prensibi(Open Closed Principle - OCP)
OCP’ye Aykırı OCP’ye Uygun

Okuduğunuz için teşekkür ederim.

Sonraki yazılarımda görüşmek üzere.

İyi çalışmalar dilerim.

Bunlar da hoşunuza gidebilir...

7 Cevaplar

  1. Sadık dedi ki:

    Hocam merhaba,

    Peki diyelimki .net core projemiz var ve bir controller’ın bir action’ın içinde AIslem()’i diğer action’da BIslem()’i kullanmamız gerekli. Bunu nasıl yapacağız startup’da nasıl bir düzenleme yapmalıyız ? Ya da mevcut örnek içinde aslında bunu tam olarak anlayamadım? Bunu Solid kurallarına uygun şekilde nasıl yaparım tam anlayamadım?

    İyi çalışmalar.

    • Gençay dedi ki:

      Merhaba,

      Asp.NET Core yapısı, controller sınıfları vs. hakkında bilginiz nedir? Ona göre ya yönlendirme yapacağım ya da örneklendireceğim.

  1. 28 Nisan 2016

    […] S–Tek Sorumluluk Prensibi(Single Responsibility Principle – SRP)‘ni ve O–Açık Kapalı Prensibi(Open Closed Principle – OCP) incelemiştik. Bu yazımızda ise sıradaki L timsaline denk gelen Liskov’un Yerine […]

Bir cevap yazın

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

*