Oui, il y a des inconvénients
Un code facile à lire est bon, mais méfiez-vous également de ce qu'il communique . Lorsque les méthodes d'un objet retournent toujours l'objet, il communique deux ou trois choses:
- J'ai besoin d'une configuration avancée qui n'est pas nécessairement évidente dans quel ordre les choses doivent être définies ou configurées
- Chaque appel de méthode suivant s'appuie sur le dernier
Cas d'utilisation valide: requêtes de base de données ad hoc
Les bibliothèques de classes existent dans la plupart des langages qui vous permettent d'interroger une base de données sans recourir à du code SQL codé en dur. Prenez l'exemple d'Entity Framework pour .NET:
DBContext db = new DBContext();
List<Post> posts = db.Posts
.Where(post => post.Title.Contains("Test"))
.OrderBy(post => post.DateCreated)
.ToList();
Il s'agit d'une interface fluide où chaque appel de méthode suivant s'appuie sur le précédent. La lecture de ces appels est logique dans le contexte de l'interrogation d'une base de données.
Cas d'utilisation non valide: sucre syntaxique pour la définition des propriétés
Maintenant, utilisons le même modèle avec la Post
classe:
public class Post
{
public string Title { get; set; }
public DateTime DateCreated { get; set; }
public string Body { get; set; }
public Post SetTitle(string title)
{
Title = title;
return this;
}
public Post SetDateCreated(DateTime created)
{
DateCreated = created;
return this;
}
public Post SetBody(string body)
{
Body = body;
return this;
}
}
Voyons maintenant comment vous utiliseriez cette classe:
Post post = new Post()
.SetTitle("Test")
.SetDateCreated(DateTime.Now)
.SetBody("Just a test");
Lorsque je vois ce code, je pose immédiatement cette question: "Après avoir appelé SetBody
, interroge-t-il la base de données? Dois-je appeler une autre méthode pour dire" J'ai terminé? ""
Que communiquent les appels de méthode chaînés au code à l'aide de la Post
classe?
- J'ai une configuration compliquée
- Chaque appel de méthode s'appuie sur le précédent
Est-ce vraiment vrai? Non. La Post
classe n'a pas de configuration compliquée. La définition du titre, de la date de création et du corps ne s'appuie pas l'un sur l'autre vers un objectif final plus compliqué. Vous avez écrasé une cheville carrée dans un trou rond.
L'inconvénient du chaînage de méthode auto-référentiel est que vous communiquez que plusieurs appels de méthode sont nécessaires pour faire quelque chose, et que chaque appel s'appuie sur le dernier. Si ce n'est pas le cas, le chaînage de méthode peut être communiquer la mauvaise chose à d'autres programmeurs.
Lorsque vos collègues ont dit:
Les interfaces fluides ne doivent pas être implémentées uniquement pour des raisons de commodité, mais pour la sémantique
Ils étaient absolument corrects. Une interface fluide, ou un chaînage de méthodes, communique quelque chose en soi qui pourrait ne pas être vrai.