J'ai récemment supprimé une de mes réponses java sur Code Review , qui a commencé comme ceci:
private Person(PersonBuilder builder) {
Arrêtez. Drapeau rouge. Un PersonBuilder construirait une personne; il connaît une personne. La classe Person ne doit rien savoir sur un PersonBuilder - c'est juste un type immuable. Vous avez créé un couplage circulaire ici, où A dépend de B qui dépend de A.
La personne doit simplement prendre ses paramètres; un client qui est prêt à créer une personne sans la construire devrait être en mesure de le faire.
J'ai été giflé avec un downvote, et a dit que (citant) le drapeau rouge, pourquoi? L'implémentation ici a la même forme que celle de Joshua Bloch dans son livre "Effective Java" (article # 2).
Il semble donc que la seule façon d'implémenter un modèle de générateur en Java consiste à faire du générateur un type imbriqué (ce n'est pas de cela qu'il s'agit cependant), puis de créer le produit (la classe de l'objet en cours de construction ) prendre une dépendance sur le générateur , comme ceci:
private StreetMap(Builder builder) { // Required parameters origin = builder.origin; destination = builder.destination; // Optional parameters waterColor = builder.waterColor; landColor = builder.landColor; highTrafficColor = builder.highTrafficColor; mediumTrafficColor = builder.mediumTrafficColor; lowTrafficColor = builder.lowTrafficColor; }
La même page Wikipedia pour le même modèle Builder a une implémentation très différente (et beaucoup plus flexible) pour C #:
//Represents a product created by the builder public class Car { public Car() { } public int Wheels { get; set; } public string Colour { get; set; } }
Comme vous pouvez le voir, le produit ici ne sait rien d'une Builder
classe, et pour tout ce qui le concerne, il pourrait être instancié par un appel direct de constructeur, une usine abstraite, ... ou un constructeur - pour autant que je le comprenne, le produit d'un modèle de création n'a jamais besoin de savoir quoi que ce soit qui le crée.
On m'a servi le contre-argument (qui est apparemment explicitement défendu dans le livre de Bloch) selon lequel un modèle de générateur pourrait être utilisé pour retravailler un type qui aurait un constructeur gonflé de dizaines d'arguments facultatifs. Donc, au lieu de m'en tenir à ce que je pensais savoir, j'ai fait des recherches un peu sur ce site et j'ai découvert que, comme je le soupçonnais, cet argument ne tient pas la route .
Alors, quel est le problème? Pourquoi proposer des solutions sur-conçues à un problème qui ne devrait même pas exister en premier lieu? Si nous enlevons Joshua Bloch de son piédestal pendant une minute, pouvons-nous trouver une seule bonne raison valable pour coupler deux types de béton et l'appeler une meilleure pratique?
Tout cela me fait penser à une programmation culte du fret .