统一管理应用程序的参数检查

本文介绍了一种参数验证框架的设计与实现,通过定义通用的Validator类及其子类,如StringValidator,结合ValidatorFactory进行集中验证,实现了参数合法性的统一管理和便捷修改。

  在开发系统的过程中,我们经常需要检查应用程序的参数的合法性.最简单的一种方法就是在每个函数前面都去检查参数.如下所示:

 

public string GetName(string firstName)
{
       
if (null == firstName || 0 == firstName.Trim().length)
       
{
               
// Error process.
       }


}

  但是如果在项目开发的后期,可能你会想要修改错误的检查.比较常见的有以下两种形式:

  1.修改某个特定的参数的范围,如修改所有检查用户名的代码,将原来的最长为10个字符修改为20个字符

  2.修改错误处理的机制,如将原来抛出ArgumentException的处理修改成,先记录错误信息,再抛出系统自定义的异常MyException

  第一种修改可能工作量不会很大,但是对于第二种类型的修改,则需要修改所有的错误处理的代码...其痛苦程度可想而知.

  那么有什么办法可以更好地解决这种问题呢?统一处理系统中的错误检查!

  虽然目前已经有某些新的技术来帮我们解决问题,如AOP技术,但是对于中小型的系统来说,学习AOP技术的时间可能比完成整个系统的时间还长.最近在项目中,我采用了另一种的方法来做:

  1.区分系统中常出现的参数出错类型:

  在系统中,通常的参数检查不外乎是检查Object是否为null;检查字符串是否为null,是否为空,长度是否在某个范围之内;检查数(包括整数,浮点数)是否为null(对于允许null的数据类型,如Integer),是否在指定的范围内.

  2.定义参数检查对象的类型(包括Object,字符串,整数,浮点数)

using System;
using System.Collections.Generic;
using System.Text;

    
public class Validator
    
{
        
private string _validatorName;   //参数检查器的名称
        
private string _objectName;       //检查的参数的名称
        
private bool _nullAble;                 //是否可以为空

        
public Validator(string objectName, bool nullAble)
            : 
this("Validator", objectName, nullAble)
        
{
        }


        
public Validator(string validatorName, string objectName, bool nullAble)
        
{
            
this._validatorName = validatorName;
            
this._objectName = objectName;
            
this._nullAble = nullAble;
        }


        
public bool NullAble
        
{
            
get
            
{
                
return _nullAble;
            }

        }


        
public string ValidatorName
        
{
            
get
            
{
                
return _validatorName;
            }

        }


        
public string ObjectName
        
{
            
get
            
{
                
return _objectName;
            }

        }

    }


 

using System;
using System.Collections.Generic;
using System.Text;

    
public class StringValidator : Validator
    
{

        
private bool _emptyAble;    是否可以为空
        
private int _maxLength;       最大长度是多少

        
public StringValidator(bool nullAble, bool emptyAble, int maxLength, string objectName)
            : 
base("StringValidator", objectName, nullAble)
        
{

            
this._emptyAble = emptyAble;
            
this._maxLength = maxLength;
        }


        
public bool EmptyAble
        
{
            
get
            
{
                
return _emptyAble;
            }

        }


        
public int MaxLength
        
{
            
get
            
{
                
return _maxLength;
            }

        }

    }

  以上只提供了字符串的检查类型(StringValidator)和对象的检查类型(Validator),其它类型的检查类型只需要继承Validator,再提供需要检查的配置就行了.

  3.定义检查工厂,用于检查所有的检查类型.

using System;
using System.Collections.Generic;
using System.Text;


    
public class ValidatorFactory
    
{
        
public static void Validate(Validator validator, object value)
        
{
            
if (false == validator.NullAble && null == value)
            
{
                
throw new ValidatorException(validator.ObjectName + " should not be Null");
            }

            
            
if (validator is StringValidator)
            
{
                
if (false == value is string)
                
{
                    
throw new ValidatorException("StringValidator can't validate not-string value");
                }

                StringValidator stringValidator 
= validator as StringValidator;
                String stringValue 
= value as string;
                
if (false == stringValidator.EmptyAble && 0 == stringValue.Trim().Length)
                
{
                    
throw new ValidatorException(stringValidator.ObjectName + " should not be Empty");
                }

                
if (stringValidator.MaxLength != -1 && stringValue.Length > stringValidator.MaxLength)
                
{
                    
throw new ValidatorException("Length of " + stringValidator.ObjectName + " should be less or equal than " + stringValidator.MaxLength);
                }

            }

            
throw new ValidatorException("Unknown Validator" + validator.GetType().ToString());
        }

    }

  该Factory用于检查所有的检查类型,如果检查不成功则抛出ValidatorException(自定义的Exception,这里不提供,只需要继承Exception基类就行了).

  4.在统一的类里面定义系统中参数的检查要求.

 

using System;
using System.Collections.Generic;
using System.Text;
    
public class ValidatorEnum
    
{
        
public static Validator EmailHeadInfo_FromAlias = new StringValidator(falsefalse-1"EmailHeadInfo.FromAlias");
        
public static Validator EmailHeadInfo_ToAlias = new StringValidator(falsefalse-1"EmailHeadInfo.ToAlias");
        
public static Validator EmailHeadInfo_CcAlias = new StringValidator(falsetrue-1"EmailHeadInfo.CCAlias");
        
public static Validator EmailHeadInfo_MailPriority = new StringValidator(falsefalse-1"EmailHeadInfo.MailPriority");
        
public static Validator EmailHeadInfo_Subject = new StringValidator(falsefalse-1"EmailHeadInfo.Subject");
     
        ...................................
          
   }

  如以上定义了五个String类型的参数检查类型.

  5.在系统函数里面利用ValidationFactory和ValidatorEnum来检查参数.

public string setEmailFromAlias(string fromAlias)
{
        ValidatorFactory.Validate(ValidatorEnum.EmailInfo_FromAlias, fromAlias);
        .............................
}

  

  如果需要修改某种类型的参数的检查,我们只需要在ValidatorEnum类里面修改;如果需要修改错误处理的机制,我们只需要在ValidatorFactory类里面修改.就统一地管理了系统里面的参数,非常方便于对代码检查及其处理机制的修改.

  

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值