55

In prodotti software complessi e di grandi dimensioni la gestione delle impostazioni configurabili diventa un grave problema. Due approcci al problema sono:Quali schemi di progettazione possono essere applicati al problema delle impostazioni di configurazione?

  • fare in modo che ogni componente nel sistema carichi la propria configurazione dai file di configurazione o dalle impostazioni del Registro di sistema.
  • dispone di una classe del caricatore di impostazioni che carica tutte le impostazioni di sistema configurabili e che ogni componente richiede il caricatore di impostazioni per le sue impostazioni.

Questi approcci mi sembrano entrambi sbagliati.

Esistono schemi di progettazione che potrebbero essere utilizzati per semplificare il problema? Forse qualcosa che potrebbe trarre vantaggio dalla tecnica di iniezione delle dipendenze.

+4

Perché pensi che l'opzione 2 sia sbagliata? – ChaosPandion

+2

Di solito è implementato come un singleton, sebbene ci siano altri modi per implementarlo. –

risposta

37

Preferisco creare un'interfaccia per impostare query, caricamento e salvataggio. Usando l'iniezione di dipendenza, posso iniettare questo in ogni componente che lo richiede.

Ciò consente flessibilità in termini di sostituzione della strategia di configurazione e fornisce una base comune su cui lavorare. Lo preferisco ad un unico "caricatore di impostazioni" globale (opzione 2), soprattutto perché posso ignorare il meccanismo di configurazione per un singolo componente se devo assolutamente farlo.

+0

ciao, sarà bello se condividi qualche campione :) – issamux

17

Attualmente lavoro su un sistema in cui la configurazione è gestita da un oggetto Singleton globale che mantiene una mappa delle chiavi di configurazione ai valori. In generale, vorrei che non fosse stato fatto in questo modo perché può causare colli di bottiglia nel sistema ed è sciatto per il test delle unità, ecc.

Penso che Reed Copsey abbia il diritto di farlo (l'ho votato) , ma consiglio vivamente la lettura di grande articolo di Martin Fowler su iniezione di dipendenza:

http://martinfowler.com/articles/injection.html

Un leggero addendum troppo ... se si vuole fare qualsiasi tipo di oggetto unit testing finto, l'iniezione di dipendenza è sicuramente la strada da partire.

+0

Sembra che il decoratore corrisponda alle tue esigenze. Puoi creare un decoratore Serializable che sarà in grado di rendere le classi serializzabili a modo loro. La strategia può essere usata per fare in modo che tutti gli oggetti abbiano la loro strategia per la serializzazione. Gli oggetti che non devono essere serializzati possono utilizzare la strategia ignora. Quelli che hanno solo bisogno di serializzare i loro campi, la strategia OnlyFields e così via. Sarai flessibile nell'aggiungere nuove cose alla tua configurazione. Sicuro come tutti gli approcci questo ha i suoi pro e contro. –

3

Che ne dici di questo. Si definisce un'interfaccia configurabile con un singolo metodo configure (configurazione). L'argomento di configurazione è semplicemente una tabella hash che associa i nomi dei parametri di configurazione con i loro valori.

Gli oggetti root possono creare una hash di configurazione nel modo desiderato (ad es. Leggerla da un file di configurazione). Questo hashtable può contenere parametri di configurazione per l'oggetto radice iselft, più qualsiasi parametro che uno dei suoi componenti, sotto-componenti, sotto-sotto-componenti (etc) potrebbe usare.

L'oggetto radice richiama quindi configure (configuration) su tutti i suoi componenti configurabili.