Riscrive condizionali in OOP senza generici

1

Diciamo che ho un set di oggetti,

foo f;
bar br;
baz bz;

Ho anche una stringa di dati JSON,

string JSONstring;

A seconda del tipo di oggetto della stringa JSON, ho bisogno di trasformarlo in foo, bar o baz. Ok, bello, avrò un metodo per questo.

public object parseJSONToFooBarBaz(string jsonString);

Quello che voglio evitare è scrivere qualcosa come:

map<string, object> topLevelJSON = deserialized json string;

if(map[foo] != null) return new foo(jsonString);
else if(map[bar] != null) return new bar(jsonString);
...
// And the list balloons up and is difficult to maintain

Credo che questo sia un buon condiscendente o quasi un buon candidato per un modello di fabbrica, ma qualcosa non sembra giusto. C'è una soluzione semplice che sto trascurando, o un insieme di condizioni o un interruttore / caso davvero un modo OK per risolvere questo?

    
posta Gelby 26.01.2016 - 22:54
fonte

1 risposta

4

La cosa più semplice da fare è creare un map<string, string -> object) dove string -> object significa semplicemente una funzione che prende un string e produce un object . Se la lingua che stai utilizzando non supporta le funzioni di prima classe, puoi utilizzare il modello di strategia. Il pattern Factory è essenzialmente solo un caso speciale del pattern Strategy e quindi solo un modo round di fare funzioni di prima classe (anche se il termine "Factory" comunica l'intento.)

Potresti quindi fare qualcosa del tipo:

foreach(key in factories.keys()) {
    if(topLevelJSON[key] != null) {
        return factories[key](jsonString);
    }
}

Presumo che queste chiavi si escludano a vicenda (come suggerito dalle tue dichiarazioni if), sebbene tu possa facilmente adattare il codice per restituire tutte le scelte o avere un elenco delle fabbriche in ordine di priorità.

    
risposta data 27.01.2016 - 03:53
fonte

Leggi altre domande sui tag