Soy bastante nuevo en los principios de diseño SOLID . Entiendo su causa y beneficios, pero no logro aplicarlos a un proyecto más pequeño que quiero refactorizar como ejercicio práctico para usar los principios SOLID. Sé que no hay necesidad de cambiar una aplicación que funcione perfectamente, pero quiero refactorizarla de todos modos para ganar experiencia en diseño para futuros proyectos.
La aplicación tiene la siguiente tarea (en realidad, mucho más que eso, pero vamos a simplificarla): tiene que leer un archivo XML que contenga definiciones de tabla / columna / vista de base de datos, etc. y crear un archivo SQL que pueda usarse para crear un esquema de base de datos ORACLE.
(Nota: absténgase de discutir por qué lo necesito o por qué no uso XSLT, etc., hay razones, pero están fuera de tema).
Como comienzo, elegí mirar solo las Tablas y Restricciones. Si ignora las columnas, puede indicarlo de la siguiente manera:
Una restricción es parte de una tabla (o más precisamente, parte de una instrucción CREATE TABLE), y una restricción también puede hacer referencia a otra tabla.
Primero, explicaré cómo se ve la aplicación en este momento (sin aplicar SOLID):
Por el momento, la aplicación tiene una clase "Tabla" que contiene una lista de punteros a Restricciones propiedad de la tabla y una lista de punteros a Restricciones que hacen referencia a esta tabla. Siempre que se establezca una conexión, también se establecerá la conexión hacia atrás. La tabla tiene un método createStatement () que a su vez llama a la función createStatement () de cada restricción. Dicho método usará las conexiones a la tabla del propietario y la tabla referenciada para recuperar sus nombres.
Obviamente, esto no se aplica a SOLID en absoluto. Por ejemplo, hay dependencias circulares, que hinchan el código en términos de los métodos "agregar" / "eliminar" necesarios y algunos destructores de objetos grandes.
Entonces hay un par de preguntas:
- ¿Debo resolver las dependencias circulares usando la inyección de dependencias? Si es así, supongo que la restricción debería recibir la tabla del propietario (y opcionalmente la referenciada) en su constructor. Pero, ¿cómo podría pasar sobre la lista de restricciones para una sola tabla entonces?
- Si la clase Tabla almacena el estado de sí misma (por ejemplo, el nombre de la tabla, el comentario de la tabla, etc.) y los enlaces a Restricciones, ¿estas son una o dos "responsabilidades", pensando en el Principio de responsabilidad única?
- En el caso 2. es correcto, ¿debería crear una nueva clase en la capa comercial lógica que gestiona los enlaces? Si es así, 1. obviamente ya no sería relevante.
- ¿Deberían los métodos "createStatement" formar parte de las clases Tabla / Restricción o también debería eliminarlos? Si es así, ¿a dónde? ¿Una clase de Administrador por cada clase de almacenamiento de datos (es decir, Tabla, Restricción, ...)? ¿O más bien crear una clase de administrador por enlace (similar a 3.)?
Cada vez que trato de responder una de estas preguntas, me encuentro corriendo en círculos en alguna parte.
Obviamente, el problema se vuelve mucho más complejo si incluye columnas, índices, etc., pero si me ayudan con la simple tabla / restricción, tal vez pueda resolver el resto por mi cuenta.