我从来没有如此擅长设计,因为有很多不同的可能性,它们都有利有弊,我不知道该选择哪一个。无论如何,这是我的问题,我需要许多不同的相关类来进行验证。但是,其中一些类需要额外的信息才能进行验证。我希望有一个方法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不支持这个,所以它是一种defunc,但是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对象是可以验证的。
答案 0 :(得分: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之间引入不需要的依赖关系,那么只需指定一个接口来解耦它们并将其用作验证器。
现在我必须添加一个混合模型,其中既有对象能够自我验证又有对象需要外部状态信息来验证声音奇怪。
关心说明?
答案 1 :(得分:0)
也许apache commons validator项目在这里很有用 - 无论是直接还是作为如何攻击您的问题的模型。它们实际上有一组并行的对象进行验证 - 因此对象上没有接口,只有对象/类的相关验证器的存在/不存在。
答案 2 :(得分: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);
}
答案 3 :(得分:0)
作为“可以验证对象”的简单解决方案,问题是添加第三个接口。
这个第三个接口是一个空的,它同时支持其他接口,这意味着您可以检查该接口(假设您不担心某人欺骗可验证),然后迭代检查可能的验证接口如果你需要实际验证。
示例:
interface Validateable
{
}
interface EmptyValidateable inherits Validateable //Or is it implements?
{
void validate() throws ValidateException;
}
interface Objectvalidateable inherits Validateable
{
void validate(Object validateObj);
}