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 O 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.
![]() |
![]() |
| 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.




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.
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.
Hocam aslında ben yaptım ama solid kurallarına uygun şekilde yapamadığımı düşünüyorum. O yüzden solid kurallarına uygun şekilde nasıl yaparım onu düşünemedim. Bu örnek üzerinden örneklendirebilirseniz çok yararlı olur gerçekten.
Hocam merhaba,
Kullandığım interface’in metodların ve controller’ın ekran görüntülerini paylaştım aşağıdaki linkte umarım bunlar yeterli olmuştur. Eksik gördüğünüz ya da hatalı olan yerler varsa söylerseniz çok sevinirim.
https://ibb.co/RzwBpX6 -Controller
https://ibb.co/8xw4G0N -Interface
https://ibb.co/HdZLwbR -Metod1
https://ibb.co/7zC2HBK -Metod2
https://ibb.co/MVVdY3r -Metod3
İyi çalışmalar.
Merhaba,
Şahsen gayet başarılı bir çalışma yapmışsınız 🙂 İhtiyacınız doğrultusunda herhangi bir tasarımsal yanlışlık olduğunu düşünmemekteyim.
Kolay gelsin.
Teşekkürler hocam zaman ayırdığınız için.
İyi çalışmalar.