具体的做法:

要把代码分割成细粒度的函数,然后给这些函数起一个恰当的名字,这是最简单最有效的做法。写代码的时候可以先写成一个函数,然后在过程中,不断地把「不相干的子问题」抽取出来,变成一个单独的函数。

做到极致的效果就是,每个函数,别人只要看到名字和参数列表,就能知道这个函数是干什么的,而且可以自己实现出来。这样一来,代码的复杂度显然就降了下来;读代码的时候,其实大部分时候都是在读函数调用,都是在了解算法的逻辑,而不是细节。

举个简单的例子:

SegmentFault 的投票功能,当用户点 Up 的时候就加一票,点 Down 就减一票;而如果用户已经 Down 了,那么点 Up 的时候要加两票;不好的代码是这样的:

vote_action = function (old_vote, new_vote) {
var score = get_score();
if (new_vote !== old_vote) {
if (new_vote === 'Up')
score += (old_vote === 'Down' ? 2 : 1);
else if (new_vote === 'Down') {
score -= (old_vote === 'Up' ? 2 : 1);
else if (new_vote === '')
score += (old_vote === 'Up' ? -1 : 1);
}
set_score(score);
};

好的代码是这样的:

vote_action = function (old_vote, new_vote) {
var vote_value = function (vote) {
if (vote === 'Up')
return +1;
else (vote === 'Down')
return -1;
else
return 0;
};
var score = get_score();
score -= vote_value(old_vote); // remove the old vote
score += vote_value(new_vote); // add the new vote
set_score(score);
};