メソッドチェーンを使用してオブジェクトを構築するイディオムの名前は何ですか?


21

メソッドチェーンを使用してオブジェクトをセットアップするパターンを頻繁に使用しますが、Builderor Prototypeパターンに似ていますが、各メソッド呼び出しで新しいオブジェクトを作成せず、代わりに元のオブジェクトを変更します。

例:

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

このパターンに名前があるのか​​、それがアンチパターンと見なされるのかどうか疑問に思うだけです。なぜなら、より流に読むことができても、長いメソッドチェーンにつながる可能性があるからです。


3
流fluentなインターフェイスはスタイルの問題です。APIを作成する場合は、それに代わるフォームを提供してください。
-Oded

1
より多くの議論に関しては、この質問を見てみましょう:programmers.stackexchange.com/questions/69519/...
エリック・キング

@Oded各呼び出しを個別のステートメントにするだけで、チェーンなしでこのようなAPIを使用できますか、または別のアイデアを考えましたか?
ギャレットホール

@GarrettHall-もちろんそれは可能ですが、menu.withStyle("")コンテキストなしのようなものを呼び出すことになります。このような場合、2つの API が必要です。
-Oded

2
@GarrettHall「流れるようなインターフェイス」の点は、ある文のように読まれることを意図されている方法チェーン。この意味で、長いメソッドチェーンは不良とは見なされません。しかし、ここでOdedに同意しますが、より一般的な構文でも同じ機能を提供することが最善です。そのようにして、開発者は使用する方法を選択できます。
エリックキング

回答:


37

流Interfaceなインターフェイス

ドメイン駆動設計のエリック・エバンスとアジャイル・マニフェストの名声のマーティン・ファウラーによって造られたように、私はこの方法が「流interfaceなインターフェース」と呼ばれることを常に聞いてきました。

主な欠点は、読みやすさ(一部の人は好きで嫌いな人もいます)と、アクションのチェーン全体がステップスルーするときに単一のステートメントと見なされる可能性があるため、場合によってはデバッグが難しくなる可能性があるという事実です。

私は確かにアンチパターンとは考えていませんが、このテクニックは自分で数回しか使用していません。


4
支持者は、流fluentなインターフェイスには単なるメソッドチェーン以上のものが含まれることをかなり主張していることに注意してください。
キリアンフォス

チェーン全体が単一のステートメントと見なされることは一般的ですか?それは、私にとっては不十分に設計されたデバッガーの問題のように聞こえます。
ブルーベリー

チェーンを単一のステートメントとして扱うデバッガーに出会ったことはありませんが、特定のチェーンでチェーンの終わりに向かうメソッドの1つだけに関心がある場合は、依然として苦痛になります。
vaughandroid

1
私はC#で作業しており、.NETデバッガーを使用して個々のメソッドにうまく踏み込むことができます。他の言語、私はよく分からない。
エリックキング

1
@KilianFoth質問のコメントで述べたように、流interfaceなインターフェイスのチェーンされたメソッドは、ほとんど文章として読めるはずです。時々、これは、個々のメソッドが、そうでなければグッドプラクティスと見なされるものとは異なる名前を持つべきであることを意味します
-Izkata

5

このようなメソッドチェーンは、チェーンに何らかのフローまたは発見可能性がある場合、通常Fluentインターフェイスと呼ばれます。あるいは、メソッドチェーンに大きく依存しているjQueryのようなapiを「流fluent性」ではないと考えることができます。これは、発見可能性を重視していないためです。

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

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


発見可能性とは何ですか?APIのオートコンプリートを使用して必要なメソッドを見つける機能はありますか?
ジョサイアヨーダー

私はjQueryに精通していません。それらのメソッドチェーンは、発見性ではなく、利便性のみを目的としているか チェーンする方法は非常に多いため、オートコンプリートを使用しても圧倒されますか?
ジョサイアヨーダー

3

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

絶対にアンチパターンではありません。jQueryはおそらく最もよく使用されている実装です。

流readに読むことができるが、長いメソッドチェーンにつながる可能性があるため

はい、できますが、代替手段は何ですか?APIが利用可能で適切なものを案内するので、ほとんど平易な英語の文で終わる可能性があります。


..そして、あなたは8-10の代わりに1行であなたが望むものを手に入れます。これは、ターミナルで1つのライナーのみを書いている場合に適しています。10個よりも1個のコマンドを呼び出す方が簡単です。流commandであり、メソッドにわかりやすい名前があるため、読みやすくなります。残念ながら、Python2でのこの多くはPython3 / Python4ではできなくなりました。
mckenzm

-3

これは「列車事故」パターンと呼ばれます。

(これはアンチパターンであり、クリーンコードに反しています)

「列車事故」パターンは、デメテル法則に違反しています。


3
これは、リンク先の記事のメソッドチェーンとは異なりますa.getB().getC().doSomething()。例はです。「あなたのメソッドは、独自のフィールドでメソッドを直接呼び出すことができますが、フィールドのフィールドでは呼び出せない」ため、この例は悪いです。ここでは、作成中のオブジェクトは1つだけで、「自分で作ったおもちゃで遊ぶことができます」。
ニック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.