Últimamente me preocupa el uso de clases abstractas.
A veces se crea una clase abstracta por adelantado y funciona como una plantilla de cómo funcionarían las clases derivadas. Eso significa, más o menos, que proporcionan una funcionalidad de alto nivel, pero omite ciertos detalles para ser implementados por las clases derivadas. La clase abstracta define la necesidad de estos detalles al implementar algunos métodos abstractos. En tales casos, una clase abstracta funciona como un plano, una descripción de alto nivel de la funcionalidad o como quiera llamarlo. No se puede usar por sí solo, pero debe estar especializado para definir los detalles que se han dejado fuera de la implementación de alto nivel.
En otras ocasiones, sucede que la clase abstracta se crea después de la creación de algunas clases "derivadas" (dado que la clase principal / abstracta no está allí, todavía no se han derivado, pero ya sabes a qué me refiero). En estos casos, la clase abstracta generalmente se usa como un lugar donde puede colocar cualquier tipo de código común que contengan las clases derivadas actuales.
Habiendo hecho las observaciones anteriores, me pregunto cuál de estos dos casos debería ser la regla. ¿Debería extenderse algún tipo de detalle a la clase abstracta solo porque actualmente son comunes en todas las clases derivadas? ¿Debería existir un código común que no sea parte de una funcionalidad de alto nivel?
¿Debería existir un código que no tenga significado para la clase abstracta en sí solo porque resulta ser común para las clases derivadas?
Permítanme dar un ejemplo: la clase abstracta A tiene un método a () y un método abstracto aq (). El método aq (), en ambas clases derivadas AB y AC, utiliza un método b (). ¿Debería b () moverse a A? En caso afirmativo, en caso de que alguien mire solo a A (supongamos que AB y AC no están allí), ¡la existencia de b () no tendría mucho sentido! ¿Esto es malo? ¿Debería alguien poder echar un vistazo a una clase abstracta y comprender lo que está sucediendo sin visitar las clases derivadas?
Para ser honesto, al momento de preguntar esto, tiendo a creer que escribir una clase abstracta que tenga sentido sin tener que buscar en las clases derivadas es una cuestión de código limpio y arquitectura limpia. Ι Realmente no me gusta la idea de una clase abstracta que actúe como un volcado para cualquier tipo de código que es común en todas las clases derivadas.
¿Qué piensas / practicas?
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é? ¿No es posible que, en el curso del diseño y desarrollo de una aplicación, descubra que varias clases tienen una funcionalidad común que naturalmente se puede refactorizar en una clase abstracta? ¿Debo ser lo suficientemente clarividente como para anticipar esto antes de escribir cualquier código para las clases derivadas? Si no soy tan astuto, ¿tengo prohibido realizar una refactorización de este tipo? ¿Debo tirar mi código y comenzar de nuevo?