代码重构 & 代码中的坏味道

摘要:
在另一个时段重新审视代码,会容易发现问题和加深对代码的理解。
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)


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

免责声明:文章转载自《代码重构 & 代码中的坏味道》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇京东千亿订单背后的纵深安全防御体系java正则表达式——Greedy、Reluctant和Possessive下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【重构】Bilibili UWP 客户端下载视频文件重命名 2.0

代码已上传Github:https://github.com/zsy0216/BatchModifyBilibiliName 较 master 分支的改变: - 优化了重命名的代码,覆盖更全面,更准确; - 重命名过程中删除多余文件,文件更简洁; - 重构为 maven 更有利于二次开发; - 使用 NIO 操作文件,功能更强大,效率更高; 示例 1. 下...

重构的技巧

原文:http://www.cocoachina.com/industry/20140816/9397.html 我想一条童子军的军规:“始终保持露营地比你发现它的时候还要干净”。如果你在地上发现了一点脏东西,不管是谁弄的,都清理掉它。要为了下一拨来露营的人改善环境。(实际上,那条规矩的早期版本,出自Robert Stephenson Smyth Bden...

VS2010 报表教程--玩转机房重构

机房重构的时候再遇报表,和第一次做的时候不同点是用的VS 中自带的报表,而且用VS中自带的报表控件不仅简单操作,而且方便。只需要三个步骤就可以将它搞定。 1、添加数据集 2、添加表 3、添加报表的控件 Why? 添加数据集的目的是为了和SqlServer连接,要想使用数据库中的表,就要将和数据库进行连接,使用SQL语句选择相应的表。 添加表的目的是为了...

网页重构面试笔试题

1.什么是网站重构?div+css的布局较table布局有什么优点?2.如何理解css盒模型?3.平时做网页经常使用哪些hack?4.如何理解表现与内容相分离?5.如何解决ie6的双边距问题?6.如何定义高度为1px的容器?{heigh:1px; 10px; background:#000; overflow:hidden}ie6下这个问题是默认行高造成的,...

互联网开发模式的经验之谈

版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/238 来源:腾云阁 https://www.qcloud.com/community 作者介绍:韩伟,1999年大学实习期加入初创期的网易,成为第30号员工,8年间从程序员开始,历任项目经理、产品总监。2007年...

数据库重构《Refactoring DataBase Evolutionary DataBase Design》介绍

说实话我也是前两周才知道有数据库重构这回事,当时听说这个概念的时候,唯一的反应就是:数据库居然也能重构?刚好上周去图书馆借书,看见了《数据库重构》这本书,就借回来看了几章。下面会结合自己的体会介绍一些这本书的一些观点。 数据库重构概念 数据库重构是对数据库Schema进行的简单改动,在保持行为和信息语义的前提下改进设计。 数据库重构可以重构数据库Schem...