Crea un'istanza di una classe da un file di configurazione. Dove dovrebbe andare la funzione di analisi?

0

Ho una classe in python che viene istanziata dai valori di un file di configurazione (json). Mi stavo chiedendo quale sia la migliore pratica per farlo (se esiste una buona pratica e non è solo una questione di preferenze personali).

  • Io chiamo una funzione read_config (che è definita al di fuori della classe) nel mio main, che analizza il mio file di configurazione e restituisce la configurazione come dizionario. Quindi, istanzio la classe usando questo dizionario.

o

  • Istanzia la classe dando il nome del file di configurazione. Nella mia classe c'è il metodo read_config che imposta le mie variabili di istanza.

Nel primo metodo trovo positivo che io sia un po 'più flessibile da dove ottengo i miei dati di configurazione. Potrebbe essere un file o anche un dizionario hard-coded. C'è qualche regola di progettazione del software che dovrebbe essere seguita o non importa davvero?

    
posta Cobra Kai Dojo 21.06.2017 - 20:59
fonte

1 risposta

-2

Il modello di progettazione per la costruzione di oggetti è chiamato schema di fabbrica .

Il mio suggerimento è di creare una fabbrica astratta che prende il dizionario analizzato e restituisce l'oggetto istanziato (in pseudocode fp):

// FooFactory is a function that takes a dictionary and produces a Foo
FooFactory = Dict => Foo

def defaultFooFactory(dict: Dict): Foo
    // from dict
    return Foo(...)

Per indirizzare dove deve essere analizzato il file JSON, puoi implementare FooFactory per questo:

def jsonFooFactory(fileName: String, delegate: FooFactory)(dict: Map[String, Object]): Foo =
    // load json file from fileName and merge it with passed dict
    combinedDict = ...
    return delegate(combinedDict)

Quindi nella tua composizione root devi costruire la fabbrica scelta:

factory = jsonFooFactory ("config.json", defaultFooFactory)

Puoi passare attorno alla tua fabbrica e creare istanze di Foo ogni volta che vuoi:

factory(// overrides to json could be passed here)

I vantaggi di questo modello sono:

  • Segue il principio della singola responsabilità. Una classe non dovrebbe sapere come istanziare se stessa
  • Abstracts la costruzione di Foo . Puoi modificare il modo in cui instanziari Foo implementando il nuovo FooFactory s.
  • Aggiunge un livello di astrazione che disaccoppia e migliora la testabilità
risposta data 21.06.2017 - 23:31
fonte

Leggi altre domande sui tag