步步为营 .NET 代码重构学习笔记系列

步步为营 .NET 代码重构学习笔记 一、为何要代码重构

步步为营 .NET 代码重构学习笔记 二、提炼方法(Extract Method)

步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method)

步步为营 .NET 代码重构学习笔记 四、临时变量(Temporary Variable)

步步为营 .NET 代码重构学习笔记 五、分解函数和替换算法(Replace Method And Substitute Algorithm)

步步为营 .NET 代码重构学习笔记 六、移动函数和移动值域(Move Method And Move Field)

步步为营 .NET 代码重构学习笔记 七

步步为营 .NET 代码重构学习笔记 八

步步为营 .NET 代码重构学习笔记 九

一、Replace Type Code with Subclasses (以子类取代型别码)

动机(Motivation)

以一个subclass取代这个type code,如果面对的type code不会影响宿主类的行为,可以使用Replace Type Code with Class 来处理它们。但如果type code 会影响宿主类的行为,那么最好的办法就是借助多态(polymorphism)业处理 变化行为。

示例

    public class Employee{private int _type;public static int ENGINEER = 0;public static int SALEMAN = 1;public static int MANAGER = 2;public Employee(int type){_type = type;}}

改为

    public class Employee{private int _type;public static int ENGINEER = 0;public static int SALEMAN = 1;public static int MANAGER = 2;public Employee(int type){_type = type;}public int Type{get { return _type; }set { _type = value; }}}public class ENGINEER : Employee{public int GetType(){return Employee.ENGINEER;}}public class SALEMAN : Employee{public int GetType(){return Employee.SALEMAN;}}public class MANAGER : Employee{public int GetType(){return Employee.MANAGER;}}public class Factory:Employee{public Employee Create(int type){switch (type){case ENGINEER:return new ENGINEER();case SALEMAN:return new SALEMAN();case MANAGER:return new MANAGER();default:throw new ExecutionEngineException("Incorrect type code value");}}}

二、Replace Type Code with State/Strategy(以State/Strategy取代型别码)

动机(Motivation)

以State object(专门用来描述状态的对象)取代type code。

示例

    public class Employee{private int _type;public static int ENGINEER = 0;public static int SALEMAN = 1;public static int MANAGER = 2;public Employee(int type){_type = type;}public int Type{get { return _type; }set { _type = value; }}public int PayAmount(){switch (_type){case ENGINEER:return 100;case SALEMAN:return 1000;case MANAGER:return 10000;default:throw new ExecutionEngineException("Incorrect type code value");}}}

改为

    public class Employee{private int _type;public static int ENGINEER = 0;public static int SALEMAN = 1;public static int MANAGER = 2;public Employee(int type){_type = type;}public int Type{get { return _type; }set { _type = value; }}public int PayAmount(){EmployeeType employeeType;switch (_type){case ENGINEER:employeeType= new ENGINEER();break;case SALEMAN:employeeType=new SALEMAN();break;case MANAGER:employeeType = new MANAGER();break;default:throw new ExecutionEngineException("Incorrect type code value");}return employeeType.GetType();}}public class ENGINEER : EmployeeType{public override  int GetType(){return 100;}}public class SALEMAN : EmployeeType{public override int GetType(){return 1000;}}public class MANAGER : EmployeeType{public override int GetType(){return 10000;}}public abstract class EmployeeType{public abstract int GetType();}

三、Replace Subclass with Fields(以值域取代子类)

动机(Motivation)

修改这些函数,使它们返回superclass中的某个(新增值域,然后销毁subclasses)

示例

    public abstract class Person{public  abstract bool IsMale();public  abstract string GetCode();public Person CreateMale(){return new  Male();}public Person CreateFemale(){return new Female();}}public class Male : Person{public override bool IsMale(){return true;}public override string GetCode(){return "M";}}public class Female : Person{public override bool IsMale(){return false;}public override string GetCode(){return "F";}}

改为

    public class Person{private bool _IsMale;private string _Code;public bool IsMale{get { return _IsMale; }set { _IsMale = value; }}public string Code{get { return _Code; }set { _Code = value; }}public Person(bool isMale, string code){this._IsMale = isMale;this._Code = code;}}public class Male : Person{public Male(): base(true, "M"){ }}public class Female : Person{public Female(): base(false, "F"){ }}

四、Decompose Conditional(分解条件式)

动机(Motivation)

从if、then、else三个段落中分别提炼出独立函数。

示例

if(date<SUMMER_START||date>SUMMER_BND)charge=quantity*_winterRate+_winterServiceCharge;
elsecharge=quantity*_summerRate;

改为

if(notSummer(date))charge=winterCharge(quantity);
elsecharge=summerCharge(quantity);

五、Consolidate Conditional Expression(合并条件式)

动机(Motivation)

将很多条件合并成一个条件式,并将这个条件式提炼成为一个独立函数。

示例

        public double DisabilityAmount(){if (_seniority < 2) return 0;if (_monthsDisabled > 12) return 0;if (_isPartTime) return 0;return 1;}

改为

        public double DisabilityAmount(){if (IsNotBligableForDisability()) return 0;return 1;}

六、Consolidate Duplicate Conditional Fragments(合并重复的条件片段)

动机(Motivation)

将重复代码搬移到条件式之外。

示例

            if (isSpecialDeal()){total = price * 0.95;sendMail();}else{total = price * 0.98;sendMail();}

改为

            if (isSpecialDeal())total = price * 0.95;elsetotal = price * 0.98;sendMail();

步步为营 .NET 代码重构学习笔记 十相关推荐

  1. 步步为营 .NET 代码重构学习笔记 十一

    步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一.为何要代码重构 步步为营 .NET 代码重构学习笔记 二.提炼方法(Extract Method) 步步为营 .NE ...

  2. 步步为营 .NET 代码重构学习笔记 九

    步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一.为何要代码重构 步步为营 .NET 代码重构学习笔记 二.提炼方法(Extract Method) 步步为营 .NE ...

  3. 步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method)

    一.Inline  Method 概述 一个函数,其本体(method body)应该与其名称(method name)同样清楚易懂. 动机(Motivation) 以简短的函数表现动作意图,这样会使 ...

  4. 步步为营 .NET 代码重构学习笔记 二、提炼方法(Extract Method)

    动机(Motivation) Extract Method是我们最常用的重构手法之一.当我们看见一个过长的函数或一段需要注释才能让人理解用途的代码,我们就会将这段代码放进一个独立函数中. 有数个原因造 ...

  5. 步步为营 .NET 代码重构学习笔记 七

    一.Extract Class(提炼类) 动机(Motivation) 一个class应该是一个清楚的抽象(abstract),处理一些明确的责任.但在实际工作中,class会不断成长扩展.这个cla ...

  6. 31 天重构学习笔记索引

    由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接过去的 ...

  7. 31天重构学习笔记下载

    前言 前两天写了一篇程序猿也爱学英语(上),有图有真相的文章,写作那篇文章只是自己一时兴起,或者说是自己的兴趣使然.文中的观点只是自己的学习心得和体会,属一家之言且鉴于本人不是学英语出身,所以也肯定有 ...

  8. 吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进

    吴恩达<机器学习>学习笔记十四--应用机器学习的建议实现一个机器学习模型的改进 一.任务介绍 二.代码实现 1.准备数据 2.代价函数 3.梯度计算 4.带有正则化的代价函数和梯度计算 5 ...

  9. 吴恩达《机器学习》学习笔记十——神经网络相关(2)

    吴恩达<机器学习>学习笔记十--神经网络相关(2) 一. 代价函数 二. 反向传播算法 三. 理解反向传播算法 四. 梯度检测 五. 随机初始化 1.全部初始化为0的问题 2.随机初始化的 ...

最新文章

  1. operator conv_transpose1‘s input 1 is not linked
  2. Python学习笔记:‘’AttributeError: NoneType object has no attribute‘’
  3. 深入理解java虚拟机 (二) 第二版
  4. 【发布】JEECG-P3 新主题后台风格(H5扁平化)
  5. 文件从一台服务器拷贝到另一台服务器
  6. Spring+SpringMVC+maven使用@aspectJ添加切面
  7. 2017-09-20 前端日报
  8. 编程语言python入门-手把手教你从零开始用Python语言写爬虫程序
  9. CString char BSTR 转换
  10. Linux服务器端口access改为trunk all
  11. 格式工厂DIVX、AVC、HEVC三个格式那个最清晰
  12. PyTorch中view的用法
  13. Illegal string offset错误
  14. AI软件编辑文字时出现“滚滚长江东逝水”解决方法
  15. 趣味小游戏——扫雷(优化版)
  16. 武汉体育学院计算机设计大赛,2017年(第10届)中国大学生计算机设计大赛中南地区赛作品评审结果公告.PDF...
  17. 推荐一款过滤百度广告的神器
  18. vue使用外部字体文件
  19. 科研写作——常见句式(六)
  20. android 抽屉组件,Android 抽屉控件 VerticalDrawerLayout

热门文章

  1. java中集合类的转换_JAVA-常用集合类型转换例子(基础必备)
  2. java jdbc封装_JDBC封装-Java(新手)
  3. mysql转移数增删改查_MySql CURD操作(数据的增删改查)
  4. 虚方法(virsual method)
  5. java string类型的初始化
  6. [Asp.net 5] DependencyInjection项目代码分析-目录
  7. [NOIP2002]矩形覆盖
  8. 思科cisco路由器动态路由协议配置方法
  9. transferto遇到的问题java.io.FileNotFoundException: C:\Users\Administrator\AppData\Local\Temp
  10. 11. 旋转数组的最小数字