コンストラクタのオーバーインジェクションやファサードのサービスコンセプト

LppEdd:

私は、ビジネスの提案の更新を管理し、かなりシンプルなインターフェース、特に夜間のバッチ処理中に、各レコードがここで提出された(しかし、それは他のシナリオで使用される可能性があります)を持っています。このインターフェイスは、レコードと「サイクル」、それらを取り出しEJB 2.0ビーン、内部で使用されています。名前を注意してください可能性のあるエラー恩赦ので、イタリア語から英語への翻訳されています。私はまた、いくつかの概念を簡素化。

public interface ProposalUpdateService {
    void updateProposal(final ProposalFirstType proposal);
    void updateProposal(final ProposalSecondType proposal);
}

このインタフェースの実装は、依存関係のかなり多くがあります。

public class ProposalUpdateDefaultService implements ProposalUpdateService {
    private final ComplexService complexService;
    private final OtherComplexService otherComplexService;

    private final ProposalStep<Proposal> stepOne;
    private final ProposalStep<Proposal> stepTwo;
    private final ProposalStep<ProposalTypeTwo> stepThree;
    private final ProposalStep<Proposal> stepFour;

    public ProposalUpdateDefaultService(
            final ComplexService complexService,
            final OtherComplexService otherComplexService,
            final YetAnotherComplexService yetAnotherComplexService,
            final SimpleService simpleService,
            final OtherSimpleService otherSimpleService,
            final YetAnotherSimpleService yetAnotherSimpleService,
            final Converter<ProposalTypeOne, ComplexServiceType> converterProposalTypeOne,
            final Converter<ProposalTypeTwo, OtherComplexServiceType> converterProposalTypeTwo) {
        this.complexService = complexService;
        this.otherComplexService = otherComplexService;

        stepOne = new StepOne(yetAnotherComplexService);
        stepTwo =
                new StepTwo(
                        complexService,
                        otherComplexService,
                        yetAnotherComplexService,
                        converterProposalTypeOne,
                        converterProposalTypeTwo);
        stepThree =
                new StepThree(
                        simpleService,
                        otherSimpleService,
                        yetAnotherSimpleService);
        stepFour = new StepFour();
    }

    ...

あなたはこのクラスのカプセル化にの更新見ることができるようにProposalオブジェクトを、このプロセスは、4つのフェーズに分割され、それぞれが一つの概念(例えば、「私はその状態を進める必要がある?」「この提案は?期限切れする必要がある」または)を表します。これらの4つのフェーズは、異なるタイプの間で異なって配置されてもよいですProposal

ここでは、これらの2つの非常に単純化実装であるupdateProposal方法は:

@Override
public void updateProposal(final ProposalTypeOne proposal) {
   stepOne.process(proposal);
   stepTwo.process(proposal);

   if (...) {
      stepFour.process(proposal);
   }
}

@Override
public void updateProposal(final ProposalTypeTwo proposal) {
   stepOne.process(proposal);
   stepTwo.process(proposal);
   stepThree.process(proposal);
   stepFour.process(proposal);
}

2つのプライベートフィールド

private final ComplexService complexService;
private final OtherComplexService otherComplexService;

ヘルパープライベートメソッドのために使用されています。

あなたはこのクラスだけで作業を整理し、デリゲート見ることができるように、しかし、それはあまりにも多くの他のクラスに依存しません。同じことが、確実に言えるProposalStep(S)。

*Service(複数可)等に依存するエントリを更新するために、データベースからの詳細を取得するために、各工程内で使用されています

あなたは、依存関係のこの番号を受け入れるだろうか?
どのように簡素化するためにリファクタリングでしょうか?

私は、依存関係を減らす方法として、ファサードのサービスコンセプトについて読んだ、と私は、依存関係のグループのクラスタ一緒に、しかし、ここで私は本当に何をすべきか理解していないはずですか。

私は、基としてConverter(S)とService、それらを使用しています(複数可)が、彼らはあまりにも多く、とにかくだろう。

その他の詳細が必要な場合、私に教えてください。

LppEdd:

私はより便利見つけた解決策は、単に削除してProposalUpdateService抽象化し、そしてEJB Beanの様々なステップを管理させます。

この抽象化層は、今のような不必要であり、各ステップは、個別に依然として使用可能です。どちらのProposalUpdateServiceメソッド呼び出しは、EJB Bean内のプライベートメソッドになります。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=213539&siteId=1