lundi 22 septembre 2014

Delegating constructors

Aujourd'hui, j'ai collé mon premier delegate constructor dans du code de production.

Jusqu'ici, je n'en avais pas vraiment ressenti le besoin: la grande majorité de mes classes n'a qu'un seul constructeur, et celles qui en ont plus ont généralement besoin de comportements très différents. Mais aujourd'hui, j'ai voulu utiliser un delegate constructor, pour rendre mon code plus facile à utiliser depuis les tests unitaires.

Dans mon cas, j'avais un constructeur qui prenait, entre autres, un gros objet, à partir duquel on retirait plusieurs petits pour les mettre dans des attributs. Le problème, c'est que ce gros objet est difficilement moquable, alors que les petits le sont facilement. De plus, je veux vraiment passer le gros objet (et pas les petits) par le constructeur, pour éviter que l'utilisateur ne s'emmêlle les pinceaux sur la manière d'extraire les petits.

Ma solution fut donc de créer un constructeur protégé qui prend les petits objets, appelé par mon constructeur principal public qui prend le gros. Pas de risques de mal utiliser la classe. Et depuis mes tests unitaires, je dérive mon objet, rend l'autre constructeur visible, et passe mes objets moqués.

C'est probablement un cas d'utilisation très particulier. Je ne pense pas avoir à réitérer l'expérience de si peu. Mais il est plaisant de trouver des cas d'utilisation qui rendent le code vraiment plus élégant.

Aucun commentaire: