Evet bir önceki Single Responsibility makalesinden sonra sıra geldi 2. prensibimiz olan Open-Closed (Açık Kapalı) prensibine. Prensiplerin hepsinin ayrı bir önemi var fakat open-closed’ın önemi biraz daha önde geliyor, en azından benim için 🙂

Gerçek dünyada, bir uygulama geliştirme sürecinde veya sonrasında, sürekli müşterilerimizden yeni istekler ve güncelleme talepleri gelmektedir.

Bu gelecek olan isteklerin sistemimize rahatlıkla entegre olabilmesi veya kolaylıkla genişletilebilmesi için (günümüzde zaman artık çok değerli bir kıstas olduğu için) uygulamamızı gelişime açık, değişime kapalı bir şekilde geliştirmeliyiz. Genelde uygulamalarımız üzerinde değişiklik veya güncellemeler kaçınılmaz bir gerçektir. Her ne kadar ileriye dönük esnek (Extendability) bir tasarım oluşturursak, karşımıza gelecek olan isteklerin sistemimize uygulanabilirliğini, kara kara düşünmeden işleme koyabilmemizi sağlar.

Konunun daha iyi anlaşılabilmesi açısından, en güzel bulduğum ve zamanında benimde anlayabilmem açısından en iyi olan örnek üzerinden gideceğim.

Örneğimizde Rectangle(Dikdörtgen) isminde bir class’ımız mevcut ve bu class’ımız Width ve Height property’lerine sahip. Birde AreaCalculator isminde bir class’ımız ve burada Area isminde bir metot ile Rectangle tipinde bir dizi alarak basit bir şekilde alanlarını hesaplıyoruz.

 

 

 

 

 

 

 

 

 

Evet her şey oldukça güzel görünüyor değil mi? Rectangle’ın alanını hesaplayabiliyoruz. Peki müşterimizden gelen bir istek ile Circle(Daire)’ında alanını hesaplamak istediğini belirtti bize.

Aklımıza gelen ilk şey olarak artık Rectangle tipinde bir dizi yerine object tipinde dizi tanımlayarak bunu da ufak bir if else bloğuna sokarak bir type kontrolü ile halledebiliriz sanırım…

Hemen kodumuzun son haline bir bakalım:

 

 

 

 

 

 

 

 

 

Şuan için yine oldukça güzel duruyor 🙂 Sanırım müşterimizin isteğini yerine getirmiş olduk ve artık Circle’ın da alanını hesaplayabiliyoruz.

Her şey güzel gidiyor derken müşterimizden gelen bir haber ile tekrar bir yeni isteği olduğunu belirtiyor. Bu seferde Triangles (Üçgen) için bir alan hesaplamak istiyor. Elbette bunu hesaplamak çok zor değil fakat yine kodumuzda değişiklikler gerekiyor.

Git gide open-closed’a karşı bir yapı kuruyoruz. Gelişime açık, değişime kapalı olmamız gerekirken sürekli kodumuzu değiştiriyoruz. Bu duruma hemen open-closed prensibine uygun bir yaklaşımla bakarsak AreaCalculator class’ımız değişime kapalı değildir aksine yeni istek için sürekli değiştirmemiz gerekmektedir. Aslında olaya developer olarak bakarsak, kendi kendimize bir ek iş çıkarıyoruz burada 🙂

Evet şimdi open-closed prensibine göre bu class’ımızı gelişime bir açalım ve bize neler katabilecek bir bakalım hemen.

Öncelikle OOP’in güzelliklerinden yararlanarak hemen Shape isminde bir abstract class oluşturarak bu class ile şekli soyutlayıp istediğimiz tipte türetebileceğiz. Her birinin kendi alan hesaplama formülü bulunacak. Bu şekilde bir yaklaşımla metodumuzu gelişime açıkdeğişime kapalı olarak belirlemiş olduk.

Hemen kodun son haline bakacak olursak:

Artık her ne kadar farklı hesaplama ve şekil isteği gelse de biliyoruz ki bizim için farketmez, kolaylıkla metodumuzu genişletebiliriz.

Bir makalenin daha sonuna geldik, umarım faydalı olabilmişsem ne mutlu bana.

Takipte kalın… 🙂

 

 

Gökhan Gökalp

View Comments

Recent Posts

Containerized Uygulamaların Supply Chain’ini Güvence Altına Alarak Güvenlik Risklerini Azaltma (Güvenlik Taraması, SBOM’lar, Artifact’lerin İmzalanması ve Doğrulanması) – Bölüm 1

{:tr}Bildiğimiz gibi modern yazılım geliştirme ortamında containerization'ın benimsenmesi, uygulamaların oluşturulma ve dağıtılma şekillerini oldukça değiştirdi.…

8 ay ago

Identity & Access Management İşlemlerini Azure AD B2C ile .NET Ortamında Gerçekleştirmek

{:tr}Bildiğimiz gibi bir ürün geliştirirken olabildiğince farklı cloud çözümlerinden faydalanmak, harcanacak zaman ve karmaşıklığın yanı…

1 yıl ago

Azure Service Bus Kullanarak Microservice’lerde Event’ler Nasıl Sıralanır (FIFO Consumers)

{:tr}Bazen bazı senaryolar vardır karmaşıklığını veya eksi yanlarını bildiğimiz halde implemente etmekten kaçamadığımız veya implemente…

2 yıl ago

.NET Microservice’lerinde Outbox Pattern’ı ile Eventual Consistency için Atomicity Sağlama

{:tr}Bildiğimiz gibi microservice architecture'ına adapte olmanın bir çok artı noktası olduğu gibi, maalesef getirdiği bazı…

2 yıl ago

Dapr ve .NET Kullanarak Minimum Efor ile Microservice’ler Geliştirmek – 02 (Azure Container Apps)

{:tr}Bir önceki makale serisinde Dapr projesinden ve faydalarından bahsedip, local ortamda self-hosted mode olarak .NET…

2 yıl ago