2

ファイルとデータベースからすべての検証基準を管理する Validator クラスがあります。しかし、この基準はローダーによって次のようにロードされます。

Validator validator = Loader.load("clients"); //get all from clients.cfg file

現在読み込まれている基準を別のクラスから判断するための最良の方法は何ですか?

Importer importer;
Validator clientsValidator = Loader.load("clients");
Validator addressValidator = Loader.load("address"); ...
importer.validate(data, clientsValidator, addressValidator);

public class Importer{
   public void validate(Data data, Validator... validator){
      ...
      validateClient(data, one of validators);
      validateAddress(data, another of validator);
      ...
   }
}

Importer クラスで、クライアント用の Validator とアドレス用の Validator を知る必要があります... 良いアプローチはありますか?

4

3 に答える 3

1

最善の方法は、フィールドとそれに付随するメソッドを追加して、それが作成されValidatorた識別子 (例: ) を返すことです。"clients"

または、呼び出すときに別の識別子を使用して、インターフェイスをLoader.load()実装する別のクラスのインスタンスを取得する場合は、メソッドを使用してそれらのクラスを区別できます。これらのクラスが非常に小さなセット内にある場合は、直接使用しても問題が解決する可能性があります。ValidatorObject.getClass()instanceof

より具体的な回答を提供する前にLoader、正確に何をするのか、何がコードを変更することが許可されているのかなど、より多くの情報が必要です。Validator

編集:

正直なところ、データ モデルの再設計を再考する必要があるかもしれません。現状では、チェックなしでクライアントとアドレスを混在させることができるようです。Java のタイプ セーフ機能に依存できるように、コードを再構築する必要があります。

1 つの方法は、汎用の class/interfaceValidator<T>を使用Tすることです。検証済みオブジェクトのクラスは次のようになります。

public interface Validator<T> {
    public boolean validate(T object);
}

次に、データ用の特定のDataサブクラス ( や など) を作成Addressし、特定のメソッドを使用してClient型指定されたValidatorオブジェクトを に設定できます。Importer

public class Importer {
    public void addAddressValidator(Validator<Address> validator) {
        ...
    }

    public void addClientValidator(Validator<Client> validator) {
        ...
    }
}

これは、単一の可変引数メソッド呼び出しですべてのバリデーター オブジェクトを混合するよりもはるかに安全であり、実際の最も一般的なフレームワークで推奨されるアプローチでもあります。

于 2013-02-20T07:51:32.710 に答える
0

バリデーターを position で渡します。使用する前に、特定のバリデーターが null であるかどうかも確認する必要があります。

public void validate(Data data, 
    Validator clientsValidator, 
    Validator addressValidator) {
    ...
    if (clientsValidator != null) {
        validateClient(data, clientsValidator);
    }
    if (addressValidator != null) {
        validateAddress(data, addressValidator);
    }
    ...
}
于 2013-02-20T08:04:46.470 に答える
0

ローダーがソースをロードするときに設定されるgetSource()inを持たないのはなぜですか。Validator

以下の特定の質問についてさらに考えます。

クライアント用のバリデーターとアドレス用のインポータークラスを知る必要があります...良いアプローチはありますか?

実際には、これを行うためのより良い方法は、Loader がクライアントとアドレスClientValidatorに対して (Validator の実装) を返すことができる場合です。 そうすれば、条件を回避してクラスを直接呼び出すことができますAddressValidator
if-elsevalidateValidator

于 2013-02-20T07:51:13.827 に答える