买Martin Fowler著的那本《重构--改善既有代码的设计》已经快一个月了,看的也不是很多,但真的是受益匪浅。其实在第一次接触这本书之前就已经使用过重构的手法。当我的代码中两次出现基本一样的代码时,我就会想是不是可以把他们提炼出来调用一下来达到同样的效果?当三次出现基本一样的代码时,这时我已经确信必须将我之前的想法付诸实践了--我觉得每个从事编程的人都应该是这样的--一如设计模式一样,在《Design Patterns》这本“震撼整个软件行业”的书正式出版之前,很多人其实已经在自己的代码中或多或少的使用过其中的设计模式。只是当它们以一种让大多数人认可的形式出现并被广泛接受时,我们才会恍然大悟--哦,原来这就是所谓的“重构”......
昨天晚上本来准备把网域的项目跟他们一起做完的,可是......最后自己下了一点代码来看。以下是看了以后的一点小收获--不足的地方还希望看过的朋友帮忙指出。
示例代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;


/**//// <summary>
/// EmailCheck 的摘要说明
/// </summary>
public class EmailCheck


{
private const string strSpecifyChars = ".-_~"; //定义用户名部分可以输入的一些特殊字符: “ .” “ -” “ _” “ ~” 符号

public EmailCheck()

{
}


/**//// <summary>
/// 主要验证方法
/// </summary>
/// <param name="strDate"></param>
/// <测试样例>
/// 

.
/// </测试样例>
/// <returns></returns>
public bool Validate( string strDate )

{
int status = 1; //标志当前验证的字符为Email的哪部分. 1:表示正在验证用户名部分; 2:表示正在验证服务器部分; 3.表示正在验证域名部分

bool blnUserNameNotIsNull = false; //UserName部分是否为空.
bool blnServerNotIsNull = false; //Server部分是否为空.
bool blnDomainNotIsNull = false; //Domain部分是否为空.
char[] charDate = strDate.Trim().ToCharArray();
if( strDate.Trim().Length == 0 )

{
return false;
}
else if( strDate.Trim().Length > 0 && Char.IsLetterOrDigit( strDate[0] ) == false )

{
return false;
}
foreach( char c in charDate )

{
//验证用户名部分是否输入正确
if( status == 1 )

{
if( c == '@' )

{
status = 2;
continue;
}
if( ValidateUsernamePart( c ) )

{
if( blnUserNameNotIsNull == false )

{
blnUserNameNotIsNull = true;
}
continue;
}
return false;
}

//验证服务器部分是否输入正确
if( status == 2 )

{
if( c == '.' )

{
status = 3;
continue;
}

if( ValidateServerOrDomainPart( c ) )

{
if( blnServerNotIsNull == false )

{
blnServerNotIsNull = true;
}
continue;
}
return false;
}

//验证域名部分是否输入正确
if( status == 3 )

{
if( ValidateServerOrDomainPart( c ) )

{
if( blnDomainNotIsNull == false )

{
blnDomainNotIsNull = true;
}
continue;
}
return false;
}
}

//检查各部分是否有输入为null的.
if( blnUserNameNotIsNull == false || blnServerNotIsNull == false || blnDomainNotIsNull == false )

{
return false;
}

return true;
}


/**//// <summary>
/// 验证用户名部分
/// </summary>
/// <param name="c"></param>
/// <returns></returns>
private bool ValidateUsernamePart( char c )

{
if( Char.IsLetterOrDigit( c ) || strSpecifyChars.Contains( c.ToString() ) )

{
return true;
}
return false;
}


/**//// <summary>
/// 验证域名部分
/// </summary>
/// <param name="c"></param>
/// <returns></returns>
private bool ValidateServerOrDomainPart( char c )

{
if( Char.IsLetterOrDigit( c ) )

{
return true;
}
return false;
}
}

以下是我做了一些修改以后的代码,简单测试了一下,能正确运行:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public class Email


{
private const string _specialChar = ".-_~"; //定义用户名部分可以输入的特殊字符,如:"." , "-" , "_" , " ~ "
bool _IsNamePartNull = false; //用户名部分是否为空
bool _IsServerPartNull = false; //服务器部分是否为空
bool _IsDomainPartNull = false; //域名部分是否为空
public Email()

{ }

//主要验证方法
public bool Validate(string value)

{
int _status = 1; //标识当前验证的是Email的哪个部分:1代表Name(用户名)部分,2代表Server(服务器)部分,3代表Domain(域名)部分

char[] email = value.Trim().ToCharArray();

if (value.Length == 0)

{
return false;
}
else if (value.Trim().Length > 0 && Char.IsLetterOrDigit(value[0]) == false)

{
return false;
}

//判断Email是否有效
IsValid(email,_status);

//判断是否有空的部分
if (_IsNamePartNull == false || _IsServerPartNull == false || _IsDomainPartNull == false)
return false;
return true;
}

private void IsValid(char[] email, int status)

{
foreach (char c in email)

{
switch (status)

{
case 1:
IsNamePartValidate(ref status, c, ref _IsNamePartNull);
break;
case 2:
IsServerPartValidate(ref status, c, ref _IsServerPartNull);
break;
case 3:
IsDomainPartValidate(c, ref _IsDomainPartNull);
break;
default:
break;
}
}
}

//判断Name部分是否正确
private bool IsNamePartValidate(ref int status, char c, ref bool isNamePartNull)

{
if (c == '@')

{
status = 2;
}
if (NamePartValidate(c))

{
if(isNamePartNull == false)

{
isNamePartNull = true;
}
}
return false;
}

//判断Server部分是否正确
private bool IsServerPartValidate(ref int status, char c,ref bool isServerPartNull)

{
if (c == '.')

{
status = 3;
}
if (ServerOrDomainPartValidate(c))

{
if (isServerPartNull == false)

{
isServerPartNull = true;
}
}
return false;
}
//判断域名部分是否正确
private bool IsDomainPartValidate(char c,ref bool isDomainPartNull)

{
if (ServerOrDomainPartValidate(c))

{
if (isDomainPartNull == false)

{
isDomainPartNull = true;
}