Progettazione della configurazione per i sottooggetti

4

Ho la seguente situazione: ho una classe (chiamiamola Main) che incapsula un processo complesso. Questa classe a sua volta orchestra una sequenza di subalgoritmi (AlgoA, AlgoB), ognuno rappresentato da una classe individuale.

Per configurare Main, ho una configurazione memorizzata in un oggetto di configurazione MainConfig. Questo oggetto contiene tutte le informazioni di configurazione per AlgoA e AlgoB con i loro parametri specifici. AlgoA non ha interesse per le informazioni relative alla configurazione di AlgoB, quindi tecnicamente potrei avere (e in pratica ho) delle istanze MainConfig.AlgoAConfig e MainConfig.AlgoBConfig contenute e inizializzare come AlgoA (MainConfig.AlgoAConfig) e AlgoB (MainConfig) .AlgoBConfig).

Il problema è che ci sono alcuni dati di configurazione comuni. Un esempio è il printLevel. Al momento ho MainConfig.printLevel. Devo propagare queste informazioni sia ad AlgoA che ad AlgoB, perché devono sapere quanto stampare. MainConfig ha anche bisogno di sapere quanto stampare. Quindi le soluzioni disponibili sono

  1. Ho passato il MainConfig ad AlgoA e AlgoB. In questo modo, AlgoA ha tecnicamente accesso all'intera configurazione (anche quella di AlgoB) ed è meno autosufficiente
  2. Copio MainConfig.printLevel in AlgoAConfig e AlgoBConfig, quindi sostanzialmente ho ripetuto tre informazioni printLevel.
  3. Creo una terza classe di configurazione PrintingConfig. Ho una variabile di istanza MainConfig.printingConfig, e poi passo ad AlgoA sia MainConfig.AlgoAConfig che MainConfig.printingConfig.

Hai mai trovato questa situazione? Come l'hai risolto ? Quale è stilisticamente più chiaro per un nuovo lettore del codice?

    
posta Stefano Borini 15.06.2012 - 14:21
fonte

1 risposta

7

Direi che è meglio avere più classi piccole con una sola responsabilità rispetto a un grande configuratore di divinità, anche se questo significa che avrai qualche duplicazione.

Se la logica duplicata è complicata (presumo che printLevel fosse solo un esempio semplificato), puoi risolverlo creando un oggetto specifico per printLevel e impacchettandolo negli altri.

Nel tuo esempio, significherebbe

  • eliminare completamente MainConfig e inserire la configurazione di stampa comune in PrintConfig
  • aggrega la nuova classe dove è necessaria, per ex AlgoAConfig.PrintConfig e AlgoBConfig.PrintConfig

    
risposta data 15.06.2012 - 14:42
fonte

Leggi altre domande sui tag