代码坏味道

本贴最后更新于 1879 天前,其中的信息可能已经渤澥桑田

代码坏味道

1 Shotgun Surgery 散弹手术

牵一发而动全身,每次遇到某种变化,都必须在不同的类中做出小修改

2 Duplicated Code(重复的代码)

就是有几行代码到处都在用

3 Long Parameter List(过长参数列)

参数太多,组成对象传进去吧。

4 Data Clumps(数据泥团)

多个类中出现相同的字段,或多个方法上出现相同的形参

5 Long Method(过长函数)

函数太复杂写太长,分段提取为多个方法。显得简单易懂。

6 Large Class(过大类)

单个类做太多的事,分工不分明,重复代码多。

7 Divergent Change(发散式变化)

描述:一个类被锚定了多个变化,当这些变化中的任意一个发生时,就必须对类进行修改。
解释:一个类最好只因一种变化而被修改

8 Feature Envy(依恋情结)

某个函数为了实现其功能,经常从另一个类中获取大量数据。比起自身所在的类来说,更加依赖于另一个类。

数据和行为不在一处,修改不可控。

9 Primitive Obsession(基本类型偏执)

Coding 的时候总喜欢用基本类型,而不喜欢用对象。

10 Switch Statements(switch 声明)

如果要为它添加一个新的 case 子句,就必须找到所有 switch 语句并修改它们。

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

其实是 Shotgun Surgery(散弹式修改) 的特殊情况. 在这种情况下, 每当你为某个类增加一个子类, 必须也为另一个类相应增加一个子类

12 Lazy Class(冗赘类)

如果一个类没什么价值,应该让他消失。

13 Speculative Generality(夸夸其谈未来性)

未来的功能什么的未来再说。
如果函数或类的唯一用户是测试用例

14 Temporary Field(令人迷惑的暂时值域)

如果类中有一个复杂算法,需要好几个变量,往往就可能导致坏味道令人迷惑的临时字段(Temporary Field)出现。由于实现者不希望传递一长串参数,所以他把这些参数都放进字段。但是这些字段只在使用该算法时才有效,其他情况下只会让人迷惑。这时可以利用 Extract Class (提炼类)把这些变量和其相关函数提炼到一个独立的类中。

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

a.b.c.final()
隔壁朋友的表姐的妈妈的闺蜜的小孩。
a.final()
隔壁家的小孩。

16 Middle Man(中间转手人)

上面 a 做的事情太多就把它干掉。
隔壁家这个中间人事情太多,实际的类被架空。

17 Inappropriate Intimacy(不正当亲密关系)

哈哈这名字也是够了, 不就是双向管连尽量改用单向么。
比如,老师有很多学生这时候不是在老师类里面加 List stu,而是只在学生类加 Teacher t.
如果都加就是不正当关系了。

18 Alternative Classes with Different Interfaces(差不多类有两个不一样接口)

如题,要么把接口干掉要么把类干掉。

19 Incomplete Library Class(不完备的程序库类)

封装好的类库中功能不能满足实际需求。

  1. 搞个子类继承他,修改子类方法。
  2. 搞个工具栏,封装扩展的方法。
20 Data Class(数据类)

只有属性没有方法,被其他地方过于细碎的操作。
应该把涉及到的方法移动到自己类里面。

21 Refused Bequest(被拒绝的遗产)

父类的东西,子类不想继承。继承下来没啥用。
那么

  1. 把父类的东西放到其他子类里面,精简父类。
  2. 用委托找个他的子类或他自己来处理。
22 Comments(注释)

指的是代码太差不得不写很多注释来说明。

为了生活理解一下:
JS、JAVA 程序调试;
网站、小程序、APP 项目;
qq:1582508336 魔道工程师

  • 代码
    467 引用 • 586 回帖 • 9 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8449 引用 • 38491 回帖 • 155 关注
1 回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...