3

私は、新しいプロジェクトでドメイン駆動型の設計アプローチに従おうとしています。私は通常、依存性注入にSpringを使用しており、アプリケーションコードを構築コードからうまく分離していますが、DDDを使用すると、状態と動作の両方を持つ別のドメインオブジェクトを作成したい1つのドメインオブジェクトが常にあるようです。

たとえば、メディア ファイルが与えられた場合、それを別の形式にエンコードする必要があります。メディア アセットはトランスコード サービスを呼び出し、コールバックを受け取ります。

class MediaAsset implements TranscodingResultListener {

    private NetworkLocation permanentStorage;
    private Transcoder transcoder;

    public void transcodeTo(Format format){
        transcoder.transcode(this,format);
    }

    public void onSuccessfulTranscode(TranscodeResult result){
        Rendition rendition = new Rendition(this, result.getPath(), result.getFormat());
        rendition.moveTo(permanentStorage);
    }

}

これは2つの問題を投げます:

  • レンディションにいくつかの依存関係 (MediaAsset に「トランスコーダー」が必要など) が必要で、Spring などを使用してそれらを注入したい場合、プログラムを実行するために AOP を使用する必要がありますが、これは好ましくありません。
  • 新しいフォーマットが一時ストレージに移動されることをテストする MediaAsset の単体テストが必要な場合は、どうすればよいですか? レンディション クラスをモックして、そのメソッドが呼び出されたことを確認することはできません...実際のレンディション クラスが作成されます。

このクラスを作成するためのファクトリを持つことを検討しましたが、「new」キーワードを含めるだけで多くのコード オーバーヘッドが発生し、問題が発生します。

ここに私が見逃しているアプローチがありますか、それともすべて間違っていますか?

4

2 に答える 2

3

この場合、 RenditionFactory の注入が正しいアプローチだと思います。追加の作業が必要なのはわかっていますが、クラスから SRP 違反も削除します。ビジネス ロジック内でオブジェクトを作成したくなることがよくありますが、私の経験では、オブジェクトまたはオブジェクト ファクトリの注入は 100 回中 99 回成功します。特に、言及されたオブジェクトが複雑である場合、および/またはシステム リソースと相互作用する場合。

于 2012-11-27T13:01:07.667 に答える
2

単体テストのアプローチはMediaAsset、単独でテストすることだと思います。そうすることで、工場が一般的な解決策だと思います。

もう1つのアプローチは、システム全体(またはほぼシステム全体)をテストすることです。テストで外部インターフェイス[1](ユーザーインターフェイス、Webサービスインターフェイスなど)にアクセスし、システムがアクセスするすべての外部システム(データベース、ファイルシステム、外部サービスなど)に対してテストダブルを作成します。次に、テストでこれらの外部依存関係を注入します。

これを行うことで、テストをすべて動作に関するものにすることができます。テストは、実装の詳細から切り離されます。たとえば、依存性注入を使用することも、使用しないこともできますRendition。テストは関係ありません。また、それが正しい概念MediaAssetではないことに気付くかもしれません[2] 。2つに分割してその半分を。とマージRenditionする必要があるかもしれません。繰り返しますが、テストについて心配することなくそれを行うことができます。MediaAssetRendition

(免責事項:外部レベルでのテストは常に機能するとは限りません。一般的な概念をテストする必要がある場合があり、マイクロテストを作成する必要があります。その後、この問題が再び発生する可能性があります。)

[1]最適なレベルは、実際には「ドメインインターフェース」であり、文字列や整数の代わりにドメイン言語を使用でき、ボタンクリックやフォーカスイベントの代わりにドメインアクションを話すことができるユーザーインターフェースの下のレベルです。

[2]おそらくこれは実際にはあなたの問題です:MediaAsset正しいRendition概念ですか?ドメインの専門家に尋ねると、彼はこれらが何であるかを知っていますか?そうでない場合、あなたは本当にDDDをやっていますか?

于 2012-11-27T11:56:38.197 に答える