ワークフローに内部静的クラスを使用せずに流暢なビルダーパターンを使用する

シュパキ

これは、Passing1で作業していたものから同じオブジェクトタイプの多くのパラメーターへの続きです。

私はそれについて良いフィードバックを得ました、私は私がデザインを改善したと信じています。コード全体はhttps://github.com/spakai/flow_input_builderにあります

要件は単純です:-

以前のワークフローからの1つ以上の出力を使用して、さまざまなワークフローの入力セットを作成する必要があります

私は一連のインターフェースを持っています

public interface SwfInput {

}

public interface SwfOutput {

}

public interface Workflow<I extends SwfInput, O extends SwfOutput> {

    public O execute(I input);
}

public interface Builder<I extends SwfInput> {
    public I build();

}

ここで、FlowA-> FlowB-> FlowCの順序で実行される3つのフローがあるとします。

FlowCはFlowBからの必須出力を必要としますが、オプションでFlowAからのみ出力する必要があります

だから私はFlowCBuilderの実装を持っています

public class FlowCInputBuilder implements Builder<FlowCInput> {

    private final FlowBOutput mandatoryflowBOutput;
    private FlowAOutput optionalflowAOutput;

    public FlowAOutput getOptionalflowAOutput() {
        return optionalflowAOutput;
    }

    public FlowCInputBuilder setOptionalflowAOutput(FlowAOutput optionalflowAOutput) {
        this.optionalflowAOutput = optionalflowAOutput;
        return this;
    }

    public FlowCInputBuilder(FlowBOutput mandatoryflowBOutput) {
        this.mandatoryflowBOutput = mandatoryflowBOutput;
    }

    @Override
    public FlowCInput build() {

        FlowCInput input = new FlowCInput();
        input.setMandatoryFromFlowB(mandatoryflowBOutput.getOutput1FromB());

        if (optionalflowAOutput != null) {
            input.setOptionalFromFlowA(optionalflowAOutput.getOutput2FromA());
        }

        return input;       

    }


}

私が書いた1つのテストは、使用例を示しています

 FlowBOutput mandatoryflowBOutput = new FlowBOutput();

 mandatoryflowBOutput.setOutput1FromB("iNeedThis");
 FlowAOutput optionalflowAOutput = new FlowAOutput();
 FlowCInput input =  new FlowCInputBuilder(mandatoryflowBOutput)
                .setOptionalflowAOutput(optionalflowAOutput)
                .build();

Builderパターンに静的内部クラスを使用していません。

どんな提案も歓迎します。

Nghia Bui

静的内部クラスを使用する必要があります。このアプローチを使用することの重要なポイントは、内部が構築されているオブジェクトのプライベートプロパティに直接アクセスできることです。ビルダーは構築のために一時的な状態の長いリストを維持する必要がないため、これは重複したコードを排除するのに役立ちます。したがって、コードは次のように書き直すことができます。

public class FlowCInput {
    private int output1FromB; // suppose that it is int
    private String output2FromA; // suppose that it is String
    private FlowCInput() { }
    //...

    public static class FlowCInputBuilder implements Builder<FlowCInput> {
        private final FlowCInput result;

        public FlowCInputBuilder(FlowBOutput mandatoryflowBOutput) {
            result = new FlowCInput();
            // output1FromB is private but still accessed from here
            result.output1FromB = mandatoryflowBOutput.getOutput1FromB();
        }

        public FlowCInputBuilder setOptionalflowAOutput(FlowAOutput optionalflowAOutput) {
            // same for output2FromA
            result.output2FromA = optionalflowAOutput.getOutput2FromA();
            return this;
        }

        @Override
        public FlowCInput build() {
            return result;
        }
    }
}

ご覧のとおり、ビルダーはFlowCInputオブジェクトのみを保持するようにmandatoryflowBOutputなりoptionalflowAOutput、以前のように不必要に保持することはありません

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ビルダーを別のクラスに保持する(流暢なインターフェース)

分類Dev

ビルダーパターンで流暢なインターフェースを使用する

分類Dev

インターフェイスで使用可能な静的な「sides」プロパティを使用せずに、単純なDiceオブジェクトを作成する

分類Dev

流暢なビルダーパターンC#でオブジェクトがインスタンス化されないようにする

分類Dev

codeigniterコントローラーなどを使用せずにcodeigniterのサブフォルダーとサブドメインにアクセスする

分類Dev

流暢な NHibernate の複数の抽象クラス継承。抽象クラスのデータベースにテーブルを作成せずに具体的なクラスごとにテーブルを作成する方法

分類Dev

Java-ジェネリックスを使用して流暢なインターフェースを作成する

分類Dev

d3.jsを使用してデータを再レンダリングせずに無限にスクロールする棒グラフ

分類Dev

TypeScript型システムを使用して流暢でステートフルなビルダーを作成する

分類Dev

流暢なビルダーを自動生成するScalaマクロ

分類Dev

クラスパスフィールドを使用せずにJenkinsにカスタムjarファイルをロードする

分類Dev

流暢なアサーション:クラスのプロパティを大まかに比較します

分類Dev

クラスを追加せずにコンパレータを使用する

分類Dev

Mavenアセンブリプラグイン:パスフォルダーを使用せずにファイルをインクルードする

分類Dev

NInjectを使用したWPFでパラメーターなしのコンストラクターを使用せずにviewmodelクラスを挿入する

分類Dev

クラスローダーを使用せずにJavaクラスを動的にロードする方法は?

分類Dev

for ...範囲を使用せずに文字列のランダムなルーン要素にアクセスする

分類Dev

アダプターパターンを使用せずにSpringMVCコントローラーを拡張する

分類Dev

パッケージエクスプローラー/プロジェクト/ナビゲーターを使用せずに2つの開いているファイルを比較する方法はありますか?

分類Dev

パラメータなしのコンストラクタを使用せずにISerializableクラスをシリアル化する

分類Dev

ノードの内部IPを使用せずに、kubernetesクラスターを構成するワーカーノードをping(icmp)監視したい

分類Dev

asp.netmvcでモデルクラスを使用せずにビュードロップダウンリストからコントローラーにデータを取得する方法

分類Dev

暗号化せずにAppleNSKeyedArchiverクラスを使用して、スコアデータをローカルに保存する

分類Dev

ネットワークスクリプトでHWADDRフィールドを使用せずに静的IPをcentosに構成する方法

分類Dev

ルーターモジュール全体を使用せずに、DefaultUrlSerializerクラスのみをAngularプロジェクトにインポートする

分類Dev

Snakefileを使用せずにsnakemakeワークフローを実行する

分類Dev

コンパイル時にカスタムクラスローダーを使用する

分類Dev

ログインが必要なデコレータを静的なユーザーIDとパスワードを使用してフラスコルートに統合するにはどうすればよいですか?

分類Dev

流暢なアサーション:DateTimeプロパティのコレクションでBeCloseToを使用する

Related 関連記事

  1. 1

    ビルダーを別のクラスに保持する(流暢なインターフェース)

  2. 2

    ビルダーパターンで流暢なインターフェースを使用する

  3. 3

    インターフェイスで使用可能な静的な「sides」プロパティを使用せずに、単純なDiceオブジェクトを作成する

  4. 4

    流暢なビルダーパターンC#でオブジェクトがインスタンス化されないようにする

  5. 5

    codeigniterコントローラーなどを使用せずにcodeigniterのサブフォルダーとサブドメインにアクセスする

  6. 6

    流暢な NHibernate の複数の抽象クラス継承。抽象クラスのデータベースにテーブルを作成せずに具体的なクラスごとにテーブルを作成する方法

  7. 7

    Java-ジェネリックスを使用して流暢なインターフェースを作成する

  8. 8

    d3.jsを使用してデータを再レンダリングせずに無限にスクロールする棒グラフ

  9. 9

    TypeScript型システムを使用して流暢でステートフルなビルダーを作成する

  10. 10

    流暢なビルダーを自動生成するScalaマクロ

  11. 11

    クラスパスフィールドを使用せずにJenkinsにカスタムjarファイルをロードする

  12. 12

    流暢なアサーション:クラスのプロパティを大まかに比較します

  13. 13

    クラスを追加せずにコンパレータを使用する

  14. 14

    Mavenアセンブリプラグイン:パスフォルダーを使用せずにファイルをインクルードする

  15. 15

    NInjectを使用したWPFでパラメーターなしのコンストラクターを使用せずにviewmodelクラスを挿入する

  16. 16

    クラスローダーを使用せずにJavaクラスを動的にロードする方法は?

  17. 17

    for ...範囲を使用せずに文字列のランダムなルーン要素にアクセスする

  18. 18

    アダプターパターンを使用せずにSpringMVCコントローラーを拡張する

  19. 19

    パッケージエクスプローラー/プロジェクト/ナビゲーターを使用せずに2つの開いているファイルを比較する方法はありますか?

  20. 20

    パラメータなしのコンストラクタを使用せずにISerializableクラスをシリアル化する

  21. 21

    ノードの内部IPを使用せずに、kubernetesクラスターを構成するワーカーノードをping(icmp)監視したい

  22. 22

    asp.netmvcでモデルクラスを使用せずにビュードロップダウンリストからコントローラーにデータを取得する方法

  23. 23

    暗号化せずにAppleNSKeyedArchiverクラスを使用して、スコアデータをローカルに保存する

  24. 24

    ネットワークスクリプトでHWADDRフィールドを使用せずに静的IPをcentosに構成する方法

  25. 25

    ルーターモジュール全体を使用せずに、DefaultUrlSerializerクラスのみをAngularプロジェクトにインポートする

  26. 26

    Snakefileを使用せずにsnakemakeワークフローを実行する

  27. 27

    コンパイル時にカスタムクラスローダーを使用する

  28. 28

    ログインが必要なデコレータを静的なユーザーIDとパスワードを使用してフラスコルートに統合するにはどうすればよいですか?

  29. 29

    流暢なアサーション:DateTimeプロパティのコレクションでBeCloseToを使用する

ホットタグ

アーカイブ