1

我从来没有这么擅长设计,因为有很多不同的可能性,它们都有优点和缺点,我永远不知道该选择哪一个。无论如何,这是我的问题,我需要许多不同的松散相关的类来进行验证。但是,其中一些类需要额外的信息来进行验证。我想要一个validate可用于验证 Object 的方法,并且我想确定 Object 是否可以通过接口验证,比如Validatable. 以下是我可以拥有的两个基本解决方案。

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 {
    ...
  }
}

这是第一个解决方案,我有一个通用的全局接口,可以验证的东西实现并且我可以validate()用来验证,但 Object1 不支持这个,所以它有点失效,但 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 验证器项目在这里会很有用 - 直接或作为如何解决您的问题的模型。它们实际上有一组并行的对象来进行验证——所以对象上没有接口,只是对象/类的相关验证器的存在/不存在。

于 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

“可以验证对象”问题的简单解决方案是添加第三个接口。

这第三个接口是其他两个接口的空接口,这意味着您可以只检查该接口(假设您不担心有人欺骗是可验证的),然后在需要时迭代检查可能的验证接口实际验证。

例子:

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 回答