重构

重构

参数过长

影响:

方法不易被理解、使用,方法签名容易不稳定,不易维护

解决方法:反复使用提炼方法+内联方法,消除多余参数

​ 尽量把方法移进相关的类中

​ 如实体类中的get方法在其他类中没有被调用可以删除

​ 实际工作中,可以结合参数数量、以及自身对业务的理解,在 最小知道 和 保持对象完整性 之间进行权衡

全局变量

影响:可以在任何位置进行修改,在使用过程中可能出现意想不到的值,并且没有任何机制可以探测出哪段代码进行了修改,导致定位困难

改进目标:

降低代码耦合性,保持代码清晰,维护简单,降低由于对全局数据随意的改变引发bug的风险

方法:封装变量,提炼函数

使用Convert To Instance Method替换项目中使用静态方法的地方,进行重构

如果想避免其他类中引用本类的字段,修饰符改为private

可变数据

影响:

影响可维护性,在一处修改数据,却在另一处造成难以发现的破坏
改进目标:

应用”数据不可变”:不可变性是强大的代码防腐剂
方法:
封装变量、拆分变量、提炼函数、移除设值,函数、查询取代派生、Builder模式创建不可变对象、引用对象改为值对象、函数式编程等

发散式变化

定义:
某个模块经常因为不同的原因在不同的方向上发生变化
影响:
通常,发散式变化是由于多个变化方向之间有较多的来回调用或者函数内部混合了多类处理逻辑。当处于多个不同上下文的外部行为发生变化时候,都会引起对同一个类或模块的修改,影响了代码的可读和可维护性
改进目标:
提高代码组织结构、职责单一提升代码可读性、可维护性
方法:
拆分阶段
搬移函数
提炼函数
提炼类

霰弹式修改

定义:

霰弹式修改:指的是如果每遇到某种变化,你都必须在许多不同的类内做出许多小修改。此时,你所面临的坏味道就是霰弹式修改

影响:

修改的地方四面散布,而且有可能修改之后导致其他异常结果

改进目标:

更好的代码组织,更少的代码重复

方法:
搬移函数、搬移字段、函数组合成类、函数组合成变换、拆分阶段、内联函数、内联类

clone的应用

这里之所以使用 clone,是因为在跨边界调用场景下,直接更改原对象会有一定风险。
比如某些场景下,边界外更改对象可能改变边界内状态,或者调用方想维护多个状态时可能引发混乱。
因此一般涉及状态信息更新时,尽量不直接处理同一对象(使用clone),或不暴露完整对象(返回部分需要的属性)。
如果需要内部维护对象状态,又需要将完整对象暴露出去,就返回一个副本(比如当前案例,如果 clonePaySlip 需要在内部缓存,那么返回值应当进一步优化为:clonePaySlip.clone())

依恋情节

定义:
依恋情节/特性依恋:一个函数跟另一个模块中的函数或数据交流格外频繁,远胜于在自己所处模块内部的交流
影响:
可读性、可维护性低:调用另一模块功能时往往需要打一套组合拳才能完成,需要知道过多的细节;往往会伴随有”内幕交易、重复代码、霰弹式修改……”
改进目标
将函数搬移到对应的类,解除跨模块的过多交流
方法
提炼函数、搬移函数
注:策略模式、访问者模式往往会带来依恋情节,这不是说这两个模式不可取。我们需要理解:
从根本上来说,我们消除”依恋情节”和应用这些设计模式都是为了把一起变化的东西放到一块儿

——《重构,改善既有代码的设计》

数据泥团

定义
总是成块出现的相同数据项,包括多个类中相同的字段、多个方法签名中相同的参数等
影响
成块出现的重复参数过多,影响阅读和理解,难维护
改进目标
减少相同的字段及入参,缩短入参列,简化函数调用
方法
提炼类 引入参数对象 保持对象完整性

Tip:内联

这里之所以能够直接内联,是因为字段是final的,只会读取,不会更新,大家可以尝试在非final上内联,IDEA会提示我们内联失败。因此当我们需要通过内联的方法消除字段时,需要先想办法把字段变为final的

Ctrl+Alt+N

重构

Original: https://www.cnblogs.com/zz01/p/16488060.html
Author: 山野村夫01
Title: 重构

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622763/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 2. 函数

    404. 抱歉,您访问的资源不存在。 可能是URL不正确,或者对应的内容已经被删除,或者处于隐私状态。 [En] It may be that the URL is incorre…

    数据库 2023年5月24日
    085
  • 0811JDBC随笔

    1.JDBC体系系统 一组规范:接口 JDBC接口(API)包括两个层次: 面向应用的API:Java API,抽象接口,供应用开发人员使用(连接数据库,执行SQL语句,获得结果)…

    数据库 2023年6月14日
    081
  • Spring Boot + MyBatis 多模块项目搭建教程

    一、前言 1、开发工具及系统环境 * – IDE:IntelliJ IDEA 2020.2.2 – 系统环境:Windows 2、项目目录结构 * &#82…

    数据库 2023年6月6日
    093
  • MySQL alter table时执行innobackupex全备再谈Seconds_Behind_Master

    1.场景描述 早上7:25 接到Report中心同学告警,昨天业务报表数据没有完整跑出来,缺少500位业务员的数据,并且很快定位到,缺少的是huabei_order库上的数据。Re…

    数据库 2023年5月24日
    092
  • Figma 快捷键

    作用 WINDOWS MAC 窗口切换到Home Ctrl + 1 Cmd + 1 窗口切换到打开的第一个文件 Ctrl + 2 Cmd + 2 打开菜单搜索 Ctrl + / C…

    数据库 2023年6月6日
    085
  • SQL Server中STATISTICS IO物理读和逻辑读的误区

    SQL Server中STATISTICS IO物理读和逻辑读的误区 大家知道,SQL Server中可以利用下面命令查看某个语句读写IO的情况 SET STATISTICS IO…

    数据库 2023年6月9日
    074
  • show engine innodb status 输出结果解读

    show engine innodb status 输出结果解读 基于MySQL 5.7.32最近想整理一下show engine innodb status的解读,但是发现中文互…

    数据库 2023年6月16日
    0108
  • 牛客SQL刷题第一趴——非技术入门基础篇

    id device_id gender age university province 1 2138 male 21 北京大学 Beijing 2 3214 male 复旦大学 S…

    数据库 2023年5月24日
    099
  • 【JDBC】笔记(1)— JDBC概述

    1、JDBC是什么?Java DataBase Connectivity(Java语言连接数据库) 2、JDBC的本质是什么?JDBC是SUN公司制定的一套 接口(实质)java….

    数据库 2023年5月24日
    092
  • JSP基础知识总结

    JSP概述 什么是 jsp Servlet 程序输出 html 页面 如何创建一个 jsp 动态页面程序 如何修改 jsp 文件的默认编码 jsp 的运行原理 jsp 的语法 js…

    数据库 2023年6月11日
    096
  • 数字图像处理—检测交通视频中运动目标的程序设计

    初始条件: (1)数字图像处理的基本理论学习; (2)Matlab或Visual C++软件工具。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)…

    数据库 2023年6月16日
    0119
  • SQL语句的整合

    基础语法 https://blog.csdn.net/m0_37989980/article/details/103413942 CRUD 提供给数据库管理员的基本操作,CRUD(…

    数据库 2023年5月24日
    094
  • Harsh =哈希 =散列

    key-hash-%-index Harsh =哈希 =散列 HarshCode=哈希码=哈希代码=散列码=散列值 哈希函数=散列函数=哈希算法=Harsh Algorithm 散…

    数据库 2023年6月14日
    072
  • 第十章 对象的生命周期

    1.什么是生命周期 对象创建 存活 销毁的完整的过程 2.为什么学习对象的生命周期 在以前通过new创建对象,调用对象,则该对象存活,直到被JVM的垃圾回收机制回收 现在由Spri…

    数据库 2023年6月14日
    083
  • 0811JDBC随笔

    1.JDBC体系系统 一组规范:接口 JDBC接口(API)包括两个层次: 面向应用的API:Java API,抽象接口,供应用开发人员使用(连接数据库,执行SQL语句,获得结果)…

    数据库 2023年5月24日
    066
  • 第十二章 自定义类型转换器

    1.类型转换器 作用:Spring通过类型转换器把配置文件中字符串类型的数据,转换成对象中成员变量对应类型的数据,从而完成注入 2.自定义类型转换器 当Spring内部没有提供特定…

    数据库 2023年6月14日
    077
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球