Supponiamo di avere una funzione dichiarata pubblicamente
Result ComputeResult(Foo foo);
la cui implementazione è complessa e richiede alcune strutture dati temporanee. Potrei suddividere l'implementazione in passaggi per migliorare la comprensione:
Result ComputeResult(Foo foo) {
Result result;
std::map<Bar, Baz> bar_to_baz;
std::vector<Baz> extra_bazzes;
GroupByBar(foo, &bar_to_baz, &extra_bazzes);
AppendExtraBazzes(extra_bazzes, &bar_to_baz);
ModifyBazzes(&bar_to_baz);
// etc
PopulateResult(bar_to_baz, &result);
return result;
}
Il passaggio delle strutture temporanee può risultare complicato, specialmente se le chiamate sono nidificate; un parametro può essere indirettamente rilevante solo per la chiamata di livello superiore. In alcuni casi trovo più leggibile definire una classe helper per tenerli, istanziati una volta per invocazione funzione:
class ResultComputer {
public:
ResultComputer(Foo foo) : foo_(foo) {}
Result Compute() {
GroupByBar();
AppendExtraBazzes();
ModifyBazzes();
// etc
PopulateResult();
return result_;
}
private:
void GroupByBar();
void AppendExtraBazzes();
void ModifyBazzes();
void PopulateResult();
Foo foo_;
Result result_;
std::map<Bar, Baz> bar_to_baz_;
std::vector<Baz> extra_bazzes_;
};
Result ComputeResult(Foo foo) {
return ResultComputer(foo).Compute();
}
Ricordo vagamente qualche consiglio su questo ma non riesco a trovarlo - non so cosa cercare. Questo modello ha un nome?
Nota: non sto chiedendo il valore del modello; questa è una domanda a parte Non sto certamente chiedendo commenti dettagliati sul mio esempio (molto forzato).