Passa la posizione di archiviazione alla funzione di fabbrica e memorizzala tu stesso

0

Ho incontrato un sacco di codice in cui essenzialmente stanno facendo

void CreateFoo(string foo_param_1, int foo_param_2, vector<Foo> *foo_storage) {
    Foo new_foo = FooFactory();
    new_foo.set_param_1(foo_param_1);
    new_foo.set_param_2(foo_param_2);
    foo_storage->push_back(new_foo);
}

Per me questo sembra un design orribile perché ora c'è un misto di preoccupazioni nella creazione e nell'archiviazione di Foo s. È una pratica comune? Se è così, qualcuno può spiegare perché è buono?

Il mio istinto è che dovrebbe essere

Foo CreateFoo(string foo_param_1, int foo_param_2) {
    Foo new_foo = FooFactory();
    new_foo.set_param_1(foo_param_1);
    new_foo.set_param_2(foo_param_2);
    return new_foo;
}

foo_storage.push_back(CreateFoo("hello", 10));
    
posta Nick Chapman 01.08.2018 - 17:40
fonte

2 risposte

2

È impossibile rispondere a qualcosa di simile in isolamento. Se ha senso avere un'API come il CreateFoo esistente dipende da come tale API viene utilizzata nella pratica.

La tua riscrittura è quasi sempre peggiore, comunque. CreateFoo è quindi una fabbrica di alimenti, così come "FooFactory". Qual è stato il valore aggiunto nella funzione CreateFoo?

Forse non c'è alcun valore in QUALSIASI funzione di CreateFoo, e dovresti scrivere:

foo_storage.push_back(FooFactory("hello", 10));

My $ 0.02 ....

    
risposta data 01.08.2018 - 18:05
fonte
0

Se il design del sistema è tale che un Foo deve essere sempre aggiunto a foo_storage dopo la creazione, allora il primo CreateFoo è corretto.

Separando le chiamate, si introduce la possibilità di bug dal codice che chiama CreateFoo () e non si segue con foo_storage.push_back ().

    
risposta data 01.08.2018 - 20:44
fonte

Leggi altre domande sui tag