代码坏味道:是指在代码之中潜在问题的警示信号。并非所有的坏味道所指示的确实是问题,但是对于大多数坏味道,均很有必要加以查看,并作出相应的修改。
1. 重复的代码
如果你在一个以上的地点看到相同的程序结构,那么当可肯定:设法将它们合而为一,程序会变得更好。
- 同一个class内的两个函数中含有重复的代码段
- 两个兄弟class的成员函数中含有重复的代码段
- 两个毫不相关的class内出现重复的代码段
注意:重复的代码是多数潜在BUG的温床!
2. 过长的函数
拥有短函数的对象会活的比较好、比较长。
- 程序愈长就愈难理解
- 函数过长阅读起来也不方便
- 小函数的价值:解释能力、共享能力、选择能力
原则:每当感觉需要以注释来说明点什么的时候,我们就把需要说明的东西写进一个独立的函数中。记着,起个好名字!
3. 过大类
如果想利用单一类做太多事情,其内往往就会出现太多的成员变量。
- 提取完成同一任务的相关变量到一个新的类
- 干太多事情的类,可以考虑把责任委托给其他类
注意:一个类如果拥有太多的代码,也是代码重复、混乱、死亡的绝佳滋生地点。
4. 过长的参数列表
太长的参数列表难以理解,太多参数会造成前后不一致、不易使用,而且你需要更多数据时,就不得不修改它。
原则:参数不超过3个!
5. 发散式变化
我们希望软件能够更容易被修改。一旦需要修改,我们希望能够跳到系统的某一点,只在该处做修改。如果不能做到这点,你就嗅出“坏味道:发散式变化”或“坏味道:霰弹式修改”。
发散式变化:一个类受多种变化的影响
- 数据库新加一个字段,同时修改三个函数:Load、Insert、Update
- 新加一个角色二进制,同时修改四处
- …
原则:针对某一外界变化的所有相应修改,都只应该发生在单一类中
6. 霰弹式修改
如果每遇到某种变化,你都必须在许多不同的类内做出许多小修改以响应之。如果需要修改的代码散布四处,你不但难以找到它们,也很容易忘记某个重要的修改。
霰弹式修改:一种变化引起多个类相应的修改
7. 依恋情节
函数对某个类的兴趣高过对自己所处类的兴趣,就会产生对这个类的依恋情节,造成紧耦合。
原则:判断哪个类拥有最多被此函数使用的数据,然后将这个函数和那些数据摆在一起。
原则:将总是变化的东西放在一块。
8. 数据泥团
有些数据项,喜欢成群结队地待在一块。那就把它们绑起来放在一个新的类里面。这样就可以:
- 缩短参数列表
- 简化函数调用
9. 基本型别偏执
代码中有很多基本数据类型的数据。
原则:如果看到一些基本类型数据,尝试定义一种新的数据类型,符合它当前所代表的对象类型。
10. switch惊悚现身
面向对象程序的一个最明显特征就是:少用switch语句。从本质上说,switch语句的问题在于重复。
原则:看到switch你就应该考虑使用多态来替换它。
11. 冗赘类
你所创建的每一个类,都得有人去理解它、维护它,但一个类没有存在的必要时候,就让这个类庄严扑义吧!
原则:如果一个类的所得不值其身价,它就应该消失。
12. 夸夸其谈其未来性
对未来不可预知的变化考虑的过多,造成系统更难理解和维护。如果应对变化的代码都会被用到,那是值得的那么做;如果用不到,就不值得。
原则:代码应该满足当前的需求,并留有可扩展的余地。对于未来的变化,既不要考虑的太多,也不能一点都不考虑。
13. 令人迷惑的暂时成员变量
有时你会看到这样的对象:其内某个成员变量仅为某种特定的情形而设。这样的代码容易让人不解,因为你通常认为对象在所有时候都需要它的所有变量。
在变量未被使用的情况下猜测当初设置目的,会让你发疯。
14. 无用的中间人
过度使用委托。你也许会看到某个类的接口有一半的函数都委托给其他类,这样就过度运用了。所以,删除无用的中间人。
15. 狎昵关系
有时你会看到两个类过于亲密,花费太多时间去探究彼此的private成分。
原则:过分狎昵的类必须拆散。
16. 异曲同工的类
如果两个函数做同一件事情,却有着不同的签名式。
原则:删除一个,保留一个。
17. 不完美的程序库类
库的设计有时会不够好,不那么容易使用,可能还会有那么一点小缺陷。
工具:
- Introduce Foreign Method
- Introduce Local Extension
18. 过多的注释
过多注释的代码段,往往都是因为那段代码比较糟糕,散发着一股恶臭。
原则:当你感觉需要写注释时,请尝试重构,试着让所有注释都变得多余。
参考资料:
- 《重构:改善既有代码的设计》
- 《重构手册》
相关推荐
"编码中的21种代码坏味道" 在设计和编码中,存在着21种代码坏味道,这些坏味道可能会给后续维护带来极大影响。如果我们能够识别和消除这些坏味道,那么我们的代码将变得更加简洁、可维护和可扩展。 Duplicated ...
标题“代码坏味道整理”指的是在编程过程中,代码可能会出现的一些不良习惯或低效的编程实践,这些被称为“代码坏味道”。这些坏味道通常会使代码难以理解、维护和扩展,降低了软件的质量。为了提高代码可读性和可...
### 《重构 改善既有代码的设计》之代码的坏味道 #### 代码的坏味道简介 重构是一种改进代码质量的重要手段,它不仅能够提升代码的可读性和可维护性,还能帮助开发者更好地理解现有系统架构。《重构 改善既有代码...
以下是一些常见的代码坏味道及其对应的重构方法: 1. **重复代码 (DRY - Don't Repeat Yourself)**:通过提炼方法、提取类等方式消除代码重复。 2. **过长方法**:可以使用提取方法来拆分长方法,提高代码可读性。...
然而,在实际工作中,我们常常会遇到一些"代码坏味道",即代码中常见的不良模式,它们降低了代码质量,增加了维护难度。以下是我近期在代码审查中注意到的五种出现次数较多的代码坏味道,并针对每一种提供了解决建议...
常见的代码坏味道包括: 1. **长方法**:如果一个方法执行多个职责,应考虑拆分为多个小方法,每个方法只做一件事。 2. **重复代码**:重复的代码不仅浪费存储空间,也增加了维护成本。通过创建函数或类来实现代码...
代码坏味道,也被称为“code smell”,是软件开发中用来描述代码质量低下、结构不佳或者不易理解的现象。这些坏味道可能并不直接影响程序的运行,但它们往往预示着潜在的问题,比如复杂性增加、可读性下降或维护成本...
### 代码TOP10的坏味道 #### 1. 返回值处理 在Java开发中,一个常见的问题是**返回值处理不当**。这个问题通常出现在函数调用后,如果调用方忽略了处理被调用函数的返回值,特别是当这些返回值对于后续业务逻辑有...
《重构-第3章 代码的坏味道》是软件开发领域的一本经典著作,由Martin Fowler所著。这本书深入探讨了如何识别并消除代码中的不良设计模式,以提高代码质量、可读性和可维护性。在第三章中,作者详细列举了多种"代码...
JavaScript代码分析技术综述对Web系统的开发和展示产生了巨大变革,但同时也带来了代码坏味道等潜在问题。 本文对1995年以来国内外会议和期刊论文进行调研,根据文献来源和主题选择了291篇高水平论文进行深入分析,...
Fowler列举了多种常见的代码坏味道,如长方法、重复代码、开关陈述、数据泥团等,并提供了相应的检测策略。 其次,"选择合适的重构模式"是改善代码的关键。书中列举了数十种重构模式,如提取方法、提炼类、引入参数...
1. **识别代码坏味道**:书中列出了一些常见的代码坏味道,如重复代码(Duplicated Code)、过长方法(Long Method)、过大的类(Large Class)等。识别这些症状是重构的第一步。 2. **使用单元测试**:重构过程中...
1. **识别代码坏味道**:书中列举了多种常见的代码坏味道,如重复代码(Duplicated Code)、长方法(Long Method)和数据泥团(Data Clumps)等。这些坏味道是代码需要重构的信号。 2. **重构策略与技术**:马丁·...
2. **识别坏味道**:书中列举了多种“代码坏味道”,如重复代码(Duplicated Code)、过长函数(Long Method)、过大的类(Large Class)等,这些都是代码质量下降的信号,需要进行重构。 3. **设计原则**:书中...
《代码大全》提供了关于重构的实用指南,包括识别代码坏味道、应用重构技术以改善代码结构,以及如何在保持软件功能不变的前提下提高代码质量。书中还讨论了如何通过持续集成和持续交付来实现更快的开发迭代。 关于...
1. **识别代码坏味道**:比如冗余代码、过长函数、重复代码、复杂条件表达式等,这些都是需要重构的信号。 2. **提取方法**:将大函数分解成多个小函数,每个函数只做一件事情,提高代码的可读性。 3. **引入参数...
6. **代码重构**:这是优化代码结构的重要手段,包括识别和移除代码坏味道,以及如何通过提取函数、类或模块来改善代码结构。 7. **软件架构**:大型项目需要有清晰的架构,如分层架构、微服务架构等。书中可能会...
1. 重构:书中详细介绍了重构的概念和技巧,包括如何识别代码坏味道,以及如何通过重构改进代码结构。 2. 性能优化:探讨了如何通过分析和优化代码来提升程序性能,同时避免过早优化的风险。 3. 错误预防:讲解了...