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后无法表达多态的情况。
目的:去掉非必要的间接性。或者用于重组的一组组织不合理的函数的前提。
目标:去掉不必要的函数或者过多的委托。

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

时间: 2024-11-10 01:25:32

C#重构学习的相关文章

【重构学习笔记】

重构的定义:重构是对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本 从定义里我们可以看出,重构是对代码和架构的一种修改,旨在提高代码的效率和可读性,来达到降低修改成本的目的.而重构对于用户体验来说,就像定义中说到的,只能对可观察行为作出很小的变化,甚至不造成变化. 关于同事些代码经常会把DAO注入到表现层Controller里面使用,我一直很反感这样的做法,奈何找不出可以反驳这些老员工的理由,确实才疏学浅了. 认真想想 例如,一般情况,我们会在Ser

重构学习-重构原则

什么是重构: 视上下文重构有两个不同的定义,第一个定义是名词形式 对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本 重构的另一人用法是动词形式 使用一系列的重构手法,在不改变软件可观察行为的前提下调整其结构. 有人说重构就是整理代码 ,从某种角度上来说,是,但是重构不止于此,因为它提供了一种更为高效且受控的代码整理 技术,运用代码重构技术后你会发现对代码的整理会比以前更加高效. 重构的目的是使软件更容易被理解和侯.你可以在软件的内部做很多修改,但必须

C#重构学习2

转帖重构学习 重构?代码坏味道?看到这两个疑问,也许就知道本期的话题是关于“重构”的,重构无处不在,重构可大可小,重构随时随地.让重构时刻记在脑海,使自己的代码变的优美.就让这本“重构艺术”手册带你走进重构的世界,亲密接触重构,如欣赏艺术般,体会重构的魅力. 文章下载地址:http://files.cnblogs.com/xia520pi/C_Sharp_Refactoring.rar 文章的目录: 1.代码重构 1.1.版权声明 1.2.内容详情 2.项目重构方案设计 2.1.版权声明 2.2

【重构学习】03 重构与测试

新的一年了,我却在这里写这个鬼 <重构>的这一章主要是讲java的一个测试框架,我直接就跳着看了 只是简单的看了一下它的思想 重构需要一个良好的测试体系,而我们需要为重构构建一个这样的体系,这是重构的前提 不需要期待完美测试,需要的是不完美的测试已经在实际执行了 测试的时候考虑可能出错的边界条件,并集中火力 不要因为测试无法捕捉所有BUG就不写测试,至少它可以捕捉大多数 花合理的时间抓出大多数BUG 写测试代码去让其执行自动化测试 好了这就是本章主要的内容 不太多,就来简单谈一下自己对测试的理

【重构学习】序

话说写代码的时候越来越认识到了重构的重要性. 作为一个有良知的程序员,我觉得我们确实有必要写出让人明白的代码,而不是仅仅让计算机明白. 更加重要的是我意识到重构能让我在六点钟直接下班走人,而不是持续在Dirty Code里挣扎. 所以我决定去学习重构来提升我的技能. 然而意识到我并不是一个有毅力的人,所以我决定开博客,每天强制写东西来推动学习.

【重构学习】12 重构学习感想

其实也没什么想继续说重构了,你我都清楚这仅仅只是一个开始,进一步的就是靠个人去不断积累重构经验了. 我们学到的依然只是套路,玩熟的话还远着呢. 不仅仅是何处重构,如何重构的问题,更需要对重构的时间进行掌控,并且迫切需要实施重构的勇气. 好吧,自学完了<重构>. 用时18天. 从来没有如此兴奋过,这一切好像都只是开始. 我的学习兴趣被激发起来了吗,是的. 它没有在我高中时候来到,也没有在我大学时候来到,如今才开始,所幸不晚.

【重构学习】05 函数的重构

<重构>这本书的代码都是java,我准备用C#来一遍. 而今天我的主要任务是写一大段垃圾代码出来,然后重构(仅限于函数的,不涉及到其它方面的重构). 程序界面: 功能介绍: 侠客名字自己取,然后点击按钮随机角色的属性, 根骨,经脉,柔韧,悟性等四项属性值都是随机而来. 其他的都是由这四个属性计算而来: 根骨:影响气血,基础外攻和基础内攻 经脉:影响内力和基础内攻 柔韧:影响身法和基础闪避 按钮功能的垃圾代码如下: /// <summary> /// 产生侠客 /// </su

【重构学习】 04 重构与设计模式

好吧,<重构>这本书的第五章,主要是对即将要写到的一些具体重构手法的写作结构的一种描述,并没有什么重要的东西. 仿佛是为了庆祝元旦的放假,特意给我准备的章节,为了让我完成今天的任务而特意水了一章. 好吧,还是有一句重要的话:设计模式为重构提供了目标,而重构是到达之路. 以下是我的废话,大神莫笑: 如果你不明白设计模式是什么?不要紧,就算你不明白也不要紧. 因为很多人学了设计模式都会忘掉,有的时候是因为他们不用,所以忘了.有的时候是因为用的多了,所以忘了. 如果是后者那就是无招胜有招的境界,如果

【重构学习】11 大型重构

好了,前面所有的都是很简单的例子,现在开始的是大型重构. 对于大型重构来说,情况复杂多变,耗时也会很长,前面的简单重构大多是在一个小时内可以完成,但是对于大型重构来说可能需要几个月,甚至数年.如果是一个运行中的系统,重构起来只能每天一点点去慢慢重构. (恕我直言,在国内恐怕这样的公司也很少.所以我们要自己养成随时重构的习惯,不要挖坑给自己埋最好.没谁能给你这么长时间重构,特别当你是个低端程序员的时候.你得相信,你所有偷懒的举动,都会给你以后的工作带来麻烦.除非你明天走人了,那么你的锅可能就给我背