7

これは説明するのが難しい質問になるでしょうが、ここに行きます。

Delphi Spring Framework を使用しています。(http://code.google.com/p/delphi-spring-framework/)

ClassA によって実装される InterfaceA を宣言する UnitA があるとします。

同様に、ClassB によって実装される InterfaceB を宣言する UnitB があります。

どちらも、インターフェースとクラスをそれぞれの初期化セクションで Spring Container に登録しました。

InterfaceA は InterfaceB に依存していますが、Spring を使用しているため、UnitA の節には UnitB がありませんuses。言い換えれば、私たちは仕事を終えました.UnitAとUnitBを切り離しましたが、InterfaceAをInterfaceBに依存させることができます。

ただし、上記のシナリオでは、依存関係を解決できるように、UnitA と UnitB の両方がプロジェクトに含まれていることを確認する必要があります。

ここで、新しいプロジェクトを開始すると想像してください。その新しいプロジェクトは UnitA を使用していますが、開発者は、UnitA を使用する場合はプロジェクトに UnitB も含める必要があることに気づいていません。依存関係はコンパイル時ではなく実行時に解決されるため、コンパイラ エラーは発生しません。

そして、ここに問題があります: アプリが展開される前に、この UnitB への依存関係が確実に認識されるようにする正しい方法は何ですか?

複雑なアプリでは、徹底的なテストにもかかわらず、特定のコード パスがおそらく長時間実行されず、この不足している依存関係がデプロイ前に発見されない状況が予測できます。

各インターフェイス解決呼び出しにRequires、起動時にチェックして例外を発生させる呼び出しが付随するシステムを実装しました。これにより、エラーが確実に表示されます。しかし、これを検出するか、この問題に対処するための「ベスト プラクティス」または標準的な方法があるかどうか疑問に思っています。

追加: これは Java や他の言語の問題ですか?

4

2 に答える 2

5

MavenIvyなどの依存関係管理ソリューションを使用する必要があります。これを行うと、UnitA が UnitB に依存していると言うことができ、誰かが UnitA を依存関係として追加すると、ツール (Maven または Ivy) は強制的に依存関係をダウンロードしてプロジェクトに含めるようになります。

Maven 自体には、現在のワークスペースに既に他のプロジェクトがある場合でも検出できるEclipse プラグインがあります。

于 2011-08-31T12:49:16.147 に答える
2

私は少し混乱しています。IoCコンテナーではなく、疎結合を提供するインターフェースの使用です。InterfaceB が宣言されている場合、UnitA が UnitB を使用するのは当然のことです。

インターフェイスの実装は別の話です。それらは、実装するインターフェースへの参照と、それらが使用するインターフェースへの参照を必要としますが、他の実装への参照を持つべきではありません。

私は Spring for Delphi を使用したことはありませんが、他の IoC コンテナーには精通しています。同様に動作する場合は、その実装とともにインターフェイスを登録しています。呼び出すresolveときは、インターフェイスの名前またはインターフェイスに関するその他の情報 (型情報) を渡し、IoC コンテナーが要求したインターフェイスへの参照を返すことを期待しています。そのインターフェースの背後にある実装は、どれが登録されたか、および要求を解決するためにどのようなルールが適用されているかによって決まります。

要求したインターフェースが登録されていない場合、例外が発生します。一部の IC コンテナーは、1 回の呼び出しで依存関係のチェーン全体を解決できます。

依存関係が実行時に解決されるかどうかをビルド時に判断する方法を求めていますが、依存関係は実行時まで登録されません。どのツールを使用しても、それは保証できないと思います。

UnitAは、その uses 句にUnitBを含める必要があります。UnitA と UnitB のインターフェイスの実装は、特に各インターフェイスの実装が複数ある場合は、A と B とは別のユニットに配置することができ、おそらく配置する必要があります。

プロジェクトで UnitA を使用する開発者は、UnitB もプロジェクトに含めることを余儀なくされます。新しいプロジェクトでテスト駆動開発を使用している場合、テストに合格するには InterfaceA と InterfaceB の両方に実装を提供する必要があることにすぐに気付くでしょう (それらが単なるモックであっても)。

率直に言って、重要な依存関係が見落とされ、それなしでプロジェクトがデプロイされた場合、テストは十分に徹底されていません。単体テストではこれをキャッチできない可能性がありますが、これはまさに一連の統合テストで通常キャッチされるものです。

統合テストにはFitFitnesseなどをお勧めします (ただし、 Fit4Delphiプロジェクトがどの程度成熟しているかはわかりません)。テストは、Word 文書を作成したり Wiki を編集したりできる人なら誰でも作成できます。開発者は、テストが実稼働コードを駆動できるようにするクラスを作成するだけで済みます。正しく設定されていれば、プロジェクトの実際のリリース バージョンに対してほとんどの統合テストを実行できます。

于 2011-08-31T18:47:24.570 に答える