回答:
他の人が述べたように、これは必ずしも悪い習慣ではありませんが、レイヤーの関心の分離を壊し、レイヤー固有のインスタンスをレイヤー間で受け渡さないことに注意する必要があります。例えば:
ただし、渡すインスタンスがDTOまたはエンティティ自体である場合は、おそらく大丈夫です。
オブジェクトインスタンスを渡すことは、通常のことです。状態(インスタンス変数)を保持する必要性を減らし、実行コンテキストからコードを分離します。
直面する可能性のある問題の1つは、チェーンの下部にあるメソッドのパラメーター要件の変更に応じて呼び出しチェーンに沿って複数のメソッドのシグネチャを変更する必要がある場合のリファクタリングです。ただし、リファクタリングを支援する最新のソフトウェア開発ツールを使用することで軽減できます。
コードのリモートエリアで必要なだけでオブジェクトを渡す場合、制御の反転と依存性注入のデザインパターンをオプションの適切なIoCコンテナーと共に使用すると、オブジェクトインスタンスの持ち運びに関する問題をうまく解決できます。中規模のプロジェクトで使用したことがありますが、使用せずにサーバーコードの大部分を書くことはもう考えません。
クイックアンサー:オブジェクトのインスタンスを渡すのに問題はありません。また言及したように、ポイントは、ぶら下がり参照またはメモリリークを引き起こす可能性のあるすべてのレイヤーでこの参照の割り当てをスキップすることです。
プロジェクトでは、このプラクティスを使用して、レイヤー間でDTO(データ転送オブジェクト)を渡します。これは非常に役立つプラクティスです。また、要約情報のように、より複雑な1回構築するためにdtoオブジェクトを再利用します。
私は主にWeb UIの開発者ですが、直感的な不快感はインスタンスのパススルーではなく、そのコントローラーで少し手続きを進めているという事実のほうが多いようです。コントローラーはこれらすべての詳細に汗をかく必要がありますか?オーディオを再生するために、他のオブジェクトの名前を複数参照するのはなぜですか?
OOP設計では、何が常緑で、何が変更される可能性が高いのかを考える傾向があります。変更対象は、大きなオブジェクトボックスに入れたい傾向があるため、プレーヤーが変更されたり新しいオプションが追加されたりしても、一貫したインターフェイスを維持できます。または、オーディオオブジェクトまたはその中のコンポーネントを大量に交換したい場合があります。
この場合、コントローラーは、オーディオファイルを再生する必要があることを識別し、それを再生するための一貫した/常緑の方法を持つ必要があります。一方、オーディオプレーヤーは、テクノロジーやプラットフォームが変更されたり、新しい選択肢が追加されたりすると、簡単に変更される可能性があります。これらの詳細はすべて、より大きな複合オブジェクトIMOのインターフェースの下に配置する必要があり、オーディオの再生方法の詳細が変更されたときにコントローラーを書き換える必要はありません。次に、ファイルの場所などの詳細を含むオブジェクトインスタンスを大きなオブジェクトに渡すと、適切なコンテキストの内部ですべてのスワッピングが行われ、誰かが愚かなことをする可能性は低くなります。
したがって、この場合、オブジェクトインスタンスが放り込まれているのはあなたを悩ませているとは思わない。キャプテンピカードはワープコアをオンにするためにエンジンルームに向かって走り、ブリッジに戻って座標をプロットし、シールドをオンにした後に「パンチイット」ボタンを押すだけです。 Warp 9の惑星Xに行きましょう。」そして彼の乗組員に詳細を整理させます。彼がそのように扱うとき、彼はすべての船のレイアウトとすべてがどのように機能するかを知らなくても、艦隊のどの船でもキャプテンすることができるからです。そして、それは最終的に、撮影する最大のOOPデザインの勝利、IMOです。
他の答えが指摘したように、これは本質的に貧弱な設計ではありません。ネストされたクラスとそれらをネストするクラスの間に密結合を作成できますが、参照のネストが設計に値を提供する場合、結合を緩めることは有効なオプションではない場合があります。
考えられる解決策の1つは、コントローラークラスのネストされた参照を「フラット化」することです。
ネストされたオブジェクトを介してパラメーターを数回渡す代わりに、すべてのネストされたオブジェクトへの参照をコントローラークラスで維持できます。
これがどの程度正確に実装されるか(または有効なソリューションであるかどうか)は、次のようなシステムの現在の設計に依存します。
これは、GXTクライアントのMVCデザインパターンで発生した問題です。GUIコンポーネントには、いくつかのレイヤーのネストされたGUIコンポーネントが含まれていました。モデルデータが更新されたとき、適切なコンポーネントに到達するまで、いくつかのレイヤーを通過しました。モデルデータを受け入れるための新しいGUIコンポーネントクラスが必要な場合、新しいクラスを含むすべてのGUIコンポーネントのモデルデータを更新するメソッドを作成する必要があるため、GUIコンポーネント間の望ましくない結合を作成しました。
それを修正するために、ViewクラスでネストされたすべてのGUIコンポーネントへの参照のマップを維持し、モデルデータが更新されるたびに、Viewが更新されたモデルデータを必要なGUIコンポーネントに直接送信できるようにしました。 。各GUIコンポーネントのインスタンスは1つしかなかったため、これはうまく機能しました。いくつかのGUIコンポーネントのインスタンスが複数ある場合、あまりうまく機能せず、どのコピーを更新する必要があるかを特定するのが難しくなります。
説明しているのは、Chain Of Responsibilityデザインパターンと呼ばれるものです。Appleは、イベント処理システムにこのパターンを使用しています。