Açık- Kapalı Prensibi
Prensibin genel mantığı olarak; değişime kapalı gelişime açık diyebiliriz. Mevcut kodun değiştirilme durumunun minimum tutulması istenmektedir. Yeni özellik eklemede değişiklik temel alınarak yapılmalıdır. Açık –Kapalı Prensibi tekrar test problemini çözer. İlgi ve rolleri dağıtır, düşük bağlılık imkânı sağlar. Genel hatlar olarak diğer prensiplerde de bulunur. İyileştirme olarak ara yüz veya soyutlaştırma kullanılır.
Örnek de işlenen konu; bir iş yerinde maaş dağılım durumudur. Maas soyut bir sınıf olarak yazılmıştır. MaasYolla sınıfı ise yönetici sınıftır. Bu çözüm olmasaydı yönetici sınıf içerisinde if/else ile her gelen çalışan için yönlendirme yapılacaktı fakat bu çözüm sayesinde değişim değil gelişim esas alınmıştır. Her yeni eklenen çalışan için maaş hesaplamasında bulunmak temel durum olacaktır. Değişken durumlar ise eklenen kişiye göre gelişim gösterir. TeknikPersonel sınıfı Maas sınıfını extends eder ve hesapla fonksiyonunu alır. Kendi özelliği olarak mesai fonksiyonunu ekler ve genişler.

  1. AcikKapaliPrensibi.java;
  2. package tasarim1;
  3. public class AcikKapaliPrensibi {
  4. abstract class Maas{ // Maaş sınıfı soyutlaştırma yapılarak program yükü azaltılır.
  5. abstract void hesapla(); }
  6. //MaasYolla sınıfı yönetici sınıftır.
  7. //Her yeni personel eklendiğinde kötü durumda değiştirilmesi gerekirdi.
  8. //Fakat soyut sınıf kullanılarak if/else gibi değişim durumundan kurtulmuş olur.
  9. class MaasYolla{ Yönetici sınıf soyut sınıfı çağırarak işlemini tamamlar.
  10. Public void maasHesap(Maas m)
  11. { m.hesapla(); }
  12. }
  13. class TeknikPersonel extends Maas {  Maaş sınıfından türetilen her yeni sınıfa istenilen özellik eklenebilir.
  14. int mesai = 350, asgariucret = 634, toplam=0;
  15. void hesapla() {
  16. toplam = mesai + asgariucret; }
  17. }
  18. class Muhendis extends Maas {
  19. int mesai = 500, ucret = 1500, toplam=0;
  20. void hesapla() {
  21. toplam = mesai + ucret;
  22. }
  23. } }

Open Closed Principle

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace WindowsFormsApplication1
  7. {
  8.     class DrawImage<T>
  9.    
  10.          where T:IImage
  11.     {
  12.         private T _image;
  13.         public DrawImage (T img)
  14.         {
  15.             _image = img;
  16.         }
  17.         public void writeTheFormat()
  18.         {
  19.             _image.writeTheFormat();
  20.         }
  21.         public void DrawTheImage()
  22.         {
  23.             _image.DrawTheImage();
  24.         }
  25.    
  26.     }
  27. }
  28.  
  29. namespace WindowsFormsApplication1
  30. {
  31.     static class Program
  32.     {
  33.         /// <summary>
  34.         /// The main entry point for the application.
  35.         /// </summary>
  36.         [STAThread]
  37.         static void Main()
  38.         {
  39.             DrawImage <Bmp> creator = new DrawImage <Bmp>(new Bmp());
  40.             creator.writeTheFormat();
  41.             creator.DrawTheImage();
  42.             DrawImage <Jpg> creator2 = new DrawImage <Jpg>(new Jpg());
  43.             creator2.writeTheFormat();
  44.             creator2.DrawTheImage();    
  45.  
  46.         }
  47.     }
  48. }
  49.  
  50.  
  51. namespace WindowsFormsApplication1
  52. {
  53.     class Jpg  :
  54.     {
  55.         public void writeTheFormat()
  56.         {
  57.             Console.WriteLine("Random Jpg");
  58.         }
  59.         public void DrawTheImage()
  60.         {
  61.             Console.WriteLine("Draw Jpg");
  62.         }
  63.     }
  64. }
  65.  
  66.  
  67. namespace WindowsFormsApplication1
  68. {
  69.     class Bmp : IImage
  70.     {
  71.         public void writeTheFormat()
  72.         {
  73.             Console.WriteLine("Random bitmap");
  74.         }
  75.         public void DrawTheImage()
  76.         {
  77.             Console.WriteLine("Draw bitmap");
  78.         }
  79.     }
  80. }
  81.  
  82.  
  83.  
  84.  
  85.  
  86. namespace WindowsFormsApplication1
  87. {
  88.     interface IImage
  89.     {
  90.         void writeTheFormat();
  91.         void DrawTheImage();
  92.     }
  93. }

At here, DrawImage, Jpg and BMP are a class. Also, Iımage is an interface class. Programs draw the image two different types but if a customer wants a new format of image?

So, we use the interface without the if else selections.. Iımages classes is not implemented.

When Jpg, Bmw or new format of the image wants to draw the image, firstly implements the Iımage interfacess. At here two methos there are. writeTheFormat() method and drawTheImage() method. At Iımage interface, classes implement each self.. So “All systems change during their life cycles. This must be born in mind when developing systems are excepted to last longer than the first version.”



*** *** KANALIMIZA ABONE OLMAYI UNNUTMAYIN ** ***

*** *** KANALIMIZA ABONE OLMAYI UNNUTMAYIN *** ***