1. Duplicated Code(重复代码) session
2. Long Method (过长函数) app
包含太多信息,这些信息又被函数错综复杂的逻辑掩盖,不易鉴别。 函数
如何肯定该提炼哪一段代码呢?一个很好的技巧是:寻找注释。它们一般能指出代码用途和实现手法之间的语义距离。若是代码前方有一行注释,就是在提醒你:能够将这段代码替换成一个函数,并且能够在注释的基础上给这个函数命名。就算只有一行代码,若是须要以注释来讲明,那也值得将它提炼到独立函数去。 对象
3. Large Class(过大的类) 继承
4. Long Parameter List(过长参数列) it
5. Divergent Change(发散式变化) io
针对某一外界变化的全部相应修改,都只应该发生在单一类中,而这个新类内的全部内容都应该反应此变化。为此,你应该找出某特定缘由而形成的全部变化,而后运用Extract Class 将它们提炼到另外一个类中。 基础
6. Shotgun Surgery(霰弹式修改) sed
Shotgun Surgery 与Divergent Change偏偏相反。若是每遇到某种变化,你都必须在许多不一样的类内作出许多小修改,你所面临的坏味道就是Shotgun Surgery。这种状况下你应该使用Move Method 和Move Field 把全部须要修改的代码放进同一个类。若是眼下没有合适的类能够安置这些代码,就创造一个。一般能够运用Inline Class把一系列相关行为放进同一个类。这可能会形成少许Divergent Change,但你能够轻易处理她。 List
7. Feature Envy (依恋情结)
8. Data Clumps(数据泥团)
缩短参数列,简化函数调用。一个好的评判办法是:删掉众多数据中的一项。这么作,其余数据有没有于是失去意义?若是它们再也不有意义,这就是个明确信号:你应该为它们产生一个新对象。
9. Primitive Obsession(基本类型偏执)
10. Switch Statements(switch 惊悚现身)
11. Parallel Inheritance Hierarchies (平行继承体系)
Parallel Inheritance Hierarchies 实际上是Shotgun Surgery 的特殊状况。在这种状况下,每当你为某个类增长一个子类,必须也为另外一个类相应增长一个子类。若是你发现某个继承体系的类名称前缀和另外一个继承体系的类名称前缀彻底相同,即是问到了这种坏味道。
消除这种重复性的通常策略是:然一个集成体系的实例引用另外一个继承体系的实例。
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(不完美的库类)
20 Data Class(纯稚的数据类)
21 Refused Bequest (被拒绝的遗赠)
22 comments (过多的注释)