はい、欠点があります
読みやすいコードは優れていますが、コードが通信する内容にも注意してください。オブジェクトのメソッドが常にオブジェクトを返すとき、それはいくつかのことを伝えます:
- 高度な設定が必要です。これは、どの順序で設定または設定する必要があるかが必ずしも明らかではありません
- 後続の各メソッド呼び出しは、最後に構築されます
有効なユースケース:アドホックデータベースクエリ
クラスライブラリはほとんどすべての言語に存在するため、ハードコードされたSQLを使用せずにデータベースを照会できます。例としてEntity Framework for .NETを取り上げます。
DBContext db = new DBContext();
List<Post> posts = db.Posts
.Where(post => post.Title.Contains("Test"))
.OrderBy(post => post.DateCreated)
.ToList();
これは、後続の各メソッド呼び出しが前のメソッドに基づいて構築される、流fluentなインターフェイスです。これらの呼び出しを論理的に読み取ることは、データベースのクエリのコンテキストで意味があります。
無効なユースケース:プロパティを設定するための構文シュガー
次に、Post
クラスで同じパターンを使用してみましょう。
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;
}
}
次に、このクラスの使用方法を見てみましょう。
Post post = new Post()
.SetTitle("Test")
.SetDateCreated(DateTime.Now)
.SetBody("Just a test");
このコードが表示されたら、すぐに次の質問をします。「呼び出した後SetBody
、データベースにクエリを実行しますか。「完了」と言うために別のメソッドを呼び出す必要がありますか?」
チェーンされたメソッド呼び出しは、クラスを使用してコードと何を通信しPost
ますか?
- 複雑な設定があります
- 各メソッド呼び出しは前の呼び出しに基づいています
これは本当ですか?いいえ。Post
クラスには複雑な設定はありません。タイトル、作成日、および本文の設定は、より複雑な最終目標に向かって互いに構築されません。正方形のペグを丸い穴にマッシュしました。
自己参照メソッドチェーンの欠点は、何かを行うために複数のメソッド呼び出しが必要であり、各呼び出しが最後から構築されることを伝えることです。これが当てはまらない場合、メソッドチェーンは他のプログラマに間違ったことを伝えている可能性があります。
同僚が言ったとき:
流interfacesなインターフェイスは、便宜上だけでなく、セマンティクスのために実装されるべきです
彼らは絶対に正しいです。流なインターフェイス、またはメソッドチェーンは、それ自体ではない可能性のある何かを伝えます。