Etiketler

, , , ,


1 – AÇIK/KAPALI PRENSİBİ

Açık kapalı prensibiyle en fazla karşılaştığım yanlış yorumlamaların başında “sınıfların değişmeye kapalı” olma kavramı gelmektedir. Eğer sınıfları değişmeye kapalı hale getirirsek, nasıl uygulama geliştireceğiz? Ya da her sınıf için mi bu geçerlidir? Bir sınıfın içeriği zaman için değişemez mi?Yoksa değişmemeli mi? Yeni bir metot belki eklenebilir ama çıkartabilir miyiz acaba? Ya da kimin haberi olacak ki bir metodun içeriğini azıcık değiştirsem? Bu soru işaretlerinin yanına daha bir sürü soru işareti koyabilirsiniz.

Ama cevabımız söyle olacaktır:

Sınıf içersine yeni metot eklemek ya da bazı metotları “obsolute()” duruma geçirmek durumunda olabilirsiniz. Metotların içeriğini de değiştirebilirsiniz. Bu durum Açık-Kapalı Prensibine aykırı bir durum değildir. Ta ki yaptığınız bir değişiklik sadece o sınıf içersinde kalıyorsa. Biraz daha açmamız da fayda var kanısındayım.

Yine son zamanlarda verdiğim klasik örnek üzerinden gideceğim. İnsan vücudu ve beslenme alışkanlığı 🙂

Her gün tükettiğiniz ekmek arası köfteye ketçap ekleyip tüketmenizde bir sakınca yoktur. Vücuduz yine o köfteyi sindirebilecektir. Çünkü vücudunuzda eğer gelen yiyecek ekmek arası köfte ise A türlü sindir, eğer ketçaplı ekmek arası köfte ise B türlü sindir şeklinde implementasyon yoktur. Siz köftenize ketçap eklediyseniz, o köftenin sindirilmesiyle ilgili metoduna da ketçap ile ilgili ilaveler yapmış olabilirsiniz. Bu normaldir ve olması gerekendir. Köfte ekmek hep kuru kuru yenir mi?

Ama…

Eğer bu değişiklikten sonra bir de vücudunuzu değiştirmek zorunda olsaydınız? Ki bu tıbben mümkün bile olsa (ki henüz değil), eminin hiçbirimizin tercih etmeyeceğimiz bir şey olurdu. İşte olay burada netleşiyor. Paketlenmiş yada paketlenecek bir şeyi ileri açma durumunuz söz konusu olacaksa, o an için edip etmediğiniz mühim değil (demem o ki hep köfteyi kuru kuru yiyor yada yiyecek olabilirsiniz) ama siz “Açık-Kapalı Prensibi” ni ihlal etmişsinizdir.

Açık/Kapalı prensibi der ki;

Kapattığını mümkünse bir daha açma!”. Pardon galiba orijinali “sınıf gelişmeye açık değişime kapalı olmalı” şeklindeydi.

Peki ya yeni bir ürün ortaya çıkarsa nasıl olacak? Yani köfte ekmek değil de, Mehmet’in Spesiyali isminde. İçinde ne var ne yok kimse bilmiyor. Zaten çok önemli değil. Vücut için sindirilebiliyor olması kafi 🙂

Bu durumda da eğer gidip If-Else (yada Case) Bloğuna birkaç satır daha ekliyorsan.” If urun=”Mehmetin’in Spesiyali” Then ….” Şeklinde, o zaman durup bir kez daha düşünmek lazım. Yarın öbür gün, Süleyman’ın, Ömer’in, Samet’in ki çıktığında ne yapacağım diye 🙂

Eğer Açık/Kapalı prensibine uyarsanız, kim ne ürünü çıkartırsa çıkartsın sizin için fark etmez. Fark etmemeli de zaten. Her ürün kendisinden istenen işin nasıl yapılacağını kendi bilir, bilmelidir.

Bu prensibe kullanan en güzel yazılım örneklerinden biri Windows Media Player‘dır. İzlemek istediğiniz filim o an desteklemediği bir formatta ise, ihtiyacı olan kodek’i yüklediğinizde, o formatı da çalıştırır hale geliyor.Kendi içersinde Case-Else bloklarıyla gelen medya türünü hiç bir zaman kontrol etmiyor. Etseydi bugün en yaygın tür .avi olmaz mıydı?