随笔 - 42  文章 - 1 评论 - 10 trackbacks - 1

  买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;
        }

        
        
foreachchar 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;
                
            }