代码异味

2006年2月9日

代码异味是系统中通常对应更深层问题的表面迹象。这个词最初是由肯特·贝克在帮助我编写我的重构书时创造的。

上面的快速定义包含几个微妙的点。首先,异味从定义上来说是快速发现的——或者正如我最近所说,是“可嗅探的”。一个很长的方法就是一个很好的例子——只要看看代码,如果我看到超过十行 Java 代码,我的鼻子就会抽动。

第二点是,异味并不总是表明存在问题。有些很长的方法很好。你必须深入研究才能确定是否存在潜在的问题——异味本身并不一定不好——它们通常是问题的指示器,而不是问题本身。

最好的异味是那些很容易发现的,而且大多数情况下会引导你发现真正有趣的问题。数据类(所有数据都没有行为的类)就是很好的例子。你看着它们,然后问自己这个类应该包含什么行为。然后你开始重构以将该行为移入其中。通常,简单的问题和初始重构可能是将贫血对象转变为真正具有类性的对象的至关重要的一步。

异味的一个好处是,即使没有足够的经验来评估是否存在真正的问题或如何纠正它们,经验不足的人也很容易发现它们。我听说过一些首席开发人员会选择一个“本周的异味”,并要求人们寻找这种异味,并将它与团队中的高级成员讨论。一次处理一个异味是逐步教会团队成员成为更优秀程序员的好方法。