Open Closed Principle - OCP

C# Da Open Closed Principle Kullanımı

Yapıların geliştirilmeye, genişletilmeye açık ama değiştirilmeye kapalı olması olarak tanımlanır. Yapılar bir kez kurgulanır ve inşa edilir. Mevcut yapılar ileriki bir zamanda ihtiyaç sonucu oluşan değişime her zaman kapalıdır. Uygulamaların sahip olduğu özellikler çıkarılan ilk sürümden sonra değişime uğramaktadır. Bu değişimler mevcut yapıların değiştirilmesi ile sağlanabilir.

Open Closed Principle buna izin vermemektedir.

Bu durumda değişim veya yeni ek özellikler kazandırılmak istendiğinde mevcut yapıya dokunmadan yeni davranışlar kazandırılarak yapılar genişletilerek gelişimine devam edebilir.

Yeni kodlar yazılır fakat varolanlar değiştirilmez.

Bir değişim ve yazılım güncellemesinde mevcut yapıya dokunulmadığından

  • Risk en alt seviyede tutulmuş olur.
  • Programcılar değişime kapalı alanlardaki kod bloklarını anlamaya çalışmak ve değiştirmek yerine yeni yapılar kurabilirler.
  • Mevcut yapılar değiştirilmediğinden test maliyetleri düşer.

Bir console application projesi içerisinde kartlı giriş çıkış işlemlerinin yapıldığı bir senaryo mevcut.

Sadece Personel Kart türünde işlem yapan uygulamaya Misafir kart türünden de giriş çıkış işlemleri yapılması ihtiyacı oluştu. Belki ileride başka kart tiplerine de ihtiyaç olabilecek.

public class PersonelKart

{

public void PersonelKartGiris()

{

Console.WriteLine("Personel Kart Giriş");

}


public void PersonelKartCikis()

{

Console.WriteLine("Personel Kart Çıkış");

}

}

Yeni kart tipi için oluşturulan sınıf yapısı MisafirKart

public class MisafirKart

{

public void MisafirKartGiris()

{

Console.WriteLine("Misafir Kart Giriş");

}


public void MisafirKartCikis()

{

Console.WriteLine("Misafir Kart Çıkış");

}

}

Mevcut uygulamamıza bu kart tipini tanıyacak şekilde değiştiriyoruz.

class Program

{

static void Main(string[] args)

{

PersonelKart pk = new PersonelKart(); MisafirKart mk = new MisafirKart();


Giris(pk); Giris(mk);


Console.Read();

}


private static void Giris(object kart)

{

if (kart is PersonelKart) ((PersonelKart)kart).PersonelKartGiris();


if (kart is MisafirKart) ((MisafirKart)kart).MisafirKartGiris();

}



private static void Cikis(object kart)

{

if (kart is PersonelKart) ((PersonelKart)kart).PersonelKartCikis();


if (kart is MisafirKart)

((MisafirKart)kart).MisafirKartCikis();

}

}

Programı tasarlarken oluşturduğumuz Giris ve Cikis fonksiyonları yeni eklenen kart tipi için değişime uğradı. Bu tür bir operasyon Open Closed Principle ilkesine aykırıdır.

Her ne sebeple olursa olsun değişim olamaz. Open Closed Principle ilkesine uygunluk için mevcut yapımızı aşağıdaki şekilde yeniden düzenliyoruz.

interface IKart

{

void Giris(); void Cikis();

}

public class PersonelKart:IKart

{

#region IKart Members


public void Giris()

{

Console.WriteLine("Personel Kart Giriş");

}

public void Cikis()

{

Console.WriteLine("Personel Kart Çıkış");

}


#endregion

}

public class MisafirKart:IKart

{

#region IKart Members


public void Giris()

{

Console.WriteLine("Misafir Kart Giriş");

}


public void Cikis()

{

Console.WriteLine("Misafir Kart Çıkış");

}


#endregion

}

class Program

{

static void Main(string[] args)

{

PersonelKart pk = new PersonelKart(); MisafirKart mk = new MisafirKart();


Giris(pk); Giris(mk);



Cikis(pk); Cikis(mk);


Console.Read();

}


private static void Giris(IKart kart)

{

kart.Giris();

}


private static void Cikis(IKart kart)

{

kart.Cikis();

}

}

 

Görüldüğü gibi Giris ve Cikis metotları bu ve bundan sonraki değişimlerden etkilenmeyecek şekilde düzenlendi. Yeni özellik eklenmesi genişletilmesi en az kod değişimi ile sağlanmış oldu.

Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git