1.重构

1.1 为什么要重构

1.1.1 改进程序设计

程序员为了快速完成任务,在没有完全理解整体架构之前就开始写代码,
导致程序逐渐失去自己的结构。重构则帮助重新组织代码,重新清晰的体现
程序结构和进一步改进设计。

1.1.2 提高程序可读性

容易理解的代码很容易维护和增加新功能。代码首先是写给人看的,
然后才是计算机看的。
  重构是一个Code Review 和反馈的过程。在另一个时段重新审视代码,
会容易发现问题和加深对代码的理解。

1.2 利用重构技术开发软件时会把时间分配给两种行为:

1.2.1 重 构

重构时你就不能再添加功能,只管改进程序结构。

1.2.2 添加新功能

添加新功能时,不应该修改既有代码,只管添加新功能。

1.3 何时重构

1.3.1 增加新功能时一重构

增加功能前需要理解修改的代码,如果发现代码不易理解且无法轻松增加功能,
此时就需要对代码进行重构。

1.3.2 修补错误时一重构

通过重构改善代码结构,能够帮助你找出BUG原因。

1.3.3 Review 代码时一重构

有经验的开发人员Review代码时能够提出一些代码重构的建议。

1.4 何时不该重构

1.4.1 代码实在太混乱,重构还不如重写

1.4.2 项目即将结束时避免重构


2.代码的坏味道

2.1 重复的代码(Duplicated Code)

重构方法:
2.1.1 重复代码在同一个类中的不同方法中,则直接提炼为一个方法。
2.1.2 如果重复代码在两个互为兄弟的子类中,则将重复的代码提到父类中。
2.1.3 如果代码类似,则将相同部分构成单独函数,或者用 Template Method 设计模式。

2.1.4 重复代码出现在不相干的类中,则将代码提
炼成函数或者放在独立的类中

2.2 过长的函数(Long Method)

是面向结构程序开发带来的 “后遗症”,过长的函数降低可读性。
重构方法:
  将独立的功能提炼成新函数。

2.3 过大类(Large Class)

过大的类使得责任不清晰。
重构方法:
  将过大的类的功能拆分成多个功能单一的小类。

2.4 过长的参数列表(Long Parameter List)

过长的参数列难以理解,而且容易传错参数。
重构方法:
  将参数列表用参数对象替换。

***2.5 发散式变化(Divergent Change)

一个类由于不同的原因而被修改
重构方法:
  将类拆分成多个,每个类只因为一种变化而修改。  
eg:一个包含有多个业务逻辑的代码,尽量拆分成多个功能相对独立的小类

***2.6 霰弹式修改(Shotgun Surgery)

与发散式变化相反,遇到变化时需要修改许多不同的类。
重构方法:
  将类似的功能放到一个类中

2.7 依恋情结(Feature Envy)

函数对某个类的兴趣高过对自己所处的类,通常是为了取其他类中的数据。(类中方法的界限)
重构方法:
  将相关的功能移动到它感兴趣的类中。

2.8 数据泥团(Data Clumps)

在多个地方看到相同的数据项。
eg:多个类中相同的变量,多个函数中相同的参数列表,并且这些数据总是一起出现。
重构方法:
  将这些数据项,独立到类中。

2.9 分支语句(Swtich Statements)

大量的分支,条件语句导致过长的函数,最后导致代码可读性差。
重构方法:
  将分支变成子类,或者使用State 和 Strategy模式。

2.10 过度耦合的消息链(Message Chains)

一个对象请求另一个对象,后者又请求另外的对象,然后继续。。。。,形成耦合的消息链。
重构方法:
  公布委托对象供调用。

2.11 过多的注释(Comments)

代码有着长长的注释,但注释之所以多是因为代码很糟糕
重构方法:
  写上必要的注释,尽量让代码不用注释就比较易读。

3.重构实战(TODO)

参考:
重构:改善既有代码的设计

代码重构 & 代码中的坏味道的更多相关文章

  1. 在PHP中避免一些代码中的坏味道

    做PHP开发已经有快一年的时间了,在这一年的时间中,学习了很多生产环境中的技巧,学习了很多东西,期间也阅读了一些优秀的源码和关于代码的书,对写代码这一块有了一定的思考,也看过很多别人写的好的代码和坏的 ...

  2. 避免 Java 代码中的“坏味道”

    1.需要 Map 的主键和取值时,应该迭代 entrySet() 当循环中只需要 Map 的主键时,迭代 keySet() 是正确的.但是,当需要主键和取值时,迭代 entrySet() 才是更高效的 ...

  3. 解析大型.NET ERP系统 代码的坏味道

    1  对用户输入做过多的约定和假设 配置文件App.config中有一个设定报表路径的配置节: <add key="ReportPath" value="C:\Us ...

  4. 消灭 Java 代码的“坏味道”

    消灭 Java 代码的“坏味道” 原创: 王超 阿里巴巴中间件 昨天 导读 明代王阳明先生在<传习录>谈为学之道时说: 私欲日生,如地上尘,一日不扫,便又有一层.着实用功,便见道无终穷,愈 ...

  5. .NET - 代码重构技巧

    通过面向对象三大特性:封装.继承.多态的学习,可以说我们已经掌握了面向对象的核心.接下来的学习就是如何让我们的代码更优雅.更高效.更易读.更易维护.当然了,这也是从一个普通程序员到一个高级程序员的必由 ...

  6. 【重构】 代码的坏味道总结 Bad Smell (一) (重复代码 | 过长函数 | 过大的类 | 过长参数列 | 发散式变化 | 霰弹式修改)

    膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...

  7. 单元测试系列之四:Sonar平台中项目主要指标以及代码坏味道详解

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6766994.html 众所周知Sona ...

  8. 重构 之 总结代码的坏味道 Bad Smell (一) 重复代码 过长函数 过大的类 过长参数列 发散式变化 霰弹式修改

    膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...

  9. 吐槽一下项目中的代码坏味道:滥用java常量

    我们的项目中是否充斥着类似以下的代码呢?定义一个专门存放常量的java类(接口),非常多其它类依赖该常量类. public interface IConstant { int ZERO = 0; St ...

随机推荐

  1. (1)前言——(10)jquery项目的历史(History of the jQuery project)

    This book covers the functionality and syntax of jQuery 1.6.x, the latest version at the time of wri ...

  2. The Dole Queue

    The Dole Queue Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit cid ...

  3. 进阶:案例六: Context Menu(静态 与 动态)

    实现: 1.add: 2.delete 3.add2 实现步骤: 1.新建属性display_text 2.创建layout 3.代码部分: add事件: METHOD onactionadd . D ...

  4. MFC自绘控件学习总结第二贴

    首先感谢大家对第一帖的支持,应一些网友烈要求下面我在关于上一贴的一些补充和说明(老鸟可以无视)这一贴是实战+理论不知道第一帖的先看第一帖:http://topic.csdn.net/u/2011071 ...

  5. Mono for Android 初学遇到的问题

    1.搭建开发环境: 在win7系统中,VS2012 可以用 C# 开发Android 应用程序,mono for andriod 破解成功. 在win server 2008 系统中 破解不成功,具体 ...

  6. HTML5 实现拖拽

    如图 可以从第一个方框拖拽花色到第二个方框中. 也可以再拖动回来. 具体代码实现 index.html <!DOCTYPE HTML> <html> <head> ...

  7. CImageList用法介绍

    图像列表控制(CImageList)是相同大小图像的一个集合,每个集合中均以0为图像的索引序号基数,图像列表通常由大图标或位图构成,其中包含透明位图模式.可以利用WINDOWS32位应用程序接口函数A ...

  8. 积累的VC编程小技巧之工具提示

    1.用鼠标移动基于对话框的无标题栏程序的简单方法 void CVCTestDlg::OnLButtonDown(UINT nFlags, CPoint point) {    //一句话解决问题    ...

  9. 基于raw os 的事件触发系统

    Raw os的事件触发系统有以下特点: 1 基于UML的状态机理念设计,实现了有限状态机(fsm)以及层次状态机(HSM). 2 实现了活动对象(ACTIVE OBJECT)的特性,一个活动对象包含了 ...

  10. kiss框架学习

    #parse("$!jc.skinpath/exam/cart.ascx") var CategoryId = "$!this.loadCategory_combo(). ...