Etiketler

, , , , , ,


Bu yazı dizimizde web deki desen karmaşalarının ortaya çıkarttığı tasarım prensiplerinin hatalı kullanımlarına örnekler vereceğiz. Örnekleri ise bizzat kaynaklarından alacağız.

1-Factory – Chain Of Responsibility Karmaşası / Açık Kapalı Prensibi İhlali

İlk olarak geçenlerde rastladığım, Factory ile Chain of Responsibility desenlerinin karıştırıldığı bir örnekle başlamak istiyorum. Bu örneğimize kişisel bir blog sitesinde rastladım.

Factory Deseninin kullanımını tasarım prensiplerine aykırı inşa edilmiş. Bunun sebebi ise örneğin bu desenle modellene-  meyeceğidir.
Örnekte yapılmak istenen yazacağınız veri boyutu 0-600 MB arasında ise CD ye 600-4000 MB arasında ise DVD yazma işlemini gerçekleştirmektir. Bunun için Factory deseni kullanılmaya çalışılmış.Kullanılmaya zorlanmış. Sonucunda da Factory Metodun ana aktörlerinden biri olan Fabrika sınıfı içersine Case-Else Blokları açılmış.

Başta zaten Case-Else Blokları açıyorsanız, durun bir daha düşününü bu kez demiyeceğim ama bu işlemi yaptığınız yer eğer sizin ana sınıfınız ise, durun iki kere düşünün. Çünkü her bir medya türü çıktığında gidip orayı deşeceksiniz. Bu daha önce de verdiğim her keşfettiğimiz yeni bir yiyeceği sindirebilmek için vucudumuzu açıp, sindirim sistemimize o yeni yiyeceğin nasıl sindirileceğini öğretmekle aynı şey. Bu mümkün müdür ? Teknik olarak mümkünse de hiç bir zaman tercih etmeyeceğimiz bir şeydir tabiki de 🙂

Örnek özelinde konuşmak gerekirse, her bir medya türünün kapasitelerine göre bir zincir oluşturulup, ilk halkadan başlayarak, gideceği yere kadar zincir üzerinde dolaştırmalıydık. Eğer yazılmak istenen veri o medya türünün kapasite aşmıyorsa, o medya türüne, aşıyor ise de successor’una yönlendirmeliydik. ( Bkn: Chain Of Responsibility)

Chain of Responsibility kullanılmasını gereken yerde Factory deseni kullanılmaya zorlamış ve doğal olarak Açık Kapalı prensibinin sınıfların değişmeye kapalı olma zorunluluğuna aykırı düşmüş.

Bir kod yazıldığı zaman sadece Client tarafı değişmeye açıktır, tüm alt sınıfların içeriği paketlenmiş olarak kapalı olmalıdır. Sadece yeni (alt) sınıflar eklenerek genişleyebilmelidirler. Her yeni türde Factory sınıfın içeriğine girip Case Bloğuna satırlar ekleyerek olmamalıdır.

Yukarıdaki örnekte bunun hatalı olduğu açıkça görülmektedir.

Bu çok sık rastladığım bir hatalı kullanım şeklidir. O kadar çok yayındırki, çoğu kişi bu desenin bir implementasyon şeklinin böyle olabildiğini savunabilir. Benim cevaplarım ise sadece sadece ve prensipler çerçevesinde olacaktır.