改進你的資料校驗 -- Value Object Validate 模式 (轉)

gugu99發表於2008-05-26
改進你的資料校驗 -- Value Object Validate 模式 (轉)[@more@]

Value Validate 


  嗨!在開發中,你是否常常需要將資料持久化到中,你是否為在持久化之前,校驗大量的將被持久化的資料感到頭疼,是否有一種比較好的方法來進行大量持久化資料的校驗呢?本模式將提供一種比較可行的解決方法。

  Data Object Traner 模式在j2ee應用中被廣泛採用,它降低了資料在中傳送的開銷,改善了持久化的瓶頸,但是我們不得不面臨一個問題,大量的資料物件在被持久化前需要嚴格的被校驗,這必然造成大量的校驗程式碼出現,如何消除手工書寫大量的重複的校驗程式碼呢?我採用了Value Object Validator校驗模式。我的解決的方法1:採用反射,比較資料物件和校驗物件的匹配項; 2:匹配相關項; 3:被校驗物件的匹配get方法,獲得值; 4:呼叫校驗物件的匹配validate方法,校驗3所獲得得值。

  讓我來用程式碼詳細描述如下:
 首先讓我來定義將被校驗的類: 
  class Customer { 
    private String name;
  private Integer id;
 
  public void setName(String name){
    this.name =name;
  }
 
  public void setId(Integer id){
    this.id =id;
  }
 
  public String getName(){
  return name;
  }
 
  public Integer getId(){
  return id;
  }
 
 }

接下來來定義校驗類

 class ValidateCustomer {
 
 
  public boolean validateName(String name) {
   //這裡模擬校驗
 if(name.equals("a")) return true;
  return false;
  }
 
  public boolean validateId(Integer id) { 

   //這裡模擬校驗
 if(id.equals(new Integer("1"))) return true;
  return false;
  } 
 
  }
 
 

我使用一個main來展示如何動態校驗 
import .lang.reflect.*;
public class Test{
 
 public static void main(String[] args){
 
 try{
  ValidateCustomer  validateCustomer= new ValidateCustomer();
  Customer customer = new Customer(); 
 //設定資料物件的將被校驗的資料 
  customer.setId(new Integer("1"));
  customer.setName("a");
 
  Method[] methodC = Class.forName("Customer").getMethods(); 
  Method[] methodV = Class.forName("ValidateCustomer").getMethods(); 
 
 
    String bname,vname;
    Object b ,a;
 
    for(int i=0;i    bname =methodC[i].getName();
    if(bname.startsWith("get")){
    bname =bname.substring(3,bname.length());   
     

  for(int j=0;j      vname =methodV[j].getName();
      if(vname.startsWith("validate")){
        vname = vname.substring(8,vname.length());    
 //注意這裡,確保方法匹配

  if(bname.equalsIgnoreCase(vname)){   


  a = methodC[i].invoke(customer,new Object[]{});
        b= methodV[j].invoke(validateCustomer,new Object[]{a});
       
        if(b.toString().equals("false")){
         throw new Exception();
        }
       
 
    }
    }
    }
  }

  }
 
    System.out.println("ok");
    }catch(Exception e){
     System.out.println("can not access");
     }
 
}
}

 

正如你所看到的,我們消除了大量的匹配校驗程式碼,實現了自動匹配,你可進一步改進本模式,實現一個通用校驗類,使的進一步消除匹配程式碼。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1004611/,如需轉載,請註明出處,否則將追究法律責任。

相關文章