复合功能就是代码坏味

这句话要反复重复给自己听。
今天在看java的官方文档的时候看到了这么一个例子:


List suits = ...;
List ranks = ...;
List sortedDeck = new ArrayList();

// BROKEN - throws NoSuchElementException!
for (Iterator i = suits.iterator(); i.hasNext(); )
    for (Iterator j = ranks.iterator(); j.hasNext(); )
        sortedDeck.add(new Card(i.next(), j.next()));

文档中举这个例子是为了推广foreach语句的使用。但在我看来,之所以容易产生这样的错误,原因是java的iterator的方法不够内聚。

为什么要用iterator.next()返回iterator指向的值?

这让我想起了C++的STL中一系列关于堆栈的操作。获取栈顶的方法是back()或front(),出栈的方法是pop_front()或pop_back()。是这样做,而不是令pop_back()直接返回栈顶值同时弹出。这就保证了函数方法的绝对内聚。从而避免了如同前例那样的潜在错误。

永远保证自己的函数功能单一,没有副作用。不要用小技巧去让一个函数多功能化。有时候潜在的错误远远不是一眼能看得出来的。