2008-10-08 53 views
1

我從來沒有如此擅長設計,因爲有這麼多種不同的可能性,他們都有優點和缺點,我不知道該去哪。無論如何,這是我的問題,我需要許多不同鬆散相關的類來驗證。但是,其中一些類需要額外的信息來進行驗證。我想要一個方法validate,可以用來驗證一個對象,我想確定一個對象是否可以通過接口進行驗證,比如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,但對象2不支持它其他許多課程也是如此。

另外,我可以有以下這將離開我沒有頂級界面。

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對象是可驗證的想法。

回答

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 ? 
    } 
} 

你在乎什麼,如果對象2接收到不必要的爭論?如果沒有它就能正確操作,它可以忽略它嗎?

如果您擔心在object2和Object1Converse之間引入不必要的依賴關係,那麼只需指定一個接口來將它們解耦並將其用作驗證器。

現在我必須補充說,有一個混合模型,你有兩個對象都能夠自我驗證,而對象需要外部狀態信息來驗證聲音的怪異。

照顧說明?

+0

如果我是做這種方式,那麼我就必須驗證(對象o),然後每一類可確定要傳遞什麼類型的對象吧,但隨後有沒有類型檢查和有效的任何事情可以傳遞給驗證方法,這可能會導致問題。 – 2008-10-08 11:11:33

+0

我不會使用Object,因爲它沒有將信息傳遞給未來的開發人員,因此我將該類型限制爲驗證器對象。我仍然認爲嘗試將通用接口應用於不同的行爲(自我和外部驗證)是有問題的。 – Jean 2008-10-08 11:15:46

0

也許這個apache commons validator項目在這裏很有用 - 可以直接使用或作爲如何解決問題的模型。它們有效地具有一組並行的對象來執行驗證 - 因此對象上沒有接口,只是存在/不存在對象/類的相關驗證器。

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); 
} 
0

作爲簡單的解決方案「可以驗證對象」的問題是添加第三個接口。

這個第三個接口是一個空的父接口,這意味着你可以檢查該接口(假設你不擔心某個欺騙是可驗證的),然後迭代檢查可能的驗證接口,如果你需要實際驗證。

例子:

interface Validateable 
{ 
} 

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

interface Objectvalidateable inherits Validateable 
{ 
    void validate(Object validateObj); 
}