J'ai commencé à écrire une interface fluide et j'ai regardé à une pièce plus ancienne, Martin Fowler a écrit sur des interfaces couramment (que je n'avais pas réalisé qu'il et Eric Evans a inventé le terme). Dans la pièce, Martin mentionne que les régleurs renvoient généralement une instance de l'objet configuré ou travaillée, ce qu'il dit est une violation des CQs.
La convention commune dans le monde Brace Curly est ce modificateur les méthodes sont annulées, ce que j'aime parce qu'il suit le principe de CommandQuSeparation. Cette convention se met dans la voie d'un interface couramment, donc je suis enclin à suspendre la convention pour cette cas. p> blockquote>
Donc, si mon interface fluide fait quelque chose comme: p>
xxx pré> est-ce vraiment une violation de CQS? P>
Mise à jour strong> J'ai éclaté mon échantillon pour montrer des avertissements et des erreurs de journalisation en tant que comportements séparés. P> p>
4 Réponses :
Oui, c'est. Toutes ces méthodes renvoient évidemment quelque chose et ont évidemment évidemment des effets secondaires (à en juger par le fait que vous ne faites rien avec la valeur de retour, mais vous vous engagez pas à les appeler). Étant donné que la définition de CQS indique que les mutateurs ne devraient pas renvoyer une valeur, nous avons une violation claire de nos mains. P>
Mais cela compte-t-il pour vous que les CQs soient violés? Si l'interface fluide vous rend plus productive, toutes les choses considérées et si vous considérez comme si vous considérez comme un modèle bien connu avec des avantages et des inconvénients tout aussi connus, pourquoi em> devrait-il em> il s'agit de violer le principe X sur papier? p>
Comment est-il évident que logwarningsanderrors code> renvoie quelque chose?
@ M.Babcock: Techniquement, ce n'est pas, juste de cet extrait. Vous m'avez bien eu.
Accepter. Pourquoi importe-t-il si le principe de violette X, si cela vous aide à l'utiliser.
il enfreint ce principe quand il change d'objets mais pas quand il ne renvoie qu'un nouvel objet. si Cependant, la question est que votre exemple représente une requête du tout. Est-ce que "couramment" signifie nécessairement une "question"? Il pourrait probablement simplement être perçu comme une interface d'action-fluente où le même objet est passé d'une action à l'autre. P> P> MyObject code> est inchangé après cette déclaration, tout va bien . Généralement parlé, une interface fluide enfreint le principe du CQS, si, et seulement s'il a des effets secondaires. P>
HM, mais tout le point de configuration consiste à modifier l'objet (sous réserve de configuration), alors pourquoi déranger?
Quelle différence signifie-t-il si l'objet étant modifié est une nouvelle ou une autre instance? L'un de ces 4 appels modifie la valeur de retour de l'expression (tout ce qui est) ou ne fait rien et devrait donc être omise.
La question est, si elle modifie un objet existant et renvoie un résultat en même temps, ce qui en fait une commande et une requête en même temps. Il devrait être une commande ou b> une requête.
non. Le modèle ici est "Configuration". Ces commandes de configuration renvoient l'objet de configuration lui-même comme opposé à quelque chose de sans rapport avec la commande. Une violation de la ségrégation de commande / requête se produirait si les commandes qui servent que la configuration but a renvoyé des données non liées, par exemple:
Sry, je ne comprends pas votre réponse, mais je veux. Pouvez-vous s'il vous plaît développer ça? "Si tu avais ..." avait là? En outre, il n'y a pas de modification de l'état interne dans votre extrait. Je vois la violation de "dire, ne demande pas" principe, mais c'est tout
Je pense que cela dépend de ce que font ces méthodes. Si chacun est sa propre commande, alors oui, cela pourrait enfreindre les CQs. P>
Cependant, vous pouvez résoudre ce problème facilement de 2 manières différentes. P>
Ne faites pas la chaîne des commandes. Juste faire myObject.UserePositoire (".."). Appelez ensuite le prochain, etc. Mais si l'élément suivant de la chaîne nécessite des informations de la précédente, vous seriez en difficulté. P> LI>
au lieu de faire chacune de ces sa propre commande, ces choses enchaînées sont simplement de mettre à jour les données sur le DTO directement. Ensuite, à la fin, vous exécutez une méthode appelée .configure () qui envoie ensuite cette DTO à une seule commande qui fait tout le traitement. P> li> ol>
logwarningsanderrors code> retourne quelque chose? Sinon, alors est-ce vraiment une interface fluide?
@ M.Babcock a mis à jour mon échantillon. Bien sûr,
logwarningsanderrors code> renvoie une interface que je peux ajouter des comportements supplémentaires à.