Ultimamente, estou preocupado com o uso de classes abstratas.
Às vezes, uma classe abstrata é criada com antecedência e funciona como um modelo de como as classes derivadas funcionariam. Isso significa, mais ou menos, que eles fornecem algumas funcionalidades de alto nível, mas deixam de fora certos detalhes a serem implementados pelas classes derivadas. A classe abstrata define a necessidade desses detalhes, colocando em prática alguns métodos abstratos. Nesses casos, uma classe abstrata funciona como um blueprint, uma descrição de alto nível da funcionalidade ou o que você quiser chamar. Ele não pode ser usado por si só, mas deve ser especializado para definir os detalhes que foram deixados de fora da implementação de alto nível.
Outras vezes, acontece que a classe abstrata é criada após a criação de algumas classes "derivadas" (uma vez que a classe pai / abstrato não está lá, elas ainda não foram derivadas, mas você sabe o que quero dizer). Nesses casos, a classe abstrata geralmente é usada como um local onde você pode colocar qualquer tipo de código comum que as classes derivadas atuais contenham.
Tendo feito as observações acima, estou me perguntando qual desses dois casos deve ser a regra. Deveria algum tipo de detalhe ser adicionado à classe abstrata apenas porque atualmente é comum em todas as classes derivadas? O código comum que não faz parte de uma funcionalidade de alto nível deve estar lá?
O código que pode não ter significado para a própria classe abstrata deve estar lá apenas porque é comum para as classes derivadas?
Deixe-me dar um exemplo: A classe abstrata A tem um método a () e um método abstrato aq (). O método aq (), nas duas classes derivadas AB e AC, usa o método b (). B () deve ser movido para A? Se sim, caso alguém olhe apenas para A (vamos fingir que AB e AC não estão lá), a existência de b () não faria muito sentido! Isso é ruim? Alguém deveria dar uma olhada em uma classe abstrata e entender o que está acontecendo sem visitar as classes derivadas?
Para ser sincero, no momento de perguntar isso, costumo acreditar que escrever uma classe abstrata que faça sentido sem precisar procurar nas classes derivadas é uma questão de código e arquitetura limpos. Ι realmente não gosto da idéia de uma classe abstrata que age como um despejo para qualquer tipo de código que seja comum em todas as classes derivadas.
O que você pensa / pratica?
Writing an abstract class that makes sense without having to look in the derived classes is a matter of clean code and clean architecture.
-- Por quê? Não é possível que, ao projetar e desenvolver um aplicativo, descubra que várias classes tenham uma funcionalidade comum que pode ser naturalmente refatorada em uma classe abstrata? Devo ser clarividente o suficiente para sempre antecipar isso antes de escrever qualquer código para classes derivadas? Se eu não for tão astuto, estou proibido de realizar tal refatoração? Devo jogar fora meu código e começar de novo?