在开发系统的过程中,我们经常需要检查应用程序的参数的合法性.最简单的一种方法就是在每个函数前面都去检查参数.如下所示:
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(false, false, -1, "EmailHeadInfo.FromAlias");
public static Validator EmailHeadInfo_ToAlias = new StringValidator(false, false, -1, "EmailHeadInfo.ToAlias");
public static Validator EmailHeadInfo_CcAlias = new StringValidator(false, true, -1, "EmailHeadInfo.CCAlias");
public static Validator EmailHeadInfo_MailPriority = new StringValidator(false, false, -1, "EmailHeadInfo.MailPriority");
public static Validator EmailHeadInfo_Subject = new StringValidator(false, false, -1, "EmailHeadInfo.Subject");
...................................
}如以上定义了五个String类型的参数检查类型.
5.在系统函数里面利用ValidationFactory和ValidatorEnum来检查参数.
public string setEmailFromAlias(string fromAlias)
...{
ValidatorFactory.Validate(ValidatorEnum.EmailInfo_FromAlias, fromAlias);
.............................
}
如果需要修改某种类型的参数的检查,我们只需要在ValidatorEnum类里面修改;如果需要修改错误处理的机制,我们只需要在ValidatorFactory类里面修改.就统一地管理了系统里面的参数,非常方便于对代码检查及其处理机制的修改.
本文介绍了一种参数验证框架的设计与实现,通过定义通用的Validator类及其子类,如StringValidator,结合ValidatorFactory进行集中验证,实现了参数合法性的统一管理和便捷修改。

被折叠的 条评论
为什么被折叠?



