Solid: Open/Closed Principle (OCP)
Open/Closed Principle (OCP)
Open/Closed Principle (OCP), SOLID prensiplerinin ikincisidir ve yazılım varlıklarının (sınıflar, modüller, fonksiyonlar vb.) genişletilmeye açık, ancak değiştirilmeye kapalı olması gerektiğini belirtir. Bu prensip, mevcut kodu değiştirmeden yeni işlevsellikler ekleyebilmemizi sağlar.
Önemi
OCP, yazılım geliştirme sürecinde esneklik ve sürdürülebilirlik sağlar. Bu prensip sayesinde, mevcut kod tabanını bozmadan yeni özellikler ekleyebilir ve yazılımın genişletilebilirliğini artırabiliriz.
İyi Uygulamalar
- Abstraction Kullanımı: Soyut sınıflar ve arayüzler kullanarak, sınıfların genişletilebilirliğini artırabiliriz.
- Inheritance (Miras Alma): Yeni işlevsellikler eklemek için mevcut sınıfları değiştirmek yerine, bu sınıflardan türeyen alt sınıflar oluşturmalıyız.
- Dependency Injection: Bağımlılıkları dışarıdan enjekte ederek, sınıfların bağımsızlığını koruyabilir ve test edilebilirliğini artırabiliriz.
Örnek
// Kötü Örnek
public class Rectangle
{
public double Width { get; set; }
public double Height { get; set; }
public double Area()
{
return Width * Height;
}
}
public class AreaCalculator
{
public double CalculateArea(Rectangle[] shapes)
{
double area = 0;
foreach (var shape in shapes)
{
area += shape.Area();
}
return area;
}
}
// İyi Örnek
public abstract class Shape
{
public abstract double Area();
}
public class Rectangle : Shape
{
public double Width { get; set; }
public double Height { get; set; }
public override double Area()
{
return Width * Height;
}
}
public class Circle : Shape
{
public double Radius { get; set; }
public override double Area()
{
return Math.PI * Radius * Radius;
}
}
public class AreaCalculator
{
public double CalculateArea(Shape[] shapes)
{
double area = 0;
foreach (var shape in shapes)
{
area += shape.Area();
}
return area;
}
}
Clean Code kitabında, Robert C. Martin, OCP’nin önemini şu şekilde açıklar: “Sınıflar ve modüller genişlemeye açık, değişime kapalı olmalıdır.” Bu prensip, yazılımın esnekliğini artırır ve yeni işlevsellikler eklerken mevcut kodun bozulmamasını sağlar. Martin, bu prensibin uygulanmasının yazılımda nasıl esneklik ve sürdürülebilirlik sağladığını örneklerle açıklar.