web-dev-qa-db-ja.com

オブジェクトを構築するためにメソッド連鎖を使用するイディオムの名前は何ですか?

BuilderまたはPrototypeパターンと同様に、オブジェクトをセットアップするために method chaining を使用するパターンを頻繁に使用しますが、各メソッド呼び出しで新しいオブジェクトを作成しません。代わりに、元のオブジェクトを変更します。

例:

new Menu().withItem("Eggs").withItem("Hash Browns").withStyle("Diner");

このパターンに名前があるかどうか、そしてアンチパターンと見なされるかどうか疑問に思っています。より流暢に読むことはできますが、メソッドチェーンが長くなる可能性があるためです。

21
Garrett Hall

流暢なインターフェース

私は、このメソッドが「 fluent interface 」と呼ばれることをいつも耳にしていましたが、( Domain Driven Design fame)マーティンファウラー( アジャイルマニフェスト 名声))。

主な欠点は、読みやすさ(一部の人が好む人もいれば嫌いな人もいます)と、場合によっては、一連のアクション全体が1つのステートメントと見なされるため、デバッグが難しい場合があることです。

自分で数回しか使用していないにもかかわらず、私はそれをアンチパターンとは考えていません。

39
Eric King

このようなメソッドチェーンは、チェーン内に何らかのフローや発見可能性がある場合、通常Fluent Interfaceと呼ばれます。あるいは、メソッドチェーンに大きく依存しているjQueryのようなAPIは、「流暢」ではないと考えられます。これは、発見可能性に重点が置かれていないためです。利便性のためです。

例(withx、withyを使用)では、これをビルダーパターンのバリアントと見なすことができます。これは、特定の状態(メソッド呼び出し)が適切に構成されたオブジェクトを返す方法を知っている特殊なクラスがあるためです。

適切に使用すれば、これはアンチパターンではありません。

5
pfries

アンチパターンと見なされるかどうか、

間違いなくアンチパターンではありません。 jQueryはおそらくこれの最もよく使用される実装です。

より流暢に読むことはできますが、メソッドチェーンが長くなる可能性があるためです。

はい、できますが、代替手段は何ですか?何が利用可能で適切であるかをAPIが案内するので、ほぼプレーンな英語の文になる可能性があります。

3
NimChimpsky