Soyut temel sınıfların kullanılmasının iki yolu vardır.
Soyut nesnenizi uzmanlaştırıyorsunuz, ancak tüm istemciler türetilen sınıfı temel arabirimi üzerinden kullanacak.
Tasarımınızdaki nesnelerdeki yinelemeyi ortadan kaldırmak için soyut bir temel sınıf kullanıyorsunuz ve istemciler somut uygulamaları kendi arabirimleri aracılığıyla kullanıyor.!
1 için Çözüm - Strateji Kalıbı
İlk durumunuz varsa, aslında soyut sınıfta türetilmiş sınıflarınızın uyguladığı sanal yöntemlerle tanımlanan bir arabiriminiz vardır.
Bunu gerçek bir arayüz yapmayı, soyut sınıfınızı somut olarak değiştirmeyi ve yapıcısında bu arayüzün bir örneğini almayı düşünmelisiniz. Ardından türetilmiş sınıflarınız bu yeni arayüzün uygulamaları haline gelir.
Bu, yeni arabirimin sahte bir örneğini ve şimdi herkese açık arabirim üzerinden her yeni uygulamayı kullanarak daha önce soyut olan sınıfınızı test edebileceğiniz anlamına gelir. Her şey basit ve test edilebilir.
Çözüm 2
İkinci durumunuz varsa, soyut sınıfınız yardımcı bir sınıf olarak çalışmaktadır.
İçerdiği işlevselliğe bir göz atın. Bu çoğaltmayı en aza indirmek için herhangi birinin manipüle edilen nesnelere itilip itilemeyeceğini görün. Hâlâ bir şey kaldıysa, bunu somut uygulamanızın yapıcılarına aldığı yardımcı bir sınıf haline getirin ve temel sınıflarını kaldırın.
Bu yine basit ve kolayca test edilebilir somut sınıflara yol açar.
Kural olarak
Karmaşık nesnelerin basit bir ağı üzerinden basit nesnelerin karmaşık ağını tercih edin.
Genişletilebilir test edilebilir kodun anahtarı küçük yapı taşları ve bağımsız kablolamadır.
Güncellendi: Her ikisinin karışımları nasıl ele alınır?
Bu rollerin her ikisini birden gerçekleştiren bir temel sınıf olması mümkündür ... yani: ortak bir arayüze sahiptir ve korumalı yardımcı yöntemleri vardır. Bu durumda, yardımcı yöntemleri bir sınıfa (senaryo2) dahil edebilir ve miras ağacını bir strateji modeline dönüştürebilirsiniz.
Temel sınıfınızın doğrudan uyguladığı ve diğerlerinin sanal olduğu bazı yöntemleriniz olduğunu fark ederseniz, kalıtım ağacını bir strateji modeline dönüştürebilirsiniz, ancak sorumlulukların doğru bir şekilde hizalanmadığını ve yeniden düzenleme gerekir.
Güncelleme 2: Adım Taşı Olarak Soyut Sınıflar (2014/06/12)
Geçen gün soyut kullandığım bir durum vardı, bu yüzden nedenini araştırmak istiyorum.
Konfigürasyon dosyalarımız için standart bir formatımız var. Bu özel araç, hepsi bu biçimde 3 yapılandırma dosyasına sahiptir. Her ayar dosyası için kuvvetle yazılan bir sınıf istedim, bu yüzden bağımlılık enjeksiyonu yoluyla bir sınıf, bakımını yaptığı ayarları isteyebilir.
Bu, ayarları dosya biçimlerini ve bu yöntemleri aynı yöntemleri maruz türetilmiş sınıfları ayrıştırma bilen, ama ayarları dosyasının konumunu kapsüllenmiş soyut bir temel sınıf sahip tarafından uygulandı.
Ben 3 sınıfları sarılmış ve daha sonra veri erişim yöntemleri ortaya çıkarmak için temel sınıfa delege bir "SettingsFileParser" yazmış olabilir. Ben bunu yapmaması için seçti henüz daha 3 türetilmiş sınıfları yol açacak şekilde heyeti her şeyden daha onlara kod.
Ancak ... bu kod geliştikçe ve bu ayar sınıflarının her birinin tüketicileri daha açık hale gelir. Her ayar, kullanıcılar bazı ayarları soracak ve bir şekilde dönüştüreceklerdir (ayarlar metin olduğu için, bunları sayılara dönüştüren nesnelerde sarabilirler). Bu gerçekleştikçe, bu mantığı veri işleme yöntemlerine çıkarmaya ve bunları güçlü bir şekilde yazılan ayar sınıflarına geri itmeye başlayacağım. Bu, her ayar kümesi için daha yüksek bir arayüze yol açacaktır, bu da sonunda 'ayarlar' ile uğraştığının farkında değildir.
Bu noktada, güçlü bir şekilde yazılan ayar sınıfları artık temeldeki 'ayarlar' uygulamasını ortaya çıkaran "alıcı" yöntemlerine ihtiyaç duymayacaktır.
Bu noktada artık ortak arabirimlerinin ayar erişimci yöntemlerini içermesini istemem; bu yüzden ondan türetmek yerine bir ayarları ayrıştırıcı sınıfını kapsüllemek için bu sınıfı değiştireceğim.
Bu nedenle Abstract sınıfı: şu anda temsilci kodundan kaçınmanın bir yolu ve daha sonra tasarımı değiştirmem gerektiğini hatırlatmak için koddaki bir işaretçi. Ona asla ulaşamayabilirim, bu yüzden iyi bir süre yaşayabilir ... sadece kod söyleyebilir.
Bunu herhangi bir kural ile doğru buluyorum ... "statik yöntem yok" veya "özel yöntem yok" gibi. Kodda bir koku olduğunu gösteriyorlar ... ve bu iyi. Kaçırdığınız soyutlamayı aramanızı sağlar ... ve bu arada müşterinize değer sağlamaya devam etmenizi sağlar.
Vadilerinde korunabilir kodun yaşadığı bir manzara tanımlayan bunun gibi kurallar hayal ediyorum. Yeni davranışlar ekledikçe, kodunuza yağmur yağması gibi. Başlangıçta onu nereye koyarsanız koyun, o zaman iyi tasarım güçlerinin davranışı vadilerde bitene kadar itmeye izin vermeyi yeniden düzenlersiniz.