Bu günlerde iki kere okunması gereken kitaplardan Code Complete 2‘yi tekrar gözden geçiriyorum.Kitabın Chapter 6.6’da bulunan kaliteli sınıf tasarımı için kontrol edilmesi gerekenler başlığı altında yazdıklarını buraya yazmadan geçemedim. Sınıflarımızı tasarlarken aşağıdaki maddelere dikkat etmemiz sınıfların ve yazılımın kalitesini oldukça arttıracaktır. Türkçeye çevirerek yazıyorum.Aşağıdaki listede sınıfın arayüzü(class interface) kavramını java ya da C# daki interface kavramları ile karıştırmayın. Sınıfın arayüzü derken dışarıya kullanıma açtığı metodları kast edilir.Mesela bir sınıfın 4 metodu varsa bunlardan 3’ü private 1’i public ise sınıfın arayüzünü bu dışarıya açılan public metod temsil eder.
Soyut Veri Tipleri
- Programınızdaki soyut veri tiplerinin neler olduğunu düşünüp bunların kullanım açısından arayüzlerini değerlendirdiniz mi?
Soyutlama
- Sınıfın belirli bir amacı var mı?
- Sınıf iyi isimlendirilmiş mi ve ismi asıl amacını tanımlıyor mu?
- Sınıfın kullanım arayüzü iyi bir soyutlama sunuyor mu?
- Sınıfın arayüzü onun nasıl kullanılacağını belli ediyor mu?
- Sınıfın arayüzüne baktığınızda içinin nasıl implemente edildiğini düşündürmeyecek kadar iyi soyutlanmış mı?Sınıfı bir kara kutu(black box) olarak düşünebilirmisiniz?
- Sınıflar kendi iç yapılarını diğer sınıfların ulaşmasına izin vermeyecek şekilde iyi koruyor mu?
- Sınıflardan amaçları ile alakalı olmayan bilgiler çıkartılmış mı?
- Sınıfı başka sınıflar,bileşenlere ayırmayı düşündünüz mü?Sınıfları sadece tek sorumluluğu yerine getirecek kadar fazla ayırdınız mı?
- Sınıfın içini değiştirirken sınıf arayüzünün değişmemesine özen gösteriyormusunuz?
Encapsulation
- Kalıtım(inheritance) sadece IS-A(dır,dir..) ilişkileri için kullanılıyor mu?Kalıtım yapan sınıflar Liskov Substitution Principle’a uyuyormu?
- Sınıf dökümantasyonu kalıtımın nasıl yapılacağını tanımlıyor mu?
- Diğer sınıflardan kalıtım yapan sınıflar üzerine yazılamayacak metodların(non overridable) üzerine yazmaktan kaçınıyor mu?
- Kalıtım yapısı fazla derin değil mi?(Derin olmaması daha iyi)
- Kalıtım yapılan temel sınıflardaki bütün field lar private mı?
Diğer Konular
- Sınıf en fazla 7 veya daha az field içeriyor mu?
- Sınıf diğer sınıfların metodlarını minumum sayıda çağırıyor mu?
- Sınıf diğer sınıflar ile sadece gerçekten gerektiği anda iletişime geçiyormu?
- Sınıfın bütün elemanları yapıcı metodlarda oluşturuluyormu?
Aslında her madde ayrı ayrı bir yazı başlığı altında incelenebilir yeri geldikçe bunlar ile alakalı yazmaya çalışacağım. Fakat liste iyi sınıf tasarımı için yapılması gereken çoğu şeyi içeriyor. Sınıflarınızı listeyi kontrol ederek tekrar gözden geçirmenizde fayda var.