软件工程

本类阅读TOP10

·PHP4 + MYSQL + APACHE 在 WIN 系统下的安装、配置
·Linux 入门常用命令(1)
·Linux 入门常用命令(2)
·使用 DCPROMO/FORCEREMOVAL 命令强制将 Active Directory 域控制器降级
·DirectShow学习(八): CBaseRender类及相应Pin类的源代码分析
·基于ICE方式SIP信令穿透Symmetric NAT技术研究
·Windows 2003网络负载均衡的实现
·一网打尽Win十四种系统故障解决方法
·数百种 Windows 软件的免费替代品列表
·收藏---行百里半九十

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
改进你的数据校验 -- Value Object Validate 模式

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

Value Object Validate  模式


   嗨!在j2ee开发中,你是否常常需要将数据对象持久化到数据库系统中,你是否为在持久化之前,校验大量的将被持久化的数据感到头疼,是否有一种比较好的方法来进行大量持久化数据的校验呢?本模式将提供一种比较可行的解决方法。

    Data Object Transfer 模式在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 java.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<methodC.length;i++){    
         bname =methodC[i].getName();
             if(bname.startsWith("get")){
             bname =bname.substring(3,bname.length());     
               

          for(int j=0;j<methodV.length;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");
           }
 
}
}

 

正如你所看到的,我们消除了大量的匹配校验代码,实现了自动匹配,你可进一步改进本模式,实现一个通用校验类,使的进一步消除匹配代码。




相关文章

相关软件