簡體   English   中英

Validate 接口的繼承設計

[英]Design of inheritance for Validate interfaces

我從來沒有這么擅長設計,因為有很多不同的可能性,它們都有優點和缺點,我永遠不確定該選擇哪一個。 無論如何,這是我的問題,我需要許多不同的松散相關類來進行驗證。 但是,其中一些類需要額外的信息來進行驗證。 我想要一個方法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,但是 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 對象是可驗證的。

那這個呢 :

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 之間引入不需要的依賴關系,那么只需指定一個接口來解耦它們並將其用作驗證器。

現在我必須補充一點,有一個混合模型,您可以同時擁有能夠自我驗證的對象和需要外部狀態信息來驗證的對象,這聽起來很奇怪。

小心說明?

也許apache commons 驗證器項目在這里很有用 - 直接或作為如何解決您的問題的模型。 它們實際上有一組並行的對象來進行驗證——所以對象上沒有接口,只有對象/類的相關驗證器的存在/不存在。

這是在 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);
}

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

這第三個接口是一個空接口,它是其他接口的父接口,這意味着您可以只檢查該接口(假設您不擔心有人欺騙是可驗證的),然后根據需要迭代檢查可能的驗證接口實際驗證。

例子:

interface Validateable
{
}

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM