重复代码Duplicated Code---要重构的信号
什么时候需要重构,当你在项目代码里面嗅到这个味道的时候,就要进行重构。
首个介绍的味道是重复代码的味道。
它表现出来的特征是这些:
1.一个类里面,两个函数中,含有相同的代码,类似的代码;或者三个函数中,含有相同的代码,类似的代码。这是重复代码的味道。
2.两个互为兄弟的子类内含有相同的表达式。这也是重复代码的味道。
3.两个不相关的类,出现了重复代码。这也是重复代码的味道。
如何处理,如何重构
1.对于两个函数,出现重复代码,使用Extract Method方法。把某段代码组织到一个新的函数中,然后,将原来函数的某段代码替换为对新函数的调用。
Extract Method手法介绍
使用Extract Method手法处理原函数某段重复代码时,会面遇到如下几种情况:
a.该段代码没有局部变量。
对于a,直接将代码复制到一个新建的函数体中。
b.该段代码有局部变量。
如果,在段代码中,只是读取局部变量,并没有修改局部变量;或者,局部变量是个对象,这段代码只是调用该对象的某个方法。那么,只需要把这个局部变量当作新建函数的参数便可。
c.该段代码对局部变量再赋值。
被提炼代码段中,对源函数的某个局部变量进行了修改。
c1.并且,在被提炼代码段的后面,使用该修改后的局部变量。
这个处理手法是这样:
1.局部变量被修改后的结果作为新建函数的返回值。
2.源函数接收新建函数的返回值。
遵守的准则:一个函数,只有一个返回值。
------------------------------------------------------------------------------------------
2.两个互为兄弟的子类内含有相同的表达式。这也是重复代码的味道。
处理方式,首先使用Extract Method手法;然后,再对Extract Method手法处理后的结果使用Pull up Method,把提炼出来的代码推入超类。
Pull up Method(函数上移)手法介绍
1.如果,兄弟类中,出现了相同的函数体。那么,在超类中新建一个函数,存放函数体,在各个子类冲调用该新建函数。
2.如果,兄弟类中,出现了相同的函数体,但是,该函数体还使用了所在类的一个字段,可以把该字段也提升到超类。
3.如果,兄弟类中,出现了相同的函数体,并且该函数体,还调用了所在类的一个函数。那么,可以考虑,在超类中声明一个抽象函数,由子类实现。然后,在新建的函数体中,调用超类声明的抽象函数。
4.兄弟类,有时候,不是出现完全相同的函数体,但是,是相似,这些函数体可以通过某种形式的参数调整,最后将相似的多个函数体调整为一个可以使用某种参数表示新函数。
-------------------------------------------------------------------------------------------------------
3.Form Template Method
两段函数体,它们以相同的顺序执行类似的操作,区别只是每个具体操作是不同的。那么,这是执行顺序的相同,也可以列为重复代码。
---------------------------------------------------------------------------
重复代码Duplicated Code---要重构的信号的更多相关文章
- 代码的坏味道(14)——重复代码(Duplicate Code)
坏味道--重复代码(Duplicate Code) 重复代码堪称为代码坏味道之首.消除重复代码总是有利无害的. 特征 两个代码片段看上去几乎一样. 问题原因 重复代码通常发生在多个程序员同时在同一程序 ...
- 【重构】 代码的坏味道总结 Bad Smell (一) (重复代码 | 过长函数 | 过大的类 | 过长参数列 | 发散式变化 | 霰弹式修改)
膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...
- 重构 之 总结代码的坏味道 Bad Smell (一) 重复代码 过长函数 过大的类 过长参数列 发散式变化 霰弹式修改
膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...
- For循环重复代码的重构
DRY(don't repeat yourself),重复往往是代码腐烂的开始,我们一般的处理手法是将重复的代码提取成一个方法,然后用新方法替换掉原来的代码. 但是对于for循环里面的重复代码要如何处 ...
- IntelliJ IDEA “Finds duplicated code”提示如何关闭
发现重复的代码这个提示真的很烦啊,我们怎么关闭他呢. 设置在这里: Settings -> Editor -> Inspections -> General -> Duplic ...
- IntelliJ IDEA 自动导入包 关闭重复代码提示
idea可以自动优化导入包,但是有多个同名的类调用不同的包,必须自己手动Alt+Enter设置 设置idea导入包 勾选标注 1 选项,IntelliJ IDEA 将在我们书写代码的时候自动帮我们优化 ...
- IntelliJ IDEA 自动导入包 快捷方式 关闭重复代码提示
idea可以自动优化导入包,但是有多个同名的类调用不同的包,必须自己手动Alt+Enter设置 设置idea导入包 勾选标注 1 选项,IntelliJ IDEA 将在我们书写代码的时候自动帮我们优化 ...
- 关闭Found duplicated code
IDEA中的这个“发现重复代码 - Found duplicated code“的这个提示甚是烦躁. Settings —> Editor —> Inspections —> Gen ...
- Large Class--过大的类--要重构的信号
如果想利用单个类做太多事情,其内往往就会出现太多实例变量.一旦如此,Duplicated Code也就接踵而至. 解决方法: 1.将类内彼此相关的变量,将它们放在一起.使用Extrac ...
随机推荐
- java利用POI实现读取Word并获取指定样式的文本
import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.model.StyleDescription; import o ...
- 解决python中文编码错误问题
对于初学者而言,编码问题或许还没有没重视起来,但是编码问题是中文开发者必须面对的.今天来看下python开发中如何解决编码问题.注意:本篇讲的是最常见的一种编码问题,其他编码问题,如json函数引起的 ...
- Java 类和Static关键字
类的定义 类的命名.首字母大写 大括号后面没有分号 成员变量 Java会自动初始化成员变量但是不会自动初始化局部变量: 可以在定义成员变量是直接初始化,成员变量的作用范围在整个类体 对象的创建和引用的 ...
- 模拟Excel同一列相同值的单元格合并
背景 项目中有一个查询工作量,可以将查询的结果导出到Excel表中.在Excel工具中,有一个合并居中功能,可以将选中的单元格合并成一个大的单元格.现在需要在程序中直接实现查询结果的汇总, 问题分析 ...
- java中对象和对象的引用
1.何谓对象? 在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一 ...
- .从列表结束中删除第N个节点
描述 给定一个链表,从列表的最后删除倒数第n个元素 例如: 给定链表:1-> 2-> 3-> 4-> 5,并且n = 2. 删除倒数第二个,链表将变为1-> 2-> ...
- iOS AVAudioPlayer播放音频时声音太小
iOS AVAudioPlayer播放音频时声音太小 //引入AVFoundation类库,设置播放模式就可以了 do { try AVAudioSession.sharedInstance().ov ...
- Scrum 冲刺博客,项目总结
1.各个成员在 Alpha 阶段认领的任务 数据库环境的搭建,连接数据库:张陈东芳 数据库语句sql语句:张陈东芳 商品实体类的实现:吴敏烽 获取所有商品信息的实现:吴敏烽 根据商品编号获得商品资料: ...
- PAT-2018年冬季考试-乙级
1091 N-自守数 代码: #include <bits/stdc++.h> using namespace std; int T; int A(int a) { ; while(a) ...
- [TUTORIAL]How to setup SP_Flash_Tool_Linux (MTK/MediaTek Soc)
转自:https://forum.xda-developers.com/general/rooting-roms/tutorial-how-to-setup-spflashtoollinux-t316 ...