重构

重构

参数过长

影响:

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

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

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

​ 如实体类中的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)

大家都在看

  • Python 学习笔记(六)–线程

    1.自定义进程 自定义进程类,继承Process类,重写run方法(重写Process的run方法)。 from multiprocessing import Process im…

    数据库 2023年6月16日
    0129
  • python 2分法查找实例

    直接上代码(内含注释) 直接上代码(内含注释) 1 find_list = [2, 5, 7, 8, 12, 23, 27, 31, 33, 42, 44, 45, 47, 50]…

    数据库 2023年6月11日
    075
  • java如何获取一个文本文件的编码(格式)信息呢?

    文本文件是我们在windows平台下常用的一种文件格式, 这种格式会随着操作系统的语言不同,而出现其默认的编码不同 那么如何使用程序获取”文本文件”的编码方…

    数据库 2023年6月11日
    0179
  • SQL中的排座位问题

    表: Seat +————-+———————+|…

    数据库 2023年5月24日
    077
  • [spring]spring注入属性值的两种方式以及作用域

    4.IOC创建对象的过程 使用无参构造创造 设定为有参后,就会报错! 对象在被注册进去的时候,就被实例化了,直接使用就好。 5.IO注入 (1)前面的构造器注入 (2)set注入 …

    数据库 2023年6月16日
    0123
  • mysql8使用tmpfs内存磁盘当内存数据库的配置方法

    内存关系数据库没有找到开源好用的,很多都是商用。虽然mysql有memory引擎,但写是整体锁表,没法用。 一直想将mysql放入内存中,搜索n次资料,没找到合适的,可能之前思路不…

    数据库 2023年5月24日
    0116
  • 2_JDBC

    使用客户端工具访问数据库, 需要手工建立连接, 输入用户名和密码登陆, 编写SQL语句, 点击执行, 查看操作结果(结果集或受行数影响) 在实际开发中, 当用户的数据发生改变时, …

    数据库 2023年6月11日
    067
  • 详谈 MySQL 8.0 原子 DDL 原理

    柯煜昌 青云科技研发顾问级工程师 目前从事 RadonDB 容器化研发,华中科技大学研究生毕业,有多年的数据库内核开发经验。 文章字数 3800+,阅读时间 15 分钟 背景 My…

    数据库 2023年6月11日
    0148
  • 手写LRU缓存淘汰算法

    概述 LRU算法全称为 Least Recently Used是一种常见的页面缓存淘汰算法,当缓存空间达到达到预设空间的情况下会删除那些 最久没有被使用的数据 。 常见的页面缓存淘…

    数据库 2023年6月11日
    0138
  • pycharm2022.2.1版本设置中文语言

    进入”File👉Sttings”界面 进入”Plugins(插件)”下,输入Chinese,找到”Chinese (Si…

    数据库 2023年6月14日
    0106
  • 设计模式之(4)——单例模式

    定义:单例模式属于创建型模式,该类负责创建自己的对象实例,并且确保只有单个对象被创建,同时该类提供了一种全局访问其唯一实例对象的方式;这个定义中有三个要点:1、单例类只能有一个实例…

    数据库 2023年6月14日
    093
  • 如何使用原生的Ribbon

    什么是Ribbon 之前分析了如何使用原生的Feign,今天我们来研究 Netflix 团队开发的另外一个类库–Ribbon。Ribbon 和 Feign 有很多相似的…

    数据库 2023年6月6日
    0102
  • python-django框架中使用七牛云

    1:注册七牛云账号 https://www.qiniu.com/ js文件 链接:https://pan.baidu.com/s/1BW1svHqEsXrrTNtRobKkpg 提…

    数据库 2023年6月6日
    0107
  • 安全生产 系统稳定性建设

    前言 安全是产品的底座,是体验的基础,也是企业的一项核心竞争力。安全生产是一项系统性的工作,同时也是一件比较琐碎的事,需要做方方面面的考虑尽一切可能保障系统安全稳定运行。个人之前一…

    数据库 2023年6月14日
    086
  • MySql用户与权限控制

    MySql用户与权限控制 — 刷新权限命令 # — 刷新mysql权限命令 flush privileges; 用户管理 1、查看用户 #查看用户 USE mysql…

    数据库 2023年6月11日
    095
  • java扫描某个包下的所有java类并加载

    最近在学习java的反射和注解,实际情景中需要扫描某个包下的所有java类,然后使用类加载器加载类。 基本思路,获得程序的路径扫描src下某个包内的子包和java类,实现也比较简单…

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