メソッド チェーニング (Fluent Interface) - なぜそれが良い方法なのか、あるいはそうではないのか? 質問する

メソッド チェーニング (Fluent Interface) - なぜそれが良い方法なのか、あるいはそうではないのか? 質問する

メソッドの連鎖オブジェクト メソッドがオブジェクト自体を返し、その結果を別のメソッドで呼び出せるようにする手法です。次のようになります。

participant.addSchedule(events[1]).addSchedule(events[2]).setStatus('attending').save()

これは、読みやすいコード、つまり「流れるようなインターフェース」を生成するので、良い方法だと考えられているようです。しかし、私にとっては、オブジェクト指向自体が暗示するオブジェクト呼び出し表記法を破っているように思えます。結果として得られるコードは、オブジェクトに対してアクションを実行することを表していません。結果前のメソッドは、オブジェクト指向コードが一般的に期待される動作と同じです。

participant.getSchedule('monday').saveTo('monday.file')

この違いにより、「結果のオブジェクトを呼び出す」というドット表記に2つの異なる意味が生まれます。連鎖の文脈では、上記の例は、参加者この例では、実際には getSchedule によって受信されたスケジュール オブジェクトを保存することを目的としていますが、実際には、オブジェクトは保存されません。

ここでの違いは、呼び出されたメソッドが何かを返すことを期待するかどうか(その場合、呼び出されたオブジェクト自体をチェーンのために返す)であることを理解しています。しかし、これらの2つのケースは、表記自体からは区別できず、呼び出されるメソッドの意味からのみ区別できます。メソッドチェーンが使用されていない場合、メソッド呼び出しが何かに関連する操作を行うことを常に知ることができます。結果チェーン化によりこの仮定は崩れ、呼び出される実際のオブジェクトが何であるかを理解するためにチェーン全体を意味的に処理する必要があります。例:

participant.attend(event).setNotifications('silent').getSocialStream('twitter').postStatus('Joining '+event.name).follow(event.getSocialId('twitter'))

最後の 2 つのメソッド呼び出しは getSocialStream の結果を参照しますが、その前のメソッド呼び出しは参加者を参照します。コンテキストが変化するチェーンを実際に記述するのは悪い習慣かもしれませんが (そうでしょうか?)、その場合でも、同じように見えるドットチェーンが実際に同じコンテキスト内に保持されているのか、それとも結果のみで機能しているのかを常に確認する必要があります。

私には、メソッド チェーンは表面的には読みやすいコードを生成しますが、ドット表記の意味をオーバーロードすると、混乱が増すだけであるように見えます。私はプログラミングの第一人者ではないので、これは私の責任だと考えています。では、私が見逃しているものは何でしょうか? メソッド チェーンを間違って理解しているのでしょうか? メソッド チェーンが特に優れているケースや、特に悪いケースはあるのでしょうか?

補足: この質問は、質問に見せかけた意見の表明として読めることは理解しています。しかし、そうではありません。私は、なぜ連鎖化がよい方法だと考えられているのか、そしてそれが本来のオブジェクト指向の表記法に反すると考えるのはどこが間違っているのか、心から理解したいのです。

ベストアンサー1

あくまでも私の意見ですが;

メソッド チェーンにより、デバッグが難しくなります。 - ブレークポイントを簡潔なポイントに設定できないため、プログラムを必要な場所で正確に一時停止できません。 - これらのメソッドの 1 つが例外をスローし、行番号を取得した場合、「チェーン」内のどのメソッドが問題の原因であるかわかりません。

一般的に、非常に短く簡潔な行を常に書くのが良い習慣だと思います。各行は 1 つのメソッド呼び出しだけを行う必要があります。長い行よりも、より多くの行を優先します。

編集: コメントでは、メソッド チェーンと改行は別々であると述べられています。これは本当です。ただし、デバッガーによっては、ステートメントの途中にブレーク ポイントを配置できる場合とできない場合があります。可能であっても、中間変数を含む別の行を使用すると、柔軟性が大幅に高まり、ウォッチ ウィンドウで調べることができる値が多数あるため、デバッグ プロセスに役立ちます。

おすすめ記事