2-Open/Closed Principle (Solid Principle)

Özetle nesnelerin geliştirmeye açık(open), değiştirmeye kapalı(closed) olmalarıdır. Bu prensip bu kural ile nesnenin davranışını değiştirmeden nesneye yeni özelliklerin katılmasını sağlamış oluyor. Bunada sürdürülebilir ve tekrar kullanılabilirlik deniyor.

Prensibin temelinde yapılan değişikliğin projede veya projeye bağlı sistemlerde herhangi bir değişikliğe sebebiyet vermeyip bizi çoğu maliyetten kurtarması yatmaktadır.

Bu prensip; sürdürülebilir ve tekrar kullanılabilir yapıda kod yazmanın temelini oluşturur.

Robert C. Martin

Prensibin anahtar kelimelerini biraz daha açarsak Open, nesne, sınıf veya method içerisinde yeni davranışların eklenebilmesidir. İhtiyaçlar değiştiğinde, yeni ihtiyaçları karşılayabilmesi için bir sınıfa yeni veya farklı davranışlar eklenebilir olmasıdır. Closed, bir nesnenin, sınıfın veya methodun temel özelliklerinin değişimi ise mümkün olmamalıdır.

Bir class’a veya bir methoda yeni kodlar eklediğimiz zaman bunu varolan kodları değiştirmeden yapıyor olmamız gerekmektedir. Eğer ki yeni gelen ihtiyaçlardaki kod değişikliği varolan kodda değişikliğe sebebiyet veriyorsa bu durumda OCP’ye ters düşüyor olabileceğimiz anlamına gelebilir. Eğer ki gelecek ihtiyaçları önceden planlarsak varolan kodları bozmadan yeni ihtiyaçlarıda kolaylıkla entegre edebiliriz.

Örnek

Senaryoya göre log tutma ihtiyacımızı karşılamak için ‘Logger’ isminde bir class oluşturduk. ‘Logger’ sınıfı diğer log sınıflarının intance’sini alarak ‘Log’ isimli metoduyla dışarıya hizmete açıyor. ‘Log’ metodu iki parametre alıyor. İlk parametre ‘logType’ isimli bir enum değer, ikinci parametre ise string log mesajıdır. ‘Log’ metodu içerisinde gelen ‘logType”a göre hangi log sınıfını kullanacağına karar veriyor. Eğer yeni bir log tipi ekleyecek olursa ‘Logger’ sınıfının içerisindeki ‘Log’ metodunda değişiklikler yapmak zorunda kalacağız. Bu da OCP’ye karşı olacaktır.

Senaryo’daki gereksinimler OCP’ye uygun yapmak istersek:

OCP’ye uymak için ‘ILogger’ isimli interface imizi oluşturduk. Log class’ları bu interface imizi miras aldı. ‘ILogger”ın içerisinde ise hepsinin implemente etmek zorunda olduğu ‘Log’ metodunu yazdık. Dışarıya hizmet verecek ‘Logger’ sınıfımızıda geliştirmeye açık ancak değişime kapalı olacak şekilde oluşturduk. Bundan sonra gelecek log tipi için artık ‘Logger’ metodu içerisinde değişiklik yapmamıza gerek kalmadı.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir