Di recente ho incontrato la seguente situazione.
class A{
public:
void calculate(T inputs);
}
In primo luogo, A
rappresenta un oggetto nel mondo fisico, che è un argomento forte per non dividere la classe. Ora, calculate()
risulta essere una funzione piuttosto lunga e complicata. Percepisco tre possibili strutture per questo:
- scrivilo come un muro di testo - vantaggi - tutte le informazioni sono in un unico posto
- scrivere
private
funzioni di utilità nella classe e usarle nelcalculate
corpo - svantaggi - il resto della classe non conosce / cura / capisce questi metodi scrivi
calculate
nel modo seguente:void A::calculate(T inputs){ auto lambda1 = () [] {}; auto lambda2 = () [] {}; auto lambda3 = () [] {}; lambda1(inputs.first_logical_chunk); lambda2(inputs.second_logical_chunk); lambda3(inputs.third_logical_chunk); }
Può essere considerata una pratica buona o cattiva? Questo approccio rivela problemi? Tutto sommato, dovrei considerare questo come un buon approccio quando mi trovo di nuovo di fronte alla stessa situazione?
MODIFICARE:
class A{
...
public:
// Reconfiguration of the algorithm.
void set_colour(double colour);
void set_density(double density);
void set_predelay(unsigned long microseconds);
void set_reverb_time(double reverb_time, double room_size);
void set_drywet(double left, double right);
void set_room_size(double value);;
private:
// Sub-model objects.
...
}
Tutti quei metodi:
- ottenere un valore
- calcola altri valori, senza usare state
- chiama alcuni degli "oggetti del modello secondario" per modificarne lo stato.
Si scopre che, ad eccezione di set_room_size()
questi metodi, si passa semplicemente il valore richiesto ai sotto-oggetti.set_room_size()
d'altra parte, fa un paio di schermate di formule oscure e poi (2) fa una mezza schermata di chiamare setter di oggetti secondari per applicare i vari risultati ottenuti. Pertanto, ho separato la funzione in due lambda e li ho chiamati alla fine della funzione. Se fossi stato in grado di dividerlo in blocchi più logici, avrei isolato più lambda.
Indipendentemente da ciò, l'obiettivo della domanda attuale è determinare se quel modo di pensare dovrebbe persistere, o nella migliore delle ipotesi non è aggiungere valore (leggibilità, manutenibilità, capacità di debug ecc.).
Firstly, A represents an object in the physical world, which is a strong argument for not splitting the class up.
A
Rappresenta sicuramente i dati su un oggetto che potrebbe esistere nel mondo fisico. Puoi avere un'istanza A
senza l'oggetto reale e un oggetto reale senza un'istanza di A
, quindi trattarli come se fossero uno e lo stesso non ha senso.
calculate()
conoscerà quelle sotto-funzioni.
A
, questo è un po 'estremo.
A
rappresenta un oggetto nel mondo fisico, che è un argomento forte per non dividere la classe." Purtroppo, mi è stato detto questo quando ho iniziato a programmare. Mi ci sono voluti anni per rendermi conto che si tratta di un mucchio di hockey a cavallo. È un motivo terribile per raggruppare le cose. Non riesco a capire quali siano i buoni motivi per raggruppare le cose (almeno con mia soddisfazione), ma quello è uno che dovresti scartare in questo momento. Alla fine, essere tutti di "buon codice" è che funziona bene, è relativamente facile da capire ed è relativamente facile da cambiare (cioè, i cambiamenti non hanno strani effetti collaterali).