J'ai récemment rencontré la situation suivante.
class A{
public:
void calculate(T inputs);
}
Premièrement, A
représente un objet dans le monde physique, ce qui est un argument fort pour ne pas diviser la classe. Maintenant, cela calculate()
s'avère être une fonction assez longue et compliquée. J'en perçois trois structures possibles:
- l'écrire comme un mur de texte - avantages - toutes les informations sont en un seul endroit
- écrire des
private
fonctions utilitaires dans la classe et les utiliser danscalculate
le corps de - inconvénients - le reste de la classe ne sait pas / ne prend pas soin / ne comprend pas ces méthodes écrivez de
calculate
la manière suivante: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); }
Cela peut-il être considéré comme une bonne ou une mauvaise pratique? Cette approche révèle-t-elle des problèmes? Dans l'ensemble, dois-je considérer cela comme une bonne approche lorsque je suis à nouveau confronté à la même situation?
ÉDITER:
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.
...
}
Toutes ces méthodes:
- obtenir une valeur
- calculer d'autres valeurs, sans utiliser l'état
- appeler certains des "objets de sous-modèle" pour changer leur état.
Il s'avère que, sauf que set_room_size()
ces méthodes transmettent simplement la valeur demandée aux sous-objets. set_room_size()
, d'autre part, fait un couple d'écrans de formules obscures, puis (2) fait un demi-écran d'appel de sous-objets setters pour appliquer les différents résultats obtenus. Par conséquent, j'ai séparé la fonction en deux lambdas et je les appelle à la fin de la fonction. Si j'avais pu le diviser en morceaux plus logiques, j'aurais isolé plus de lambdas.
Quoi qu'il en soit, l'objectif de la question actuelle est de déterminer si cette façon de penser doit persister, ou au mieux ne pas ajouter de valeur (lisibilité, maintenabilité, capacité de débogage, etc.).
Firstly, A represents an object in the physical world, which is a strong argument for not splitting the class up.
A
Représente sûrement des données sur un objet qui pourrait exister dans le monde physique. Vous pouvez avoir une instance de A
sans l'objet réel et un objet réel sans une instance de A
, donc les traiter comme si elles étaient une seule et même chose n'a pas de sens.
calculate()
ne connaît ces sous-fonctions.
A
, cela va un peu à l'extrême.
A
représente un objet dans le monde physique, ce qui est un argument solide pour ne pas diviser la classe." On m'a malheureusement dit cela lorsque j'ai commencé à programmer. Il m'a fallu des années pour réaliser que c'est un tas de hockey sur cheval. C'est une raison terrible de grouper des choses. Je ne peux pas expliquer quelles sont les bonnes raisons de grouper les choses (au moins à ma satisfaction), mais celle-là est celle que vous devriez rejeter dès maintenant. En fin de compte, tout le "bon code" est qu'il fonctionne correctement, qu'il est relativement facile à comprendre et qu'il est relativement facile de changer (c'est-à-dire que les changements n'ont pas d'effets secondaires étranges).