Anche se sto programmando in C ++ da un po 'di tempo, sono sempre di fronte a decisioni di progettazione (probabilmente a causa della flessibilità della lingua). Uno di questi problemi è decidere se un metodo dovrebbe essere parte della classe o meno.
Ad esempio, spesso ho una classe Simulation
simile alla seguente,
class Simulation{
public:
Simulation(void);
bool init(const char* init_file){
//...
particles_ = read_particles(init_file);
//etc
}
//or even,
bool init(int argc, char* argv[]);
void run(void);
private:
std::vector particles_;
//Other private members
};
Qui, non sono sicuro se questo metodo init, che analizza un file e inizializzi la simulazione, dovrebbe essere davvero un metodo di classe. Un modo diverso per implementare funzionalità simili sarebbe avere una funzione o una classe esterna che gestisce l'analisi degli argomenti della riga di comando o del file di inizializzazione e chiama i metodi appropriati della classe Simulation
.
bool init_simulation(Simulation& sim, const char* init_file){
//...
Particles particles = read_particles(init_file);
sim.set_particles(particles);
//etc
}
Da un lato è più semplice implementare la funzionalità come metodo di classe ed evita di dover introdurre nuove classi / strutture, in particolare per il passaggio dei parametri. D'altra parte, la gestione esterna dell'inizializzazione significa che è possibile estenderla più facilmente, sebbene eventuali modifiche alla classe Simulation
si propagheranno alla funzione.
Qual è il design preferito in situazioni simili a quelle sopra descritte, e come dovrei affrontare simili decisioni di design?