1. ホーム
  2. oop

[解決済み] メソッドチェイニング - なぜ良い習慣なのか、そうでないのか?

2022-04-23 10:30:22

質問

メソッドチェイニング とは、オブジェクトのメソッドがオブジェクト自身を返すことで、その結果を別のメソッドに呼び出すことです。こんな感じ。

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

これは、読みやすいコード、あるいは流暢なインターフェイスを実現するために、良い習慣と考えられているようです。しかし、私には、その代わりに、オブジェクト指向が暗示しているオブジェクト呼び出しの記法を壊しているように思えます。 結果 これは、オブジェクト指向のコードが一般的に期待される動作です。

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

この違いによって、"calling the resulting object"というドット表記に2つの異なる意味を持たせることに成功しました。連鎖のコンテキストでは、上の例は 参加者 オブジェクトを保存することを意図していますが、実際には、getScheduleによって受信されたスケジュール・オブジェクトを保存することを意図しています。

ここでの違いは、呼び出されたメソッドが何かを返すことを期待するかしないか(その場合、連鎖のために呼び出されたオブジェクト自体を返す)であることは理解しています。しかし、この2つのケースは記法そのものから区別できるものではなく、呼び出されるメソッドのセマンティクスからしか区別できないのです。メソッドチェイニングを使用しない場合、メソッド呼び出しが、そのメソッドに関連する何かを操作していることは常に知ることができます。 結果 連鎖があると、この前提が崩れ、実際に呼び出されているオブジェクトが何であるかを理解するために、連鎖全体を意味的に処理しなければならなくなります。例えば

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

最後の2つのメソッドコールはgetSocialStreamの結果を参照していますが、その前のメソッドコールは参加者を参照しています。コンテキストが変わるチェーンを実際に書くのはバッドプラクティスかもしれませんが(そうなのか?)、その場合でも、似ているドットチェーンが実際に同じコンテキストで維持されているか、結果に対してのみ動作しているかを常にチェックする必要があります。

私には、メソッドチェイニングは表面的には読みやすいコードを生成しますが、ドットノテーションの意味をオーバーロードすると、より混乱を招くだけだと思われます。私は自分がプログラミングの第一人者だとは思っていないので、私の責任だと思うのですが。 それで 私は何を見逃しているのでしょうか?私はメソッドチェイニングをどこか間違って理解しているのでしょうか?メソッドチェイニングが特に優れているケースと、特に劣っているケースがあるのでしょうか?

補足:この質問は、質問の仮面をかぶった意見表明と受け取られる可能性があることは承知しています。しかし、そうではありません。私は純粋に、なぜチェーンが良い習慣と考えられているのか、そして、それが本来のオブジェクト指向の記法を壊していると考えるのはどこが間違っているのかを理解したいのです。

どのように解決するのですか?

これは主観的なものであることに同意します。私はほとんどの場合、メソッドの連結を避けていますが、最近、それがちょうどいいケースも見つけました。10個ほどのパラメータを受け取るメソッドがあり、もっと必要でしたが、ほとんどの場合、数個だけ指定すればいいのです。オーバーライドを使用すると、これはすぐに非常に面倒になりました。その代わりに、私はチェイニングアプローチを選択しました。

MyObject.Start()
    .SpecifySomeParameter(asdasd)
    .SpecifySomeOtherParameter(asdasd)
    .Execute();

メソッドチェイニングのアプローチはオプションでしたが、コードを書くのが楽になりました(特にIntelliSenseの場合)。しかし、これは一つの孤立したケースであり、私のコードにおける一般的なプラクティスではないことに注意してください。

要は、99%のケースでは、メソッドチェイニングを行わなくても同じように、あるいはそれ以上のことができる、ということです。しかし、1%の確率で、これが最良のアプローチとなる場合があるのです。