Nesne Yönelimli Tasarım Prensipleri – Giriş

Merhaba, geliştirdiği her uygulamada nesne yönelimli programlama tekniklerini kullanan yazılımcı dostlarım! Bu yazımda sizlere nesne yönelimli tasarım ilkelerinden bahsedeceğim. Yani temel olarak; “projede kullandığım sınıfları nasıl daha iyi nasıl tasarlarım” konusuna eğileceğiz.   Ele aldığımız bu konu da, birkaç makaleden oluşacak büyük olasılıkla. Her bir makalede, bir prensibi anlatmayı düşünüyorum. Sonrasında da, bu prensiplerin ortaya…

18/04/2013 by turkayurkmez

Merhaba, geliştirdiği her uygulamada nesne yönelimli programlama tekniklerini kullanan yazılımcı dostlarım! Bu yazımda sizlere nesne yönelimli tasarım ilkelerinden bahsedeceğim. Yani temel olarak; “projede kullandığım sınıfları nasıl daha iyi nasıl tasarlarım” konusuna eğileceğiz.

 

Ele aldığımız bu konu da, birkaç makaleden oluşacak büyük olasılıkla. Her bir makalede, bir prensibi anlatmayı düşünüyorum. Sonrasında da, bu prensiplerin ortaya çıkardığı bazı problem çözüm yöntemlerini göreceğiz birlikte.

İnsanoğlu, geliştirdiği her şeyde deneme – yanılma yöntemi izleyen bir varlık. Bunu çevrenizdeki her ürün için düşünebilirsiniz (gerçi sadece ürün değil, yaşam biçimlerimiz için de geçerli bu). Bir cihaz ilk ortaya çıktığında daha az işlevsel ve daha çok sorunlu bir durumdadır. Ancak zamanla, (deneme yanılmayla) ek özellikler eklenerek, işlevselliği arttırılarak mükemmelleşme yolunda ilerler. Gelin görün ki, söz konusu cihazın yeni bir modelini üretmeye girişen her mühendis sıfırdan başlayamaz. Bir önceki versiyonlardan edinilmiş olan bilgiyi kullanarak yeni modeli ortaya çıkarmaya çalışır.

Mesela bir aşçıyı ele alalım. Bu mesleğe atılırken, kendisinden önce keşfedilmiş yemekleri ve bu yemek yapma yöntemlerini biliyor olması beklenir. Biraz da yeteneği varsa harikalar yaratan bir sanatçıya dönüşebilir. Peki bu örnekten devam edersek iyi yemek nasıl yapılır sorusundan önce ne aşçımızın neyi bilmesi gerekir? Eğer “Kötü yemek nedir” sorusuna cevap verebiliyorsa, iyi yemeği yapmaya bir adım daha yaklaşmış demektir. İşte bu “kötü yemek” tanımı da deneme – yanılma yöntemleri ile tespit edilmiştir.

Bir an fark ettim de, yine felsefenin dibine vurmuşuz. Toparlayalım. Nesne Yönelimli tasarımlarımızı nasıl iyileştiririz sorusuna geçmeden önce kötü tasarım nedir bunu kavramamız lazım. Bu konuda büyük üstat Martin Fowler’ın tanımına ve Şişman Adam’ın anlatımına başvuracağız.

Martin abiye göre kötü tasarımın üç bulgusu vardır. Önce bunları anlamaya çalışalım.

Sertlik

Tasarladığınız sınıflar içerisinde mimari ya da fonksiyonel değişiklik yapmak çok zorsa ve zaman kaybettiriyorsa (ki yazılım projelerinde vakit nakittir), bu tasarım sorunlu bir tasarımdır. Bir sınıfta yaptığınız değişiklik, o sınıfa bağlı diğer sınıflarda da değişiklik yapmanızı zorunlu kılar. Yani nesneler birbiriyle sıkı sıkıya bağlıdır. Hiç çekilmez bir durumdur bu. Çünkü değişimin nerede biteceği (ne kadar süreceği) öngörülemez. Her şey arapsaçı gibi karmakarışık bir durumdadır. Zaman harcadıkça, patrondan veya müşteriden zılgıt yeme ihtimaliniz artar.

Kırılganlık

Sertlik kusuru ile yakından ilgilidir. Yaptığınız değişikliklerin etkilerini asla tahmin edemezsiniz. Yani, acaba yaptığınız değişiklik işe yaramakta mıdır? Bu kocaman soru işareti size hüzün verir çünkü bir dahaki bozulmanın nereden (hangi sınıftan) kaynaklanacağını bilemezsiniz. Tasarımınız, pamuk ipliğine bağlı bir vaziyettedir. Her an devrilebilir!

Hareketsizlik

Yazdığınız nesnenin en mühim özelliklerinden biri, yeniden kullanılabilir olmasıdır. Eğer bu zor ise, tasarımınız sıkıntılı demektir. Bunu şöyle ifade edelim; başka uygulamalarda da kullanabileceğiniz birçok faydalı modülden oluşan büyük bir projeniz olsun. Fakat eğer bu modülleri sistemden ayırmak büyük bir risk taşıyor ise hareketsiz bir tasarımınız var demektir. Maalesef, çoğu tasarım bu dertten mustariptir.

İşte mimari açıdan kötü tasarlanmış bir uygulamanın sorunları bunlar. Peki, bu sorunların üstesinden nasıl gelebiliriz acaba? İşte tam da bu noktada, 5 adet prensip karşımıza çıkıyor. Bunların isimleri ise şöyle:

  • Tekil Sorumluluk Prensibi (Single Responsibility Principle)
  • Açıklık – Kapalılık Prensibi (Open – Closed Principle)
  • Liskov’un Yer Değiştirme Prensibi (Liskov’s Substitution Principle)
  • Interface Ayrım Prensibi (Interface Segregation Principle)
  • Bağlılığı Ters Çevirme Prensibi (Dependency Inversion Principle)

İngilizcelerinin ilk harfi ile SOLID, bizim sağlıklı tasarımlar yapmamıza olanak sağlayan prensipler bütünüdür sevgili dostlarım.

Evet. Bundan sonraki yazılarımızda, bu prensipleri şahane örneklerle inceliyor olacağız.

O zamana kadar ayağınızı sıcak, başınızı serin tutun.

 

Leave a Reply

4 Comments