Sono abbastanza nuovo ai principi di progettazione SOLID . Capisco la loro causa e i loro benefici, ma non riesco ad applicarli a un progetto più piccolo che voglio refactificare come esercizio pratico per usare i principi SOLIDI. So che non è necessario modificare un'applicazione che funzioni perfettamente, ma voglio comunque riformattarla per acquisire esperienza di progettazione per progetti futuri.
L'applicazione ha il seguente compito (in realtà molto più di questo ma manteniamolo semplice): Deve leggere un file XML che contiene le definizioni Tabella database / Colonna / Visualizza ecc. E creare un file SQL che può essere utilizzato per creare uno schema di database ORACLE.
(Nota: si prega di astenersi dal discutere perché ne ho bisogno o perché non uso XSLT e così via, ci sono ragioni, ma sono fuori tema.)
Per iniziare, ho scelto di guardare solo le tabelle e i vincoli. Se si ignorano le colonne, è possibile dichiararlo nel modo seguente:
Un vincolo fa parte di una tabella (o più precisamente, parte di un'istruzione CREATE TABLE) e un vincolo può anche fare riferimento a un'altra tabella.
Innanzitutto, spiegherò come appare l'applicazione in questo momento (non applicando SOLID):
Al momento, l'applicazione ha una classe "Tabella" che contiene un elenco di puntatori a Vincoli di proprietà della tabella e un elenco di puntatori a Vincoli che fanno riferimento a questa tabella. Ogni volta che viene stabilita una connessione, verrà stabilita anche la connessione all'indietro. La tabella ha un metodo createStatement () che a sua volta chiama la funzione createStatement () di ciascun vincolo. Detto metodo utilizzerà le connessioni alla tabella del proprietario e alla tabella di riferimento per recuperare i loro nomi.
Ovviamente, questo non si applica affatto a SOLID. Ad esempio, ci sono dipendenze circolari, che gonfiavano il codice in termini di metodi "aggiungi" / "rimuovi" richiesti e alcuni distruttori di oggetti di grandi dimensioni.
Quindi ci sono un paio di domande:
- Devo risolvere le dipendenze circolari utilizzando Iniezione dipendenze? In tal caso, suppongo che il Vincolo debba ricevere la tabella del proprietario (e facoltativamente la referenziata) nel suo costruttore. Ma come potrei quindi scorrere l'elenco dei vincoli per una singola tabella?
- Se la classe Table memorizza sia lo stato di se stesso (ad esempio il nome della tabella, il commento della tabella ecc.) Sia i collegamenti ai Vincoli, queste o una o due "responsabilità" stanno pensando al principio di responsabilità singola?
- Nel caso 2. è giusto, devo semplicemente creare una nuova classe nel livello aziendale logico che gestisce i collegamenti? In tal caso, 1. ovviamente non sarebbe più pertinente.
- I metodi "createStatement" dovrebbero far parte delle classi Table / Constraint o dovrei spostarli anch'essi? In tal caso, dove? Una classe Manager per ogni classe di archiviazione dei dati (ad es. Tabella, vincolo, ...)? O piuttosto creare una classe manager per collegamento (simile a 3.)?
Ogni volta che provo a rispondere a una di queste domande, mi ritrovo a correre in cerchio da qualche parte.
Il problema ovviamente diventa molto più complesso se includi colonne, indici e così via, ma se mi aiutate con la semplice cosa Tabella / Vincolo, potrei forse risolvere il resto da solo.