Le chaînage de méthodes est une syntaxe courante pour invoquer plusieurs appels de méthodes dans les langages de programmation orientés objet . Chaque méthode renvoie un objet, ce qui permet de chaîner les appels dans une seule instruction sans nécessiter de variables pour stocker les résultats intermédiaires.
Raisonnement
Les déclarations de variables locales sont du sucre syntaxique .
Le chaînage des méthodes élimine une variable supplémentaire pour chaque étape intermédiaire. Le développeur est ainsi épargné de la charge cognitive consistant à nommer la variable et à la garder à l'esprit.
Le chaînage des méthodes a été qualifié de « catastrophe » en raison de l'augmentation du nombre de méthodes qui se succèdent les unes après les autres sur la même ligne, ce qui se produit à mesure que davantage de méthodes sont enchaînées.
Une syntaxe similaire est la cascade de méthodes , où après l'appel de la méthode, l'expression évalue l'objet actuel, et non la valeur de retour de la méthode. La cascade peut être implémentée à l'aide du chaînage de méthodes en faisant en sorte que la méthode renvoie l' objet actuel lui-même . La cascade est une technique clé dans les interfaces fluides , et comme le chaînage est largement implémenté dans les langages orientés objet alors que la cascade ne l'est pas, cette forme de « cascading-by-chaining en renvoyant this » est souvent appelée simplement « chaînage ». Le chaînage et la cascade proviennent tous deux du langage Smalltalk .
Bien que le chaînage soit une syntaxe, il a des conséquences sémantiques, à savoir qu'il nécessite que les méthodes renvoient un objet, et si la mise en œuvre de la cascade via le chaînage doit être l'objet actuel. Cela empêche la valeur de retour d'être utilisée à d'autres fins, comme le renvoi d'une valeur d'erreur .
Exemples
Un exemple courant est iostream en C++ , où par exemple <<renvoie l'objet de gauche, permettant le chaînage.
Comparer:
a << b << c ;
équivalent à :
un << b ; un << c ;
Un autre exemple en JavaScript utilise les méthodes intégrées de Array :
filtrer certaines choses . filter ( x => x . count > 10 ) . sort (( a , b ) => a . count - b . count ) . map ( x => x . name )
Notez qu'en JavaScript, filteret maprenvoie une nouvelle copie superficielle du tableau précédent mais sortfonctionne sur place. Pour obtenir un comportement similaire, toSortedpeut être utilisé. Mais dans ce cas particulier, sortopère sur le nouveau tableau renvoyé par filteret ne modifie donc pas le tableau d'origine.