(http://drdobbs.com/cpp/230600127)
重构技巧和纪律是通往小精灵之岛的康庄大道。
我之前的文章讨论了在基础代码中使用小的类的好处和作用,我认为一个类的代码应当限制在50到60行。我陆续收到了许多回复,大部分类比了以前关于让函数变小以在一屏显示的法则。
虽然很感谢这些回复,但他们都忽略了决定性的一点。我并没有讨论函数,而是可能包含多个函数的类。编写一个只有60行大小的类会打击一些作者,因为要实现它的简单性却有许多的限制,可能并不值得去做。
但它恰恰是纪律,这样的行数规定,创建了非常明确理想的代码。相信正如其它回复所描述的那样,这条纪律并没有被保持,对于保持小类的标准技术也没有像我所期望的那样被广泛地了解。
让我们过一下这些技术原则。假设设计已经完成,这里只是如何写代码。或者是维护代码这种没有吸引力的活。
减少工作负担 (Diminish the workload)
首先运用的技术是单一职责法则(SRP), 它强调一个类只做一件事。这件事有多大决定了这类将有多大。减少每个类的工作,然后用其它类把这些小的类正确地关联起来。
避免执着于表象 (Avoid primitive obsession)
这种执着会诱使我们使用原始的数据组织方式。也是被定义代码异味的一种。 如果有一个对象链表,那么这个链表应当定义为自己的类,并有有合适的命名。仅仅向其它类公开方法,这样避免它们去执行它们所不了解的行为。这个列表的目的非常清楚,这样的封装允许你在必要时变更数据结构。
(*这是一种数据抽象加工的能力。在使用OO时,如果形成类时过于直白,往往适得其反。可以参考下面的文章:"面向对象的分析和设计-抽象出对象")
减少成员数量 ( Reduce the number of class and instance variable )
数量可观的变量也是一种代码异味,它导致类做更多的事。后来的开发者也很难理清类做了什么。 通常,一些变量构成自然的组合,这就是一个新的类。同时将操作它们的方法也直接移到新的类。
子类化特殊情况 (Subclass special-case logic)
如果一个类含有很少使用的逻辑,就应决定是否可以将这部分逻辑移到子类中或者干脆放到一个新类中。OO中的多态就是一个典型的例子,它可以用来处理特殊的变化
不要重复自己 (Don't repeat yourself)
这个建议似乎与主题明显不相关。不过,即使编码者注意到这个法则,但是两个函数仍可能因为只有一点点不同而产生重复的代码。另外,他们可以在维护过程中检查重复代码的说明。与其它几条不同的是,其它建议都是纯技术性的,而DRY则是纪律中的纪律
使用这些工具基本上可以让你达成较小的类。要想了解它们在现实中的运用,可以看看我之前已经推荐了好几次了的书:Martin Fowler的<<重构>>,它在本质上是一本清理代码的技术手册,包含了一步一步的说明和演示代码。
回到我个人的经验,我发现我在重写代码时坚持挑剔的纪律时,大脑正在慢慢形成"肌肉记忆(Muscle memory)", 已经开始自动在开发类之前思考类的大小了,而现在在清理现有代码时也可以做到了。
— Andrew Binstock
Editor in Chief
alb@drdobbs.com