Hello,
J'arrive sur un nouveau code, avec des classes énormes, et des pratiques un peu étranges.
Ainsi, je tombe souvent sur un pattern récurrent : des fonctions d'instanciation de classe, qui préparent tout un ensemble d'arguments à donner à un constructeur.
Les classes étant monstrueuses, elles ont souvent une vingtaine (ou plus) de données membres, et ça se ressent au niveau du constructeur.
Je suis sur un cas de constructeur avec 8 arguments. Il se trouve que 6 d'entre eux sont tous récupérés à partir d'un même objet.
Pseudocode illustrant ce cas :
La question est donc la suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 MaClasse buildMaClasse(const AutreClasse& other) { auto a = other.getA(); auto b = other.getB(); ... auto f = foo(a,b); auto g = 1; auto h = 2.5; return MaClasse(a,b, ..., g, h); };
Faut-il remplacer les 6 arguments par un seul, à savoir other, et faire le boulot dans la liste d'initialisation de MaClasse, voire dans le corps du constructeur pour les initialisations plus complexes ?
Dans la situation actuelle, on ne passe que ce qui est nécessaire. Mais j'expose sur le site d'instanciation des détails d'implémentation de la construction de MaClasse (j'expose ce qu'utilise MaClasse pour se construire, sans que le code appelant en ait besoin par ailleurs), et je crée des dépendances.
Si je passe other, je donne potentiellement accès à un tas d'autres fonctions membre publiques. Mais après tout, si elles sont publiques, c'est de la responsabilité de MaClasse. Il faut qu'elle assume son interface.
Merci de me donner votre avis sur ce cas précis et dans le cas général.
Si vous avez envie de faire du name dropping de concepts d'architecture de code, ne vous privez pas.![]()
Partager