首页 > 其他分享 >代码的坏味道 《重构改善既有代码的设计》

代码的坏味道 《重构改善既有代码的设计》

时间:2023-07-07 12:13:01浏览次数:39  
标签:重构 提取 函数 修改 味道 代码 对象 类中

1. Duplicated Code
重复代码,在程序中多次出现的相同结构或功能的代码

  • 同一个类中的两个函数含有相同的表达式
  • 两个互为兄弟的子类中含相同的表达式
  • 相互独立的类中出现相同表达式

2. Long Method

  • 过长的函数难以理解及维护
  • 段函数或间接层具有很强的解释能力、共享能力和选择能力
  • 面向对象几乎完全免除了进程内函数调用的开销
  • 短函数功能单一明确,可以起一个比较贴近功能的名称
  • 避免过长的参数列表
  • 查找注释过的代码,通过可以提取出来形成小函数
  • 条件表达式和循环代码也可以提取

3. Large Class

  • 一个类若需要做过多的事情,就会出现大量实例对象,进而导致产生重复代码
  • 将类中彼此相关的变量提取到新类或子类中(可通过变量前缀或字尾区分是否相关)
  • 根据类接口的调用方式来确定该类对外的接口分解

4. Long Parameter List

  • 过长的参数列表难以理解,可能造成前后不一致,不易修改
  • 可以通过宿主对象,或将参数封装成对象传入都可有效减少入参
  • 避免较大对象的传入,此时需要权衡是否以参数列表传入

5. Divergent Change

  • 当类因为不同的场景需求导致其功能向不同的方向发生变化时,那么当你要修改它时,就无法集中于一点进行修改
  • 最好是每一种变化对应一个类的修改

6. Shotgun Surgery

  • 一种需求的变化可能会是你修改多个小类,这样可能会导致遗忘某处修改
  • 建议尽量将应对这一变化修改的变量和代码能集中到同一个类中
  • 与Divergent Change提倡的似乎有点相反,但两者间尽量寻求平衡点,视具体场景而定

7. Feature Envy

  • 当一个类中函数大量调用其他类对象中的接口和数据时,可以考虑将其分解后,移至被调用的类中
  • 这样可能会导致发散变化,Stategy和Visitor模式可以将一起变化的东西集中在一处

8. Data Clumps

  • 有些数据或字段经常会重复出现:两个类中拥有相同字段,多个函数签名中有相同的参数, 这种问题可将数据集中到同一个对象中,然后直接操作对象
  • 可以通过删除参数中的一项,看是否影响其他数据,若有,则需要提取

9. Primitive Obsession

  • 程序中常用基本数据类型和结构类型
  • 可使用对象替换一些基本数据类型,构成自定义的小型对象类型数据使用

10. Switch statements

  • 面向对象编程中建议尽量少使用switch,而使用多台替代
  • 根据类型码提取相关的函数或类,再在提取类中考虑使用多态
  • 若进单一函数中使用选择事例,那没必要改成多态

11. Parallel Inheritance Hierarchies

  • 当你增加一个类的子类时,需要同时增加另一个平行类的子类
  • 通常观察某个继承体系的类名称前缀和另一个集成体系的类名称前缀相同,基本属于此类味道
  • 可以让一个继承体系的实例引用另一个继承体系的实例

12. Lazy Class

  • 每个类的存在都必须确实履行它的责任
  • 若发现设计了应对未知变化的类,却目前仍没使用,或其他原因导致某个类不再使用,可以删除掉

13. Speculative Generality

  • 针对未来可能遇到的变化而设计的类,目前未被使用的情况,可以先删除
  • 抽象类作用不大,不必要的委托,未被使用的参数,函数名带有多余的意味等都需要修改
  • 若函数或类的唯一用户是测试用例,那么没必要保留

14. Temporary Field

  • 类中有时会存在一些应对某种特定情况的变量,这种变量的设置目的很难在其使用之前猜测到用途
  • 可以将这种变量及相关代码提取到单一的类中管理

15. Message Chains

  • 对象间的顺次调用就是消息链,客户代码与查找过程中的导航结构紧密耦合,一旦对象间的关系发生变化,那么客户代码也要随之变化
  • 先观察消息链最终得到的对象,然后将与其相关的代码提取到一个函数中,再将这个函数推入消息链

16. Middle Man

  • 某些类接口有一半的函数都委托给其他类,属于过度运用
  • 尽量让类直接与真正负责的对象打交道
  • 这种函数较少时可使用内联方法将他们放入调用端
  • 若委托对象还有其他行为,可以用继承代替代理

17. Inappropriate Intimacy

  • 两个类中的默写字段或函数功能含混不清或十分接近,需要划清界限
  • 可以将双向关联改成单向关联
  • 可以提取公共类
  • 可以使用代理

18. Alternative Classes with Different Interfaces

  • 若两个类中的接口功能一致,命名不同,首先需要重命名,保持一致,其次需要将功能一致的代码只维护一份

19. Incomplete Library Class

  • 针对设计不完美的三方类库,难以修改
  • Introduce Foreign Method 用于修改类库的一两个函数
  • Introduce Local Extension 用于添加额外行为

20. Data Class

  • 纯数据类型需要对私有字段进行封装,对只读字段不要添加set方法

21. Refused Bequest
22. Comments

  • 过多的注释需要重构

 

标签:重构,提取,函数,修改,味道,代码,对象,类中
From: https://www.cnblogs.com/ybqjymy/p/17534595.html

相关文章

  • 代码的坏味道
    代码坏味道:是指在代码之中潜在问题的警示信号。并非所有的坏味道所指示的确实是问题,但是对于大多数坏味道,均很有必要加以查看,并作出相应的修改。1. 重复的代码如果你在一个以上的地点看到相同的程序结构,那么当可肯定:设法将它们合而为一,程序会变得更好。同一个class内的两个......
  • 项目受源代码管理。向源代码管理注册此项目时出错。建议不要对此项目进行任何更改
    http://www.noobyard.com/article/p-uweyzjzb-cp.html编译Rocket.Windows.Framework项目的时候提示如题的错误,html 用记事本打开出错的几个项目的.csproj文件,把下面几行内容删掉就好了。vue   <SccProjectName>Svn</SccProjectName>  <SccLocalPath>Svn</SccLocalP......
  • ARIMA模型,ARIMAX模型预测冰淇淋消费时间序列数据|附代码数据
    全文下载链接:http://tecdat.cn/?p=22511最近我们被客户要求撰写关于ARIMAX的研究报告,包括一些图形和统计输出。标准的ARIMA(移动平均自回归模型)模型允许只根据预测变量的过去值进行预测。该模型假定一个变量的未来的值线性地取决于其过去的值,以及过去(随机)影响的值。ARIMAX模型......
  • R语言和Python用泊松过程扩展:霍克斯过程Hawkes Processes分析比特币交易数据订单到达
    全文下载链接:http://tecdat.cn/?p=25880 最近我们被客户要求撰写关于泊松过程的研究报告,包括一些图形和统计输出。本文描述了一个模型,该模型解释了交易的聚集到达,并展示了如何将其应用于比特币交易数据。这是很有趣的,原因很多。例如,对于交易来说,能够预测在短期内是否有更多的买......
  • Git 代码分支管理
    一、引言近日,IoT研发团队加入了不少新同学,对git分支的命名和管理方式有些许的模糊,分支的命名规范以及管理方式对项目的版本发布至关重要,为了解决实际开发过程中版本发布时代码管理混乱、冲突等比较头疼的问题,我们将在文中阐述如何更好的管理代码分支。二、总览从上图可以看......
  • SRGAN图像超分重建算法Python实现(含数据集代码)
    摘要:本文介绍深度学习的SRGAN图像超分重建算法,使用Python以及Pytorch框架实现,包含完整训练、测试代码,以及训练数据集文件。博文介绍图像超分算法的原理,包括生成对抗网络和SRGAN模型原理和实现的代码,同时结合具体内容进行解释说明,完整代码资源文件请转至文末的下载链接。完整......
  • 【WALT】scale_exec_time() 代码详解
    @目录【WALT】scale_exec_time()代码详解代码展示代码逻辑:为什么归一化?⑴ 将CPUcycles转换为CPU当前频率⑵ 归一化delta【WALT】scale_exec_time()代码详解代码版本:Linux4.9android-msm-crosshatch-4.9-android12代码展示staticinlineu64scale_exec_time(u64delt......
  • 嵌入式宝藏级别的C代码
    在嵌入式开发中,有一些常用的C语言代码片段被认为是宝藏级别的,因为它们在处理底层硬件和优化性能方面非常有用。以下是一些常见的宝藏级别的C语言代码和解释:1.位操作代码//设置某个位为1#defineSET_BIT(reg,bit)((reg)|=(1<<(bit)))//清除某个位为0#defineCLEAR_BIT(re......
  • poi-tl 将html代码渲染到word中
    引入依赖<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.15.3</version></dependency><dependency><groupId>io.github.draco1023</groupId>......
  • 向源代码管理注册此项目时出错。建议不要对此项目进行任何更改。
    https://blog.csdn.net/wj2014/article/details/78287239CCHR项目是从SVN上签到VSS的,项目打开提示如下错误。需要打开.csproj项目文件将含有关于SVN的配置节去掉即可。    ......