zoukankan      html  css  js  c++  java
  • 一而再,再而三(二)

    之前有整理过一些关于代码重构的心得的文字: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);
    

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

  • 相关阅读:
    opensuse使用zypper安装软件
    补习系列(1)-springboot项目基础搭建课
    补习系列-springboot-使用assembly进行项目打包
    log4j2 使用纪要
    mongos-sharding连接池配置
    maven-代码风格检查工具
    mtools-你可能没用过的mongodb神器
    mongodb分布式集群搭建手记
    mongodb分片扩展架构
    mongodb副本集高可用架构
  • 原文地址:https://www.cnblogs.com/x3d/p/8996548.html
Copyright © 2011-2022 走看看