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. try catch finally的执行顺序到底是怎样的?

    首先执行try,如果有异常执行catch,无论如何都会执行finally 一个函数中肯定会执行finally中的部分. 关于一个函数的执行过程是,当有return以后,函数就会把这个数据存储在某个位置 ...

  2. 10个优秀的 HTML5 &amp; CSS3 下拉菜单制作教程

    下拉菜单是一个非经常见的效果.在站点设计中被广泛使用.通过使用下拉菜单.设计者不仅能够在站点设计中营造出色的视觉吸引力,但也能够为站点提供了一个有效的导航方案.使用 HTML5 和 CSS3 能够更e ...

  3. GoldentGate Oracle to Oracle 初始化具体解释

    一.安装GoldenGate[源端,目标端] 1.创建ogg文件夹 [root@source ~]# mkdir /DBSoft/ogg [root@source ~]# cd /DBSoft/ogg ...

  4. Java 7如何操纵文件属性

    Java 7如何操纵文件属性 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 准备写点基础性的文章,Java 7已经出来很长一段时间了,但是很多Java程 ...

  5. cpu性能探究 :cache line 原理

     參考: 一个解说Direct Mapped Cache很深入浅出的文章: http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Memory/dir ...

  6. Android学习笔记(十三)——碎片(一)

    碎片 碎片可看作第二种形式的活动,能够创建碎片来包括视图. 碎片总是嵌入在活动中,一般有两种常见形式: 1.碎片A和碎片B分别处于不同的活动中,当选择碎片A中的某一项时,触发碎片B启动: 2.碎片A和 ...

  7. ALV编辑行内容有改变时候操作

    ALV编辑行内容时,调用方法 check_changed_data返回变量 gf_valid = 'X'的话说明alv行有变化. 以下拿alv维护表程序部分代码做例: DATA: gr_alvgrid ...

  8. 在屏幕上建立ALV

    在屏幕上创建两个文本元素空件.一个推出按钮控件.一个定制控制按钮 代码所示: *&------------------------------------------------------- ...

  9. VC/MFC 工具栏上动态添加组合框等控件的方法

    引言 工具条作为大多数标准的Windows应用程序的一个重要组成部分,使其成为促进人机界面友好的一个重要工具.通过工具条极大方便了用户对程序的操作,但是在由Microsoft Visual C++开发 ...

  10. jsp:include怎么设置才能正确显示包含的页面呢

    1.项目的所有jsp都放在WEB-INF文件夹之下,使用的是SpirngMVC进行了过滤,jsp:include只能引入WEB-INF外部的jsp文件,对于改变后缀显示为htm的jsp的WEB-INF ...