何时进行重构

重构可遵循三次法则:第一次做某件事时只管去做;第二次做类似的事会产生反感,但无论如何还是可以去做;第三次再做类似的事,你就应该重构,即 事不过三,三则重构。具体表现为:添加功能时重构、修补错误时重构、复审代码时重构。

对于现有代码根本无法正常运作、项目已近最后期限的场景不能进行重构,前者可以考虑拆分后重写,后者则是为了保证项目能正常上线。

具有哪些代码特征需要重构

2.1 Duplicated Code (重复代码)

如果你在一个以上的地点看到相同的程序结构,可以考虑设法将他们合而为一。

一般表现为:同一个类的两个函数含有相同的表达式;两个互为兄弟的子类内含有相同表达式;不同类中由于某种原因存在相同的或相似的表达式。

2.2 Long Method (过长函数)

如果一个函数超过了 50-80 行,你就可以考虑进行分解了。

一般从以下几点入手:分析临时变量和参数,考虑将注释部分封装到一个方法中,对于多个条件表达式和循环的部分进行封装。

2.3 Large Class (过大的类)

如果一个类有太多实例变量和函数,可以考虑将几个变量一起提炼到新类中,对于特征相似的函数可以考虑提炼到一个接口中,然后再针对不同接口分解这个类,拆分成多个实现类。

2.4 Long Parameter List (过长参数列)

如果函数的传参太多导致难以理解,且对于调用方造成了困扰,就应该考虑缩减了,最好函数的传参不要超过 10 个,如果太多可以考虑是否可以将传参封装到一个对象来进行传递。

2.5 Divergent Change (发散式变化) / Shotgun Surgery (霰弹式修改)

如果在修改程序某个功能时,需要修改多处地方,此时就应该考虑来重构它了,使该修改尽可能的集中在一个地方,便于后期维护。

2.6 Feature Envy (依恋情结)

如果某个类的函数为了计算某个值或其他行为需要从另一个对象那儿调用许多取值函数,此时就需要判断哪个类拥有最多被此函数使用的数据,然后就把这个函数和那些数据摆在一起。

最根本的原则:将总是一起变化的东西放在一起,数据和引用这些数据的行为总是一起变化的,如果出现例外,我们就搬移那些行为,保持变化只在一地发生。

2.7 Data Clumps (数据泥团)

如果两个类中相同的字段、许多函数签名中相同的参数出现三四项,此时就需要将这些字段/参数删除缩短,减少字段和参数的个数,提炼到一个独立对象中。

2.8 Primitive Obsession (基本类型偏执)

所谓的基本类型偏执就是:对于对象和基本类型的取舍,如果多个基本类型字段总被放在一起使用的话,那么可以考虑将其定义为一个对象来进行使用了。

2.9 Switch Statement ( switch 惊悚现身)

少用 switch (或 case )语句,因为会出现许多重复,每当看到 switch 语句,如果条件语句很复杂,你就应该考虑使用多态来替换它。

2.10 Parallel Inheritance Hierarchies (平行继承体系)

如果你发现某个继承体系的类名称前缀和另一个集成体系的类名称前缀完全相同,即如果你为某个类增加一个子类,必须也为另一个类相应的增加一个子类,此时应该考虑重构了。消除这种重复性的一般策略是:让一个继承体系的实例引用另一个继承体系的实例。

2.11 Lazy Class (冗赘类) / Speculative Generality (夸夸其谈未来性)

如果一个类的所得不值其身价,它就应该消失。

如果一个类本应该做某事却试图以各式各样的钩子和特殊情况来处理一些非必要的事情,那么就应该考虑移除它;比如抽象类没有太多作用的话就除掉,如果函数的参数未用到就应该去掉,如果函数或类的唯一用户是测试用例,就应该去掉等。

2.12 Temporary Filed (令人迷惑的暂时字段)

如果某个实例变量仅为某种特定场景而定或者一个类中有个复杂算法,需要好几个变量,但是这些字段只在该算法时才有效,其他情况下只会让人迷惑,此时应该考虑将这些变量和其相关函数提炼到一个独立类中,提炼后的新对象将是一个函数对象。

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

如果一个对象请求另一个对象,然后再向后者请求另一个对象,然后在请求另一个对象,这就是消息链。通常最好的选择是:先观察消息链最终得到的对象是用来干什么的,看看能够把使用该对象的代码提炼到一个独立函数中,把这个函数推入到消息链。

java什么是重构 何时使用重构_Java 之重构现有系统实战(一)相关推荐

  1. java电商网站建设教程_java开发电商系统实战开发视频教程

    JAVA 当前位置:主页 > 编程教程 > JAVA > java开发电商系统实战开发视频教程 java开发电商系统实战开发视频教程 教程大小:4GB   发布时间:2018-07- ...

  2. 重构 java代码_java代码重构的方法学习

    2,8阅读 第一章  第一个案例 在此案例中使用了, 方法的提取(extract method),方法的移动(move method),临时变量的清除,变量及函数名重构,switch类型重构(repl ...

  3. 重构改善既有代码设计--重构手法11:Move Field (搬移字段)

    你的程序中,某个字段被其所驻类之外的另一个类更多的用到.在目标类建立一个新字段,修改源字段的所有用户,令它们改用新字段.        动机:在类之间移动状态和行为,是重构过程中必不可少的措施.随着系 ...

  4. python小波分解与重构_小波分解和重构

    小波变换能够很好地表征一大类以低频信息为主要成分的信号, 小波包变换可以对高频部分提供更精细的分解 详见(http://www.cnblogs.com/welen/articles/5667217.h ...

  5. 重构是什么、为什么要重构

    洪流学堂,让你快人几步. 本篇内容来自洪流读书会精选内容. 昨天我们解读了重构这个词怎么来的?今天我们来聊聊重构是什么.为什么要重构? 重构是什么.为什么要重构 我们先来举个例子. 现在,设想有一个戏 ...

  6. fpga加载程序慢_可重构计算:基于FPGA可重构计算的理论与实践 1.器件架构 译文(一)...

    注:原文版权归作者所有,本翻译仅为爱好所作,与任职单位无关. 第一部分 引言:可重构计算硬件 PART1 Reconfigurable Computing Hardware 根本上来说,可重构计算可以 ...

  7. 【教程+源码】Java开发经典游戏飞翔的小鸟_Java游戏项目Flappy Bird像素鸟游戏

    在飞翔的小鸟游戏中,玩家只需通过点击方向键操纵让小鸟避开绿色管道等障碍物即可继续前进.如果小鸟碰到管道,游戏立即结束. 那么如何用Java编写一款属于自己的飞翔的小鸟游戏呢?其过程并不复杂,本课程详细 ...

  8. 【源码+图片素材】Java开发经典游戏飞翔的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java小游戏_Java初级项目_Java课程设计项目

    开发环境: jdk1.8 开发工具: IDEA JavaEE基础: 变量.数据类型.判断语句.循环结构.数组.集合.简单窗口创建.图形图片绘制.双缓存技术.事件-键盘事件.物体的碰撞检测.File [ ...

  9. java设计前期工作基础和存在的困难_Java秒杀系统实战系列-基于Redisson的分布式锁优化秒杀逻辑...

    本文是"Java秒杀系统实战系列文章"的第十五篇,本文我们将借助综合中间件Redisson优化"秒杀系统中秒杀的核心业务逻辑",解决Redis的原子操作在优化秒 ...

最新文章

  1. BeanShell中this类型引用的特殊成员
  2. Spring MVC基础知识整理➣国际化和异常处理
  3. Python 封装MySQL类
  4. 总结 | 计算机视觉领域最常见几中损失函数
  5. python 示例_带有示例的Python字典popitem()方法
  6. 数据科学家编程能力需要多好_我们不需要这么多的数据科学家
  7. eve可以在linux运行吗,ubuntu下为eve游戏搭载 wine环境
  8. mysql连接超时timeout问题
  9. mysql的入门基础操作
  10. (转)Membership、MembershipUser和Roles类 详解
  11. 安装配置管理 之 安装和配置 JPackage Java
  12. 集成融云没有ipc进程的天坑
  13. CDH6.2配置spark.yarn.jars目录
  14. Vue教程路由以及axios的使用
  15. 第二周Java学习总结
  16. DELL R510服务器RAID配置,Dell服务器硬RAID配置
  17. uni-app——storage的使用(Storage、StorageSync)
  18. 2017年阳光私募基金一季度报告
  19. rpt层建设实战,本地视频+md,review第1遍,220626,
  20. 7.1.5 智慧物流【车辆监控Structured Streaming、整合kafka、Redis、Mysql、HBASE 写入数据】

热门文章

  1. redis布隆过滤器PHP,Redis 中的布隆过滤器
  2. python 垃圾回收哪时候执行_Python 中的垃圾回收机制是如何工作的?
  3. ajax读取评论数据,评论提交使用ajax提交实现
  4. 试论软件工程学科的交叉性_海外大学所有学科梳理(超大工程,建议收藏)-大学下的硕士一二级学科...
  5. 数据字典怎么写_求职数据分析,项目经验该怎么写
  6. linuc和python常用命令是一样的么_Linux常用命令大全(非常全!!!)(2)|简明python教程|python入门|python教程...
  7. iOS库--.a与.framework
  8. Android Github 资源目录
  9. XenApp_XenDesktop_7.6实战篇之十六:安装Virtual Delivery Agent For Windows Server OS
  10. grub引导iso光盘[可用于ntfs]