Sono abbastanza nuovo nei principi di design S.O.L.I.D. . Capisco la loro causa e i loro benefici, ma non riesco ad applicarli a un progetto più piccolo che voglio refactoring come un esercizio pratico per utilizzare i principi SOLID. So che non c'è bisogno di cambiare un'applicazione che funzioni perfettamente, ma voglio rifattorizzarla comunque, così acquisisco esperienza di progettazione per progetti futuri.
L'applicazione ha il seguente compito (in realtà molto più di quello, ma facciamo in modo che sia semplice): Deve leggere un file XML che contiene le definizioni Database / Column / View etc del database e creare un file SQL che può essere utilizzato per creare uno schema di database ORACLE.
(Nota: si prega di astenersi dal discutere perché ho bisogno o perché non uso XSLT e così via, ci sono dei motivi, ma sono fuori tema.)
Come inizio, ho scelto di guardare solo Tabelle e Vincoli. Se ignori le colonne, puoi dichiararlo nel seguente modo:
Un vincolo è parte di una tabella (o più precisamente, parte di un'istruzione CREATE TABLE), e un vincolo può fare riferimento anche a un'altra tabella.
In primo luogo, spiegherò l'aspetto dell'applicazione al 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 ogni vincolo. Il metodo detto utilizzerà le connessioni alla tabella del proprietario e alla tabella di riferimento per recuperarne i nomi.
Ovviamente, questo non si applica a SOLID. Ad esempio, ci sono delle dipendenze circolari che hanno gonfiato il codice in termini di metodi "aggiungi" / "rimuovi" richiesti e alcuni grandi distruttori di oggetti.
Quindi ci sono un paio di domande:
- Devo risolvere le dipendenze circolari usando Iniezione delle dipendenze? In tal caso, suppongo che il vincolo debba ricevere la tabella del proprietario (e facoltativamente del riferimento) nel suo costruttore. Ma come posso eseguire l'elenco dei vincoli per una singola tabella, quindi?
- Se la classe Tabella memorizza entrambi lo stato di se stesso (ad es. nome tabella, commento tabella ecc.) e i collegamenti a Vincoli, sono queste una o due "responsabilità", pensando al Principio di Responsabilità Unica?
- Nel caso in cui 2. abbia ragione, dovrei semplicemente creare una nuova classe nel livello aziendale logico che gestisce i collegamenti? Se è così, 1. ovviamente non sarebbe più rilevante.
- I metodi "createStatement" faranno parte delle classi Table / Constraint o dovrei spostarli anch'essi? Se sì, dove? Una classe Manager per ogni classe di archiviazione dati (ad es. Tabella, Vincolo, ...)? O meglio crea una classe manager per link (simile a 3.)?
Ogni volta che cerco di rispondere a una di queste domande mi trovo a correre in cerchio da qualche parte.
Il problema diventa ovviamente molto più complesso se includi colonne, indici e così via, ma se voi ragazzi mi aiutate con la semplice cosa Table / Constraint, potrò forse risolvere il resto da solo.