J'utilise fréquemment un modèle dans lequel j'utilise le chaînage de méthodes pour configurer un objet, similaire à un modèle Builder
or Prototype
, mais sans créer de nouveaux objets à chaque appel de méthode, mais plutôt modifier l'objet d'origine.
Exemple:
new Menu().withItem("Eggs").withItem("Hash Browns").withStyle("Diner");
Je me demande simplement s'il y a un nom pour ce modèle et s'il est considéré comme un anti-modèle, car bien qu'il puisse lire plus couramment, il peut conduire à de longues chaînes de méthode.
design-patterns
coding-style
code-quality
patterns-and-practices
method-chaining
Garrett Hall
la source
la source
menu.withStyle("")
sans contexte. Vous avez besoin de deux API dans un tel cas.Réponses:
Interface fluide
J'ai toujours entendu dire que cette méthode était appelée une `` interface fluide '', comme l'ont inventé Eric Evans (de renommée Domain Driven Design ) et Martin Fowler (de renommée Agile Manifesto ).
Les principaux inconvénients sont la lisibilité (que certaines personnes adorent et d'autres détestent), et le fait qu'il peut être plus difficile de déboguer dans certains cas, car toute la chaîne d'actions peut être considérée comme une seule déclaration lors de son passage.
Je ne le considère certainement pas comme un anti-modèle, même si je n'ai moi-même utilisé la technique que quelques fois.
la source
Le chaînage de méthode comme celui-ci est généralement appelé une interface fluide lorsqu'il y a une sorte de flux ou de découverte dans la chaîne. Alternativement, vous pouvez penser à une API comme jQuery qui s'appuie fortement sur le chaînage de méthode comme n'étant pas `` fluide '' car il n'y a pas le même accent sur la découvrabilité - c'est plus pour plus de commodité.
Pour votre exemple (en utilisant withx, withy), vous pouvez considérer cela comme une variante du modèle Builder car vous avez une classe spécialisée qui, étant donné un certain état (appels de méthode), sait comment renvoyer un objet correctement configuré.
Ce n'est pas un anti-modèle s'il est utilisé de manière appropriée.
la source
certainement pas un anti-modèle. jQuery est probablement l'implémentation la plus utilisée de cela.
Oui, mais quelle est l'alternative? Vous pouvez vous retrouver avec presque une phrase en anglais simple, avec l'API vous guidant vers ce qui est disponible et approprié.
la source
Il s'agit du modèle "épave de train".
(C'est un anti-modèle et est contre Clean Code)
Le motif "épave de train" viole la loi de Déméter .
la source
a.getB().getC().doSomething()
. Cet exemple est mauvais car «votre méthode peut appeler directement des méthodes sur ses propres champs (mais pas sur les champs des champs)». Ici, il n'y a qu'un seul objet en cours de création et "vous pouvez jouer avec des jouets que vous avez faits vous-même".