C# 谈谈代码重构

原博地址:http://www.cnblogs.com/springyangwc/archive/2011/03/15/1985069.html

C#代码重构

重构(Refactoring)就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。 

一、为什么要重构(Refactoring)

 1、·持续偏纠和改进软件设计。

2、·使代码更易为人所理解。

3、·帮助发现隐藏的代码缺陷。

4、·从长远来看,有助于提高编程效率。

二、何时着手重构(Refactoring)

1、·代码中存在重复的代码。

2、·过大的类和过长的方法。

3、·牵一毛而需要动全身的修改。

4、·类之间需要过多的通讯。

5、·过度耦合的信息链。

6、·不完美的设计。

7、·缺少必要的注释。

三、如何来重构(Refactoring)

所谓重构也就是“保持软件的外在功能不变,重新调整其内部结构”。
Rename:        改名了,类、函数、成员等名字都可以改。

改成大家容易理解其功能用途的名字:

         /// <summary>
         ///
         /// </summary>
         /// <param name="ID"></param>
         /// <param name="numlist"></param>
         /// <returns></returns>
         protected int hename( string ID, Dictionary< int , string > numlist)
         {
             int i = numlist.Count();
             List< string > onelist = ( from entity in numlist where entity.Value == ID select entity.Value).ToList();
             numlist.Add(i + 1, ID);
             return onelist.Count();
         }
 
//修改为
         /// <summary>
         ///
         /// </summary>
         /// <param name="ID"></param>
         /// <param name="numlist"></param>
         /// <returns></returns>
         protected int GetSameNameCount( string ID, Dictionary< int , string > numlist)
         {
             int i = numlist.Count();
             List< string > samelist = ( from entity in numlist where entity.Value == ID select entity.Value).ToList();
             numlist.Add(i + 1, ID);
             return samelist.Count();
         }

Extract Method:     将某段代码封到一个新函数里。

如果在某个方法里有一段代码是可以重新用一个方法来封装的,如下:

        /// <summary>
        ///
        /// </summary>
        /// <param name="dtFormatedData"></param>
        /// <param name="ReplaceColumn"></param>
        /// <returns></returns>
         private DataTable ReplaceCloumnString(DataTable dtFormatedData, List< string > ReplaceColumn)
         {
             Dictionary< string , string > newfirstReplaces = new Dictionary< string , string >();
             newfirstReplaces = needfirstReplaces;
             foreach (KeyValuePair< string , string > newitem in firstReplaces)
             {
                 if (!newfirstReplaces.ContainsKey(newitem.Key))
                 {
                     newfirstReplaces.Add(newitem.Key, newitem.Value);
                 }
             }
             DataTable dtFormatedDataCopy = dtFormatedData.Clone();
             foreach (DataRow dr in dtFormatedData.Rows)
             {
                 foreach (KeyValuePair< string , string > item in newfirstReplaces)
                 {
                     foreach ( string needColumn in ReplaceColumn)
                     {
                         if (dr[needColumn].ToString().Contains(item.Key))
                         {
                             string ContentStr = dr[needColumn].ToString();
                             dr[needColumn] = ReplaceStr(ContentStr, item.Key, item.Value);
                         }
                     }
                 }
                 DataRow drNewRow = dtFormatedDataCopy.NewRow();
                 drNewRow.ItemArray = dr.ItemArray;
                 dtFormatedDataCopy.Rows.Add(drNewRow);
             }
             return dtFormatedDataCopy;
         }
///修改为
            /// <summary>
        ///
        /// </summary>
        /// <param name="dtFormatedData"></param>
        /// <param name="ReplaceColumn"></param>
        /// <returns></returns>
         private DataTable ReplaceCloumnString(DataTable dtFormatedData, List< string > ReplaceColumn)
         {
             Dictionary< string , string > newfirstReplaces = GetReplaceDictionary();
             DataTable dtFormatedDataCopy = dtFormatedData.Clone();
             foreach (DataRow dr in dtFormatedData.Rows)
             {
                 foreach (KeyValuePair< string , string > item in newfirstReplaces)
                 {
                     foreach ( string needColumn in ReplaceColumn)
                     {
                         if (dr[needColumn].ToString().Contains(item.Key))
                         {
                             string ContentStr = dr[needColumn].ToString();
                             dr[needColumn] = ReplaceStr(ContentStr, item.Key, item.Value);
                         }
                     }
                 }
                 DataRow drNewRow = dtFormatedDataCopy.NewRow();
                 drNewRow.ItemArray = dr.ItemArray;
                 dtFormatedDataCopy.Rows.Add(drNewRow);
             }
             return dtFormatedDataCopy;
         }
         private Dictionary< string , string > GetReplaceDictionary()
         {
             Dictionary< string , string > newfirstReplaces = new Dictionary< string , string >();
             newfirstReplaces = needfirstReplaces;
             foreach (KeyValuePair< string , string > newitem in firstReplaces)
             {
                 if (!newfirstReplaces.ContainsKey(newitem.Key))
                 {
                     newfirstReplaces.Add(newitem.Key, newitem.Value);
                 }
             }
             return newfirstReplaces;
         }

------------------------------
Encapsulate Field:    将某个字段转成属性

如下:

   public string = null ;
///转换为
   public string FieldName { get ; set ; }

Extract Interface:    将某个属性或函数转成一个接口,从而是当前的这个属性或函数成为接口实现。

public class FolderBE
    {
       public string FolderOne
       { get ; set ; }
       public DateTime? CreateFolderOne
       { get ; set ; }
       public string FolderTwo
       { get ; set ; }
       public DateTime? CreateFolderTwo
       { get ; set ; }
       public string FolderThree
       { get ; set ; }
       public DateTime? CreateFolderThree
       { get ; set ; }
       public string FolderFour
       { get ; set ; }
       public DateTime? CreateFolderFour
       { get ; set ; }
       public string FolderFive
       { get ; set ; }
       public DateTime? CreateFolderFive
       { get ; set ; }
    }
 
        public List<SingleResultBE> HavelistResult = new List<SingleResultBE>();
 
        private bool CheckFolderExist(FolderBE folder, int item)
        {
            List<FolderBE> HavelistFolder = new List<FolderBE>();
            if (item == 1)
            {
                HavelistFolder = ( from entity in listFolder
                                  where entity.FolderOne == folder.FolderOne &&
                                  string .IsNullOrEmpty(entity.FolderTwo)
                                  select entity).ToList();
            }
            else if (item == 2)
            {
                HavelistFolder = ( from entity in listFolder
                                  where entity.FolderOne == folder.FolderOne &&
                                  entity.FolderTwo == folder.FolderTwo && string .IsNullOrEmpty(entity.FolderThree)
                                  select entity).ToList();
            }
            else if (item == 3)
            {
                HavelistFolder = ( from entity in listFolder
                                  where entity.FolderOne == folder.FolderOne &&
                                  entity.FolderTwo == folder.FolderTwo && entity.FolderThree == folder.FolderThree
                                  select entity).ToList();
            }
            else if (item == 4)
            {
                HavelistFolder = ( from entity in listFolder
                                  where entity.FolderOne == folder.FolderOne &&
                                  entity.FolderTwo == folder.FolderTwo && entity.FolderThree == folder.FolderThree &&
                                  entity.FolderFour == folder.FolderFour
                                  select entity).ToList();
            }
            else if (item == 5)
            {
                HavelistFolder = ( from entity in listFolder
                                  where entity.FolderOne == folder.FolderOne &&
                                  entity.FolderTwo == folder.FolderTwo && entity.FolderThree == folder.FolderThree &&
                                  entity.FolderFour == folder.FolderFour && entity.FolderFive == folder.FolderFive
                                  select entity).ToList();
            }
            return HavelistFolder.Count == 0;
        }

Promote Local Variable to Parameter: 将某个局部变量提升为函数参数

如上
Reorder Parameters:   对函数参数排序


Remove Parameters:   删除某个函数参数,但函数内对这个参数的使用不会删除。
如上,作为全局变量来用
重构函数(CHAPTER6)

Extract Method
前提:已经通过其他重构方法处理了间接变量。
目的:缩小函数的粒度以增加复用;强化代码的清晰度。
目标:函数的名称能够很好的表达函数要实现的“功能”。而不是要怎样做。

Inline Method

是Extract Method 的逆过程。正是因为有了这些逆过程,你才可以放心大胆的进行重构。

前提:被Inline的函数不能是多态的。Inline后无法表达多态的情况。
目的:去掉非必要的间接性。或者用于重组的一组组织不合理的函数的前提。
目标:去掉不必要的函数或者过多的委托。

提取方法是最常用的重构之一。当一个方法看起来太长或者方法中一些代码需要注释才能明白它的目的时,可以考虑把它们提取出来作为一个独立的方法。

特别说明 -------- 新版本请访问网站www.bluefishes.net. 考虑到稳定性,新版本不支持Visual Studio.NET 2002. 产品名称 -------- SharpRefactor(C#代码重构工具) 产品简述 -------- 本工具用于代码重构和代码自动生成。现阶段主要用于C#代码重构。 所谓重构也就是“保持软件的外在功能不变,重新调整其内部结构”。 关于每种重构模式的含义,请参见http://www.refactoring.com/ 具体功能参见具体版本的特性列表。 对重构很感兴趣或是很关注使用效率的用户,希望[使用指南]一节对你有所助益。 版本 ---- 1.0.0(BETA). 发布日期 -------- 2003/6/13 作者 ---- C# Refactor Team. 制作 ---- Blue Workshop. 环境要求 -------- Visual Studio.Net 2003 Windows 2000 + SP2 + SMTP Service 特别提示 -------------- 本插件使用了异常处理和报告机制。 一般而言,环境、代码以及其他原因都会导致程序出错。因此,在您使用本插件的过程中,可能会弹出错误报告。一部分错误不会影响使用,另一部分会影响使用。 C# Refactor Team愿意随时提供技术支持,及时为你解除问题。 版本1.0.0特性 ------------- Rename Parameter Rename Local Variable Rename Field Rename Property Rename Class Rename NameSpace Safe Delete Parameter Safe Delete Local Variable Safe Delete Field Safe Delete Property Safe Delete Method Safe Delete Class Safe Delete NameSpace Extract Interface Undo/Redo Preview usage before refactor(重构前预览) Auto build after refactor(重构后自动生成) Options(工具选项) User feedback(用户反馈) 使用指南 -------- 所有功能暂不支持静态成员。 尽量使用鼠标右键菜单。 尽量使用快捷方式,比如:单击鼠标右键,弹出菜单后再连续按‘R’键和‘C’键就可以调用[Rename]菜单下的[Rename Class]命令。 在使用Rename系列命令时,需要先转到定义代码元素的地方。此时,可以先使用右键菜单中的[转到定义]命令。 在Option中可以设置首选项。 由于Visual Studio在生成较大的解决方案时有时会不成功,所以Auto build after refactor通常用于较小的解决方案。 Rename NameSpace与Move Class不同。Move Class的焦点在Class,即改变类所在的NameSpace。而Rename NameSpace的焦点在NameSpace,即改变指定NameSpace的名字,并更新该NameSpace的所有引用(Usages)。 错误报告以及建议功能需要网络连接和Windows自带的SMTP服务。因为发送速度很快,所以不会占用您宝贵的时间。 可以使用User feedback功能提出您睿智的建议、批评、任何意见。 技术支持 -------- Tiger.BlueWorkshop@163.net 下载 ---- www.csdn.net 版本 发布日期 ----------------------------- 1.0.0(Beta) 2003/6/13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值