Quel est le nom de l'idiome utilisant le chaînage de méthode pour construire un objet?

21

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 Builderor 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.

Garrett Hall
la source
3
Une interface fluide est une question de style. Si vous écrivez une API, fournissez-lui d'autres formes.
Odé
1
Pour plus de discussion, jetez un œil à cette question: programmers.stackexchange.com/questions/69519/…
Eric King
@Oded Il est possible d'utiliser une telle API sans chaîner simplement en faisant de chaque appel une instruction distincte, ou avez-vous eu une autre idée pour une alternative?
Garrett Hall
@ GarrettHall - Bien sûr, c'est possible, mais vous finissez par appeler des choses comme menu.withStyle("")sans contexte. Vous avez besoin de deux API dans un tel cas.
Odé
2
@GarrettHall Le point de «l'interface fluide» est la chaîne de méthode, qui est destinée à être lue comme une phrase. En ce sens, la longue chaîne de méthodes n'est pas considérée comme mauvaise. Mais, et ici je suis d'accord avec Oded, il serait préférable de fournir également la même fonctionnalité dans une syntaxe plus conventionnelle. De cette façon, le développeur peut choisir la méthode à utiliser.
Eric King

Réponses:

37

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.

Eric King
la source
4
Notez que les partisans insistent assez sur le fait qu'une interface fluide implique bien plus que le simple chaînage de méthodes, bien qu'il soit souvent difficile de savoir ce que l'on entend par ce terme.
Kilian Foth
Est-il courant que toute la chaîne soit considérée comme une seule déclaration? Cela ressemble à un problème de débogueur mal conçu pour moi.
blueberryfields
Je n'ai pas rencontré de débogueur qui traite les chaînes comme une seule déclaration, mais cela peut toujours être pénible si vous n'êtes intéressé que par l'une des méthodes vers la fin de la chaîne, dans une chaîne particulière.
vaughandroid
1
Je travaille en C #, et le débogueur .NET me permet de bien entrer dans les méthodes individuelles. Dans d'autres langues, je n'en suis pas si sûr.
Eric King
1
@KilianFoth Comme indiqué dans les commentaires de la question, les méthodes enchaînées dans une interface fluide devraient être lisibles presque comme une phrase. Parfois, cela signifie que les méthodes individuelles doivent avoir des noms différents de ce qui est autrement considéré comme une bonne pratique
Izkata
5

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.

frites
la source
Qu'est-ce que la découvrabilité? La possibilité de trouver les méthodes dont vous avez besoin grâce à la saisie semi-automatique de l'API?
Josiah Yoder
Je ne connais pas jQuery. Comment sont leurs chaînes de méthodes uniquement pour des raisons de commodité, pas de découverte? Parce qu'il y a tellement de façons de chaîner, c'est écrasant même avec la saisie semi-automatique?
Josiah Yoder
3

s'il est considéré comme un anti-modèle,

certainement pas un anti-modèle. jQuery est probablement l'implémentation la plus utilisée de cela.

car bien qu'il puisse lire plus couramment, il peut conduire à de longues chaînes de méthode

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é.

NimChimpsky
la source
..et vous obtenez ce que vous voulez en 1 ligne, au lieu de 8 - 10. Ce qui est bien si vous n'écrivez qu'une seule ligne dans un terminal. Plus facile à rappeler 1 commande que 10. Parce qu'elle est courante et que les méthodes ont des noms descriptifs, elle est également plus facile à lire. Malheureusement, une grande partie de cela en Python2 ne peut plus être effectuée en Python3 / Python4.
mckenzm
-3

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 .

Marc
la source
3
Ce n'est pas la même que la méthode de chaînage dans l'article auquel vous liez, où se trouve l'exemple 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".
Nic