Ich bin kürzlich auf die folgende Situation gestoßen.
class A{
public:
void calculate(T inputs);
}
Erstens A
stellt es ein Objekt in der physischen Welt dar, was ein starkes Argument dafür ist, die Klasse nicht aufzuteilen. Nun calculate()
stellt sich heraus, dass es eine ziemlich lange und komplizierte Funktion ist. Ich sehe drei mögliche Strukturen dafür:
- Schreiben Sie es als Textwand - Vorteile - alle Informationen sind an einem Ort
- Schreiben Sie
private
Hilfsfunktionen in die Klasse und verwenden Sie sie imcalculate
Hauptteil - Nachteile - der Rest der Klasse kennt / kümmert sich / versteht nicht um diese Methoden schreibe wie
calculate
folgt: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); }
Kann dies als eine gute oder schlechte Praxis angesehen werden? Zeigt dieser Ansatz irgendwelche Probleme? Alles in allem sollte ich dies als einen guten Ansatz betrachten, wenn ich wieder mit der gleichen Situation konfrontiert bin?
BEARBEITEN:
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.
...
}
Alle diese Methoden:
- einen Wert bekommen
- Berechnen Sie einige andere Werte, ohne state zu verwenden
- Rufen Sie einige der "Submodell-Objekte" auf, um ihren Status zu ändern.
Mit Ausnahme set_room_size()
dieser Methoden wird der angeforderte Wert einfach an Unterobjekte übergeben. set_room_size()
Auf der anderen Seite werden einige Bildschirme mit undurchsichtigen Formeln angezeigt, und dann wird (2) ein halber Bildschirm zum Aufrufen von Unterobjektsetzern ausgeführt, um die verschiedenen erhaltenen Ergebnisse anzuwenden. Deshalb habe ich die Funktion in zwei Lambdas aufgeteilt und am Ende der Funktion aufgerufen. Hätte ich es in logischere Stücke aufteilen können, hätte ich mehr Lambdas isoliert.
Unabhängig davon besteht das Ziel der aktuellen Frage darin, festzustellen, ob diese Denkweise fortbestehen soll oder ob sie allenfalls keinen Mehrwert bringt (Lesbarkeit, Wartbarkeit, Debug-Fähigkeit usw.).
Firstly, A represents an object in the physical world, which is a strong argument for not splitting the class up.
Sicherlich A
stellt Daten über ein Objekt , das existieren könnte in der physischen Welt. Sie können eine Instanz von A
ohne das reale Objekt und ein reales Objekt ohne eine Instanz von haben A
, so dass es unsinnig ist, sie so zu behandeln, als wären sie ein und dasselbe.
calculate()
Ihnen kennt diese Unterfunktionen.
A
sind, ist das ein bisschen extrem.
A
stellt es ein Objekt in der physischen Welt dar, was ein starkes Argument dafür ist, die Klasse nicht aufzuteilen." Dies wurde mir leider gesagt, als ich anfing zu programmieren. Es hat Jahre gedauert, bis mir klar wurde, dass es ein Haufen Eishockey ist. Es ist ein schrecklicher Grund, Dinge zu gruppieren. Ich kann nicht artikulieren , was sind gute Gründe für die Gruppe Dinge (zumindest zu meiner Zufriedenheit), aber das ist eine Sie jetzt verwerfen sollte. Das Ende von "gutem Code" ist, dass er richtig funktioniert, relativ leicht zu verstehen und relativ leicht zu ändern ist (dh Änderungen haben keine seltsamen Nebenwirkungen).