17

この問題に直面しているのは私だけではないと確信していますが、今まで解決策を見つけることができません。問題は以下の通りです。

レガシー システムから Web サービス (制御も変更もできません) を公開しましたが、すべてのクライアントがそれを使用しています。Web サービスからリクエストを受け取り、取得するオブジェクトは非常に複雑ですが、例として、オブジェクト B、オブジェクト C などの他のオブジェクトを含む Web サービス呼び出しからオブジェクト A を受け取ったとします。さらに、オブジェクト B と C には、いくつかのプリミティブ データ型と、それらに含まれる他のオブジェクトもあります。私の問題は、オブジェクト A 全体 (オブジェクトとサブオブジェクトを含むすべて) を検証したいということですが、ここで推奨される設計パターンはどれですか? 次に、ここでの要点は、さまざまなタイプのオブジェクト A を Web サービスから取得できることです。オブジェクト A のさまざまなタイプが本当に意味することは、オブジェクト A がクライアントに依存するということです。一部のクライアントは、含まれているオブジェクト B にデータを入力せずにオブジェクト A を送信するか、オブジェクト B を部分的に入力してからオブジェクト A に送信することさえできます。オブジェクト B にはそうでないものもあれば、オブジェクト B の要素をほとんど必要としないものもあります。言い換えると、クライアント ABC がオブジェクト B のフィールド abc を文字列型にすることを望んでおり、最大長が 25 文字であることを伝える、各クライアントの検証ルールも格納する場所があります。そのフィールドにデータが必要です。したがって、クライアントに基づいてオブジェクト A を検証する必要があります (オブジェクト B を含める必要があるクライアントもあれば、そうでないクライアントもあれば、オブジェクト B の要素をほとんど必要としないクライアントもあります)。言い換えると、クライアント ABC がオブジェクト B のフィールド abc を文字列型にすることを望んでおり、最大長が 25 文字であることを伝える、各クライアントの検証ルールも格納する場所があります。そのフィールドにデータが必要です。したがって、クライアントに基づいてオブジェクト A を検証する必要があります (オブジェクト B を含める必要があるクライアントもあれば、そうでないクライアントもあれば、オブジェクト B の要素をほとんど必要としないクライアントもあります)。言い換えると、クライアント ABC がオブジェクト B のフィールド abc を文字列型にすることを望んでおり、最大長が 25 文字であることを伝える、各クライアントの検証ルールも格納する場所があります。そのフィールドにデータが必要です。

私が実行したいいくつかの検証は

一部のオブジェクト (オブジェクト B など) のフィールドのデータ型、特定のフィールドの長さをチェックすることは、このクライアントに必要なフィールドであるか、オプションであるかなどです。

具体的な実例は非常に役立ちます。

この特定の例のオブジェクト A の構造は次のとおりです。

    public class A
    {
        private B objectB;
        private C objectC;
        // and so on
    }

    public class B{
        private E objectE;
        private String name;
        private int age;
        // and so on
    } 

    public class C
    {
        private F objectF;
        private String address;
        private String country;
    }

    public class E
    {
        // Members here
    }

    public class F
    {
        // Members here
    }

PS: 一般的な理解のために、クラスとメンバーに任意の名前を付けました。はい、ここで Java を使用していることを忘れていましたが、設計の原則やパターンはどの言語にも適用できるため、それほど重要ではありません。皆さんからの連絡をお待ちしております.. :)

4

2 に答える 2

0

各クラスは、それ自体を検証する方法を知っている必要があります。.Validate() メソッドを持つインターフェイス (IValidatable など) から各クラスを派生させることができます。オブジェクト A で .Validate() を呼び出すときは、それ自体を検証してから、すべての子で .Validate() を呼び出します。それらの子供たちは、同様の方法で自分自身を検証できます。

これは、コマンド パターンの非常に単純なバージョンだと思います。並べ替え。

クラスにアタッチできる Validator を作成することもできます。バリデーターは、電子メールアドレス、通常のアドレスなどを検証する方法を知ることができます。基本的に、必要なツールのみを含むクラスにアタッチするツールボックスを作成しているため、これはもう少し拡張可能です。

于 2013-08-19T16:07:38.577 に答える