1

非常に多くの異なる可能性があり、それらにはすべて長所と短所があり、どれを使用すればよいかわからないため、私はデザインが得意ではありません。とにかく、ここに私の問題があります。さまざまなゆるやかに関連するクラスを検証する必要があります。ただし、これらのクラスの中には、検証を行うために追加情報が必要なものもあります。オブジェクトを検証するために使用できるメソッドvalidateが必要であり、オブジェクトがインターフェイスで検証可能かどうかを判断したいと考えていますValidatable。以下は、私が持つことができる2つの基本的な解決策です。

interface Validatable {
  public void validate() throws ValidateException;
}
interface Object1Validatable {
  public void validate(Object1Converse converse) throws ValidateException;
}
class Object1 implements Object1Validatable {
  ...
  public void validate() throws ValidateException {
    throw new UnsupportedOperationException();
  }
}
class Object2 implements Validatable {
  ...
  public void validate() throws ValidateException {
    ...
  }
}

これは、検証可能な何かが実装され、検証に使用できる一般的なグローバルインターフェイスを持つ最初のソリューションですが、Object1validate()はこれをサポートしていないため、一種の機能不全ですが、Object2 はそれをサポートしており、他の多くのクラスも同様です。

別の方法として、次のようにすると、トップレベルのインターフェイスがなくなります。

interface Object1Validatable {
  public void validate(Object1Converse converse) throws ValidateException;
}
class Object1 implements Object1Validatable {
  ...
  public void validate(Object1Converse converse) throws ValidateException {
    ...
  }
}
interface Object2Validatable {
  public void validate() throws ValidateException;
}
class Object2 implements Object2Validatable {
  ...
  public void validate() throws ValidateException {
    ...
  }
}

私が抱えている主な問題は、少なくともXまたはYオブジェクトが検証可能であると言えるように、トップレベルのインターフェースを持つという考えに固執していることだと思います。

4

4 に答える 4

2

これはどうですか :

interface Validatable {
  void validate(Validator v);
}

class Object1 implements Validatable{
  void validate(Validator v){
    v.foo
    v.bar
  }
}
class Object1Converse implements Validator{
 //....
}
class Object2 implements Validatable{
  void validate(Validator v){
    //do whatever you need and ingore validator ? 
  }
}

Object2が不要な引数を受け取った場合、何を気にしますか?それがなくても正しく動作することができれば、それを無視することができますか?

object2とObject1Converseの間に不要な依存関係が生じることを心配している場合は、それらを分離するためのインターフェースを指定し、それをバリデーターとして使用するだけです。

ここで、自己検証可能なオブジェクトと、検証するために外部状態情報を必要とするオブジェクトの両方が奇妙に聞こえる混合モデルがあることを追加する必要があります。

説明する気ですか?

于 2008-10-08T11:04:26.707 に答える
0

おそらく、apache commons validatorプロジェクトは、直接または問題を攻撃する方法のモデルとして、ここで役立つでしょう。それらは事実上、検証を行うオブジェクトの並列セットを持っています-したがって、オブジェクトにはインターフェースはなく、オブジェクト/クラスに関連するバリデーターの有無だけです。

于 2008-10-08T11:04:35.957 に答える
0

これはC#ですが、同じアイデアを他の多くの言語で確実に実装できます。

public class MyClass {
    //Properties and methods here
}

public class MyClassValidator : IValidator<MyClass> {
    IList<IValidatorError> IValidator.Validate(MyClass obj) {
        //Perform some checks here
    }
}

//...

public void RegisterValidators() {
    Validators.Add<MyClassValidator>();
}

//...

public void PerformSomeLogic() {
    var myobj = new MyClass { };
    //Set some properties, call some methods, etc.
    var v = Validators.Get<MyClass>();
    if(v.GetErrors(myobj).Count() > 0)
        throw new Exception();
    SaveToDatabase(myobj);
}
于 2008-10-08T11:05:29.807 に答える
0

「オブジェクトを検証できるか」という問題の簡単な解決策は、3番目のインターフェースを追加することです。

この3番目のインターフェースは、他の両方のインターフェースを親とする空のインターフェースです。つまり、そのインターフェースをチェックするだけで(誰かのなりすましが検証可能であることを心配していない場合)、必要に応じて、可能な検証インターフェースを繰り返しチェックできます。実際に検証します。

例:

interface Validateable
{
}

interface EmptyValidateable inherits Validateable //Or is it implements?
{
     void validate() throws ValidateException;
}

interface Objectvalidateable inherits Validateable
{
     void validate(Object validateObj);
}
于 2008-10-08T11:11:39.560 に答える