Le chaînage de méthodes est la pratique des méthodes objet renvoyant l'objet lui-même afin que le résultat soit appelé pour une autre méthode. Comme ça:
participant.addSchedule(events[1]).addSchedule(events[2]).setStatus('attending').save()
Cela semble être considéré comme une bonne pratique, car cela produit du code lisible, ou une "interface fluide". Cependant, pour moi, cela semble au contraire casser la notation d'appel d'objet impliquée par l'orientation de l'objet elle-même - le code résultant ne représente pas l'exécution d'actions par rapport au résultat d'une méthode précédente, ce qui est généralement le mode de fonctionnement du code orienté objet:
participant.getSchedule('monday').saveTo('monnday.file')
Cette différence parvient à créer deux significations différentes pour la notation par points de "appeler l'objet résultant": Dans le contexte du chaînage, l'exemple ci-dessus se lirait comme une sauvegarde de l' objet participant , même si l'exemple est en fait destiné à enregistrer le planning objet reçu par getSchedule.
Je comprends que la différence ici est de savoir si la méthode appelée doit être attendue pour retourner quelque chose ou non (auquel cas elle renverrait l'objet appelé lui-même pour le chaînage). Mais ces deux cas ne se distinguent pas de la notation elle-même, seulement de la sémantique des méthodes appelées. Lorsque le chaînage de méthode n'est pas utilisé, je peux toujours savoir qu'un appel de méthode opère sur quelque chose lié au résultat de l'appel précédent - avec le chaînage, cette hypothèse se rompt, et je dois traiter sémantiquement toute la chaîne pour comprendre ce qu'est l'objet réel appelé est vraiment. Par exemple:
participant.attend(event).setNotifications('silent').getSocialStream('twitter').postStatus('Joining '+event.name).follow(event.getSocialId('twitter'))
Là, les deux derniers appels de méthode se réfèrent au résultat de getSocialStream, alors que les précédents font référence au participant. C'est peut-être une mauvaise pratique d'écrire des chaînes où le contexte change (n'est-ce pas?), Mais même dans ce cas, vous devrez constamment vérifier si les chaînes de points qui se ressemblent sont en fait conservées dans le même contexte, ou ne fonctionnent que sur le résultat .
Pour moi, il semble que si le chaînage de méthodes produit superficiellement du code lisible, surcharger le sens de la notation par points ne fait qu'engendrer plus de confusion. Comme je ne me considère pas comme un gourou de la programmation, je suppose que la faute est la mienne. Alors: qu'est-ce que je manque? Est-ce que je comprends mal le chaînage des méthodes? Y a-t-il des cas où le chaînage de méthodes est particulièrement bon, ou d'autres où il est particulièrement mauvais?
Note de bas de page: Je comprends que cette question puisse être lue comme une déclaration d'opinion masquée comme une question. Cependant, ce n'est pas - je veux vraiment comprendre pourquoi le chaînage est considéré comme une bonne pratique, et où est-ce que je me trompe en pensant qu'il rompt la notation orientée objet inhérente.
.
qui ignorerait les valeurs de retour de mehtod et invoquerait toujours les méthodes chaînées utilisant le même objet.