Ja, es gibt Nachteile
Einfach zu lesender Code ist gut, aber achten Sie auch darauf, was der Code mitteilt . Wenn die Methoden eines Objekts immer das Objekt zurückgeben, werden einige Dinge kommuniziert:
- Ich benötige eine erweiterte Konfiguration, bei der nicht unbedingt ersichtlich ist, in welcher Reihenfolge die Dinge eingestellt oder konfiguriert werden sollen
- Jeder nachfolgende Methodenaufruf baut auf dem letzten auf
Gültiger Anwendungsfall: Ad-hoc-Datenbankabfragen
Klassenbibliotheken gibt es in fast jeder Sprache, mit denen Sie eine Datenbank abfragen können, ohne auf fest codiertes SQL zurückgreifen zu müssen. Nehmen Sie das Entity Framework für .NET als Beispiel:
DBContext db = new DBContext();
List<Post> posts = db.Posts
.Where(post => post.Title.Contains("Test"))
.OrderBy(post => post.DateCreated)
.ToList();
Dies ist eine flüssige Schnittstelle, bei der jeder nachfolgende Methodenaufruf auf der vorherigen aufbaut. Das logische Lesen dieser Aufrufe ist im Zusammenhang mit der Abfrage einer Datenbank sinnvoll.
Ungültiger Anwendungsfall: Syntaktischer Zucker zum Festlegen von Eigenschaften
Verwenden wir nun dasselbe Muster für die Post
Klasse:
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;
}
}
Schauen wir uns nun an, wie Sie diese Klasse verwenden würden:
Post post = new Post()
.SetTitle("Test")
.SetDateCreated(DateTime.Now)
.SetBody("Just a test");
Wenn ich diesen Code sehe, stelle ich sofort folgende Frage: "Wird SetBody
die Datenbank nach dem Aufruf abgefragt? Muss ich eine andere Methode aufrufen, um zu sagen, dass ich fertig bin?"
Was kommunizieren die verketteten Methodenaufrufe über die Post
Klasse mit dem Code ?
- Ich habe ein kompliziertes Setup
- Jeder Methodenaufruf baut auf dem vorherigen auf
Ist das tatsächlich wahr? Nein. Die Post
Klasse ist nicht kompliziert aufgebaut. Das Festlegen von Titel, Erstellungsdatum und Text baut nicht auf einem komplizierteren Endziel auf. Sie haben einen quadratischen Stift in ein rundes Loch gestampft.
Der Nachteil der selbstreferenziellen Methodenverkettung besteht darin, dass Sie mitteilen, dass mehrere Methodenaufrufe erforderlich sind, um etwas zu tun, und dass jeder Aufruf den letzten aufbaut. Wenn dies nicht zutrifft, kann die Verkettung von Methoden dazu führen, dass anderen Programmierern das Falsche mitgeteilt wird.
Als Ihre Mitarbeiter sagten:
Fließende Schnittstellen sollten nicht nur zur Vereinfachung, sondern auch zur Semantik implementiert werden
Sie waren absolut korrekt. Eine flüssige Schnittstelle oder Methodenverkettung kommuniziert etwas an und für sich, was möglicherweise nicht wahr ist.