Son zamanlarda soyut sınıfların kullanımı konusunda sıkıntı yaşıyorum.
Bazen soyut bir sınıf önceden yaratılır ve türetilmiş sınıfların nasıl çalışacağının bir şablonu olarak çalışır. Bu, az çok, yüksek düzeyde işlevsellik sağladıkları, ancak türetilmiş sınıflar tarafından uygulanacak belirli ayrıntıları bıraktığı anlamına gelir. Soyut sınıf, bazı soyut yöntemleri uygulayarak bu detaylara olan ihtiyacı tanımlar. Bu gibi durumlarda, soyut bir sınıf, bir taslak, işlevsellik hakkında yüksek düzeyde bir açıklama veya ona ne derseniz diye çalışır. Tek başına kullanılamaz, ancak üst düzey uygulamanın dışında bırakılan ayrıntıları tanımlamak için uzmanlaştırılmalıdır.
Diğer bazı zamanlarda, soyut sınıfın bazı "türetilmiş" sınıflar oluşturulduktan sonra yaratıldığı (ana / soyut sınıf orada olmadığı için, henüz türetilmedi, ancak ne demek istediğimi biliyorsun). Bu durumlarda, soyut sınıf genellikle geçerli türetilmiş sınıfların içerdiği her türlü ortak kodu koyabileceğiniz bir yer olarak kullanılır.
Yukarıdaki gözlemleri yaptıktan sonra, bu iki durumdan hangisinin kural olması gerektiğini merak ediyorum. Şu anda türetilmiş tüm sınıflarda ortak oldukları için soyut sınıfa kadar herhangi bir ayrıntı kabartılmalı mıdır? Üst düzey bir işlevselliğin parçası olmayan ortak kod olmalı mı?
Soyut sınıfın kendisi için bir anlamı olmayabilecek olan kod, sadece türetilmiş sınıflar için ortak olduğu için orada olmalı mıdır?
Bir örnek vereyim: Soyut sınıf A'nın bir () yöntemi ve bir soyut yöntemi aq () vardır. Her iki türetilmiş AB ve AC sınıfında aq () yöntemi, b () yöntemini kullanır. B () A'ya mı taşınmalı? Eğer evet ise, o zaman birisinin sadece A'ya bakması durumunda (AB ve AC'nin orada olmadığını varsayalım), b () 'nin varlığı pek mantıklı olmaz! Bu kötü bir şey mi? Birisi soyut bir sınıfa bakıp türetilmiş sınıfları ziyaret etmeden neler olduğunu anlayabilmeli mi?
Dürüst olmak gerekirse, bunu sorma anında, türetilmiş sınıflara bakmak zorunda kalmadan mantıklı bir soyut sınıf yazmanın temiz kod ve temiz mimari meselesi olduğuna inanıyorum. Any Her tür kod için bir döküm gibi davranan soyut bir sınıf fikrini gerçekten sevmiyorum, türetilmiş tüm sınıflarda yaygındır.
Ne düşünüyorsun / pratik yapıyorsun?
Writing an abstract class that makes sense without having to look in the derived classes is a matter of clean code and clean architecture.
-- Neden? Bir uygulama tasarlarken ve geliştirirken, birkaç sınıfın doğal olarak soyut bir sınıfa yeniden yansıtılabilen ortak işlevselliğe sahip olduğunu keşfetmem mümkün değil mi? Türetilmiş sınıflar için herhangi bir kod yazmadan önce bunu her zaman tahmin edebilecek kadar basiretli olmam gerekir mi? Eğer bu kadar zekice olmazsam, böyle bir yeniden düzenleme yapmam yasak mı? Kodumu atmam ve baştan başlamam gerekir mi?