一而再,再而三(二)

之前有整理过一些关于代码重构的心得的文字:http://www.cnblogs.com/x3d/p/5797606.html , 其中主要想表达的意思是要做好一件事,需要这样一而再、再而三的过程才行。

重构有整体和局部两种情况,前次是讲整体,这次主要讲局部。

局部的重构,主要针对小范围的代码,可能是一个类、一个方法/函数,甚至只是函数中的一段代码。局部的重构,往往具备更高的可操作性,大家在编程实践过程中,也更有可能会意识到这点。

这里先摘取一段业务代码:

    if (code >= 16 && code <= 30) {
        termCode = '30d'
    }
........
    if (code >= 331 && code <= 365) {
        termCode = '365d'
    }

大致可以看出来这是关于根据时间范围构造最终条件的判断逻辑,分了12个区间。

这样的代码,在一个经过比较专业训练的程序员看来,肯定是会觉得不行的,语句明显不够精炼,而且逻辑上有漏洞。

首先他确实完成了这个逻辑,是能够交差了的。但过不了谁那一关?

我们知道一个目标,不要重复你自己,代码应该越写越少。越写越少,有两种解读:一是经过不断的代码库积累,可重用代码越来越多,需要从头写的代码是越来越少的;二是实现同一个功能所需的代码应该越来越简练、行数越来越少。

先按第二种解读,这段代码本身看看有没有可以缩短的可能,答案是肯定有!

将逻辑提炼为数据结构,减少字面量,就接近真相了,比如像下面这样改写(代码仅供演示,未执行测试):

    const dayRanges = [15, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330, 365];
    if (code < dayRanges[0] || code > dayRanges[dayRanges.length - 1]) {
        throw new Error('请选择正确的时间范围' );
    }
    for (let i = 0; i < dayRanges.length; i++) {
        if ((code >= (dayRanges[i] + 1)) && (code <= dayRanges[i + 1])) {
            termCode = dayRanges[i + 1] + 'd';
            break;
        }
    }

再按第一种解读,就是要注重代码的积累和重用,对这段代码进行封装,让它尽量可以被重复使用,这样总体代码量肯定是变少的,而且可以预期的维护工作量变小。

exports.termCode = function(dayRanges, code) {
    if (code < dayRanges[0] || code > dayRanges[dayRanges.length - 1]) {
        throw new Error('请选择正确的时间范围' );
    }
    for (let i = 0; i < dayRanges.length; i++) {
        if ((code >= (dayRanges[i] + 1)) && (code <= dayRanges[i + 1])) {
            termCode = dayRanges[i + 1] + 'd';
            break;
        }
    }
};
module.exports = exports;
const lib = require('./lib');

const dayRanges = [15, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330, 365];
const code = 28;
const termCode = lib. termCode(dayRanges, code);

通过反复的主动的练习、实践,把最单调的日常开发工作变得让自己更有使命感、成就感。

posted @ 2018-05-05 22:38 x3d 阅读(...) 评论(...) 编辑 收藏