私は非常に実用主義者ですが、ここでの主な懸念は、これConfigBlock
がインターフェイス設計をおそらく悪い方法で支配することを許可している可能性があることです。このようなものがある場合:
explicit MyGreatClass(const ConfigBlock& config);
...より適切なインターフェイスは次のようになります。
MyGreatClass(int foo, float bar, const string& baz);
...これらのfoo/bar/baz
フィールドを大規模なものからチェリーピッキングするのとは対照的にConfigBlock
です。
遅延インターフェースの設計
プラス面では、この種の設計により、コンストラクタ用の安定したインターフェイスを簡単に設計できます。たとえば、何か新しいものが必要になった場合、それをConfigBlock
(おそらくコードを変更することなく)にロードして、インターフェースの変更は一切せずに、必要な新しいものを選択しますMyGreatClass
。実装の変更のみです。
したがって、実際に必要な入力のみを受け入れる、より慎重に考え抜かれたインターフェイスを設計する自由が得られるのは、長所と短所の両方です。「これらの正確なパラメーターは、このインターフェースが機能するために必要なものです」というようなものとは対照的に、「この膨大なデータの塊を与えて、必要なものを選択します」という考え方を適用します。
したがって、ここには間違いなくいくつかのプロがいますが、彼らは短所によってかなり重くされるかもしれません。
カップリング
このシナリオでは、ConfigBlock
インスタンスから構築されているこのようなクラスはすべて、依存関係が次のようになります。
たとえば、Class2
この図の単体テストを単体で行いたい場合、これはPITAになります。ConfigBlock
関連するフィールドを含むさまざまな入力を表面的にシミュレートする必要がある場合がありますClass2
条件でテストできるようにがあります。
あらゆる種類の新しいコンテキスト(ユニットテストまたは新しいプロジェクト全体)で、そのようなクラスは(再)使用の負担が大きくなる可能性がConfigBlock
あります。それに応じて。
再利用性/展開性/テスト容易性
代わりに、これらのインターフェイスを適切に設計する場合、これらのインターフェイスを切り離して、次のようなものにすることができますConfigBlock
。
上の図で気づいた場合、すべてのクラスが独立します(それらの求心性/発信カップリングは1減少します)。
これにより、より多くの独立したクラスが得られます(少なくとも、 ConfigBlock
)が作成され、新しいシナリオ/プロジェクトで(再)使用/テストするのがはるかに簡単になります。
現在、このClient
コードは、すべてに依存し、すべてをまとめて組み立てる必要があるものになります。負担は最終的にこのクライアントコードに転送され、aから適切なフィールドを読み取り、ConfigBlock
それらをパラメーターとして適切なクラスに渡します。しかし、このようなクライアントコードは一般に特定のコンテキスト向けに厳密に設計されており、再利用の可能性は通常、とにかく閉じられます(アプリケーションのmain
エントリポイント関数などが考えられます)。
したがって、再利用性とテストの観点から、これらのクラスをより独立させることができます。クラスを使用するインターフェイスの観点からはConfigBlock
、すべてに必要なデータフィールド全体をモデル化する1つの大規模なモデルではなく、必要なパラメーターを明示的に指定することもできます。
結論
一般に、必要なものすべてを備えたモノリスに依存するこの種のクラス指向設計は、これらの種類の特性を持つ傾向があります。その結果、アプリケーションの適用可能性、展開可能性、再利用可能性、テスト可能性などが大幅に低下する可能性があります。それでも、私たちが積極的なスピンを試みれば、インターフェースの設計を多少簡素化できます。それらの長所と短所を測定し、トレードオフに価値があるかどうかを判断するのはあなた次第です。一般的に、より一般的で広く適用可能な設計をモデル化することを一般的に意図しているクラスのモノリスから選択するこの種の設計に対して誤りを犯す方がはるかに安全です。
最後だが大事なことは:
extern CodingBlock MyCodingBlock;
...これは、クラスをに結合するだけでなくConfigBlocks
、その特定のインスタンスに直接結合するため、依存性注入アプローチよりも上記の特性の点で潜在的にさらに悪い(より歪んでいますか?)さらに、適用性/展開性/テスト容易性が低下します。
私の一般的なアドバイスは、少なくとも設計する最も一般的に適用可能なクラスについては、これらの種類のモノリスに依存せずにパラメーターを提供するインターフェイスの設計の側に間違いを犯すことです。そして、あなたが本当にそれを避けない非常に強力で自信のある理由がない限り、可能であれば、依存性注入なしのグローバルなアプローチを避けてください。