Avantage d'utiliser la classe de générateur interne statique

9

Au cours de la rédaction des directives de code pour une entreprise, je me suis retrouvé à recommander d'utiliser le modèle Builder d'Efficace Java, au lieu de constructeurs télescopiques.

Cependant, après y avoir réfléchi un peu plus, une solution plus élégante consiste sûrement à supprimer simplement la classe de générateur et à supprimer également les constructeurs supplémentaires avec des arguments facultatifs.

Il suffit donc d'avoir un constructeur avec les paramètres requis, des getters / setters normaux et de commenter le code. Lors de l'implémentation, créez simplement une nouvelle instance de yr object puis définissez les valeurs.

Ma pensée originale était que l'avantage était de supprimer la confusion quant aux paramètres facultatifs et à ceux qui étaient requis; cependant, le véritable avantage vient de l'utilisation du chaînage de méthode / de l'interface fluide.

Le modèle de générateur présente des avantages lorsque vous créez de nombreuses nouvelles instances car l'idé peut faire le travail de jambe et également s'il existe de nombreux (15+) paramètres facultatifs. Cependant, cela vaut-il le temps supplémentaire de coder la classe interne statique, recommanderiez-vous d'utiliser le générateur, ou est-ce une perte de temps?

NimChimpsky
la source

Réponses:

8

J'ai tendance à suivre un modèle selon lequel les constructeurs devraient fournir toutes les valeurs obligatoires requises pour créer un objet valide et cohérent . Pour les valeurs facultatives, j'essaie de réfléchir à la valeur par défaut la plus courante, afin que les setters soient utilisés le moins possible.

Si je trouve qu'il y a beaucoup de valeurs facultatives ou qu'une plus grande proportion de valeurs facultatives ont tendance à être modifiées par rapport à leurs valeurs par défaut, alors j'utiliserai le modèle de générateur (générateur interne statique ou autre conception similaire).

Josh donne généralement de très bons conseils - la meilleure chose que j'aime chez lui est que les conseils viennent des tranchées - il admet qu'il a fait des erreurs dans la conception de parties de Java, et Java efficace est en partie une sorte de `` remède '' parler :-)

Martijn Verburg
la source
1
Cela ne dit rien sur la raison pour laquelle l'intérieur devrait être statique ...
Jimmy Hoffa
Immuabilité et sans effet secondaire est également un objectif.
Martijn Verburg
6

Le modèle Builder de Josh Bloch, tout comme le modèle GoF Builder, offre un moyen de créer un objet immuable avec beaucoup de données par défaut sans de longues listes de constructeurs chaînés.

Si vous "avez le seul constructeur avec les paramètres requis, les getters / setters normaux", alors votre objet n'est plus immuable. c'est à dire. Vous pouvez le changer longtemps après l'avoir instancié.

Si ce n'est pas un problème pour vous, vous n'avez jamais eu besoin du modèle Builder en premier lieu. Si c'est un problème, votre solution est défectueuse.

pdr
la source
Je ne pense pas que le modèle de générateur ait quoi que ce soit à voir avec la mutabilité, même l'exemple gof sur wiki est mutable ... en.wikipedia.org/wiki/Builder_pattern#Java également, le modèle a des avantages que j'ai décrits dans la question.
NimChimpsky
3
@NimChimpsky: la question de savoir si le modèle Builder peut être appliqué pour créer un objet modifiable n'est pas en cause. La question est, devriez-vous? Les getters et setters existent depuis l'éternité, où les objets peuvent être mutables, ils sont une solution parfaitement solide, mais les gens ont rencontré un problème commun avec la création d'objets immuables: des chaînes de constructeurs ingérables. Le Builder était une solution courante et est ainsi devenu un modèle pour faciliter la communication.
pdr