あなたの選択はこれに要約されます: 関数がデータを必要とする場合、そのデータは:
- パラメータとして関数に渡されるか、または
- 関数が効果的にクエリできる場所に配置してください。
(3. は無視するか、関数自体によって生成されます。)
合格したい場合A::member
は、いくつかのオプションがあります。データをコンテキスト オブジェクトに入れて渡すことができます (これは、渡したいメンバーが少数ある場合に効果的であり、単体テストが存在する場合にうまく機能します)。データを関数に直接渡すことができます。データを何かに渡して、それを関数に渡すことができます。メッセージ パッシングを使用できます。パブリッシュ/サブスクライブ キューなど、より間接的なメカニズムを使用できます。そのような仲介者が渡すデータの種類についてどの程度の知識を持っているかを選択できます。これらはすべて、ある場所から別の場所にデータを渡すときに、ソース、トランスポート、および宛先の間のさまざまな種類の結合を意味します。せいぜいこの結合は、大規模な環境では苛立たしいものになる可能性があります。最悪の場合、これは重大な設計またはセキュリティ上の欠陥になる可能性があります。
A::member
クエリできる場所に配置したい場合は、いくつかのオプションもあります。グローバル変数は 1 つです。アクセス可能なデータ ストア (ファイル、データベース、サービス、キャッシュ、HTTP リソースなど) は別のものです。これらにはそれぞれ意味があります。誰がどのようにデータにアクセスできるかを考慮する必要があります。アクセスが簡単な場合 (グローバル変数のように)、データのクライアントを壊さずにシステムを進化させる方法に問題があります。コードをテストするときに問題が発生する場合もあります。せいぜいこの結合は、大規模な環境では苛立たしいものになる可能性があります。最悪の場合、重大な設計上の欠陥となり、実質的にテスト不可能なコードになる可能性があります。
データを渡したいが、それを渡す必要がある場所の数が気に入らない場合は、データを必要とする関数の数を制限するという別のアプローチがあります。つまり、コードを統合して、実際にA::member
. Facade、Bridge、Observer、Abstract Base Class などのさまざまなパターンが、言語レベルで役立つ場合があります。Publish-Subscribe や Callback などのアーキテクチャ パターンも役立つ場合があります。インスピレーションを得るため、デカップリング、リファクタリング、および依存関係の排除のトピックを調べてください。
では、正しい方法はどれでしょうか?唯一の正しい方法はありません。特定のケースを見て、そのケースのオプションとトレードオフを比較検討し、最も気に入ったものを選択する必要があります。