Sì, ci sono degli svantaggi
Il codice facile da leggere è buono, ma fai attenzione anche a ciò che comunica . Quando i metodi di un oggetto restituiscono sempre l'oggetto, comunica un paio di cose:
- Ho bisogno di una configurazione avanzata che non sia necessariamente ovvia nell'ordine in cui le cose dovrebbero essere impostate o configurate
- Ogni chiamata di metodo successiva si basa sull'ultima
Caso d'uso valido: query su database ad hoc
Le librerie di classi esistono in quasi tutte le lingue che consentono di interrogare un database senza ricorrere a codice SQL codificato. Prendi l'Entity Framework per .NET come esempio:
DBContext db = new DBContext();
List<Post> posts = db.Posts
.Where(post => post.Title.Contains("Test"))
.OrderBy(post => post.DateCreated)
.ToList();
Questa è un'interfaccia fluida in cui ogni successiva chiamata di metodo si basa su quella precedente. Leggere logicamente queste chiamate ha senso nel contesto dell'interrogazione di un database.
Caso d'uso non valido: zucchero sintetico per l'impostazione delle proprietà
Ora usiamo lo stesso modello con 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;
}
}
Ora diamo un'occhiata a come useresti questa classe:
Post post = new Post()
.SetTitle("Test")
.SetDateCreated(DateTime.Now)
.SetBody("Just a test");
Quando vedo questo codice, faccio immediatamente questa domanda: "Dopo aver chiamato SetBody
, interroga il database? Devo chiamare un altro metodo per dire 'Ho finito?'"
Cosa comunicano le chiamate del metodo concatenato al codice usando la Post
classe?
- Ho una configurazione complicata
- Ogni chiamata di metodo si basa su quella precedente
È davvero vero? No. La Post
classe non ha una configurazione complicata. Impostare il titolo, la data di creazione e il corpo non si basano l'uno sull'altro verso un obiettivo finale più complicato. Hai schiacciato un piolo quadrato in un foro rotondo.
Lo svantaggio del concatenamento di metodi autoreferenziali è che si comunica che sono necessarie più chiamate di metodo per fare qualcosa e che ciascuna chiamata crea l'ultimo. Se ciò non è vero, il concatenamento dei metodi potrebbe comunicare la cosa sbagliata ad altri programmatori.
Quando i tuoi colleghi hanno detto:
Le interfacce fluide non dovrebbero essere implementate solo per comodità, ma per la semantica
Erano assolutamente corretti. Un'interfaccia fluida, o metodo concatenato, comunica qualcosa in sé e per sé che potrebbe non essere vero.