什么是重构?
字面上的理解: 重新组织结构
为什么要重构?
原来的结构是什么样子的?有什么问题?
1. 函数逻辑结构[条件判断、循环操作]: 包含关系、集合关系、非关系...
2. 可扩展性差,新的变化不能被灵活处理
3. 对象强耦合
4. 可复用性差, 重复代码多
5. 性能消耗太多
6. 随着技术发展, 新的好特性
如何重构?
知道问题是什么, 针对问题进行重构

可扩展性差,新的变化不能被灵活处理 eg

let checkType = function(str, type) {
    switch (type) {
        case 'email':
            return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);
        case 'mobile':
            return /^1[3|4|5|7|8][0-9]{9}$/.test(str);
        case 'tel':
            return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);           
        case 'number':
            return /^[0-9]$/.test(str);
        case 'english':
            return /^[a-zA-Z]+$/.test(str);
        case 'text':
            return /^\w+$/.test(str);
        case 'chinese':
            return /^[\u4E00-\u9FA5]+$/.test(str);
        case 'lower':
            return /^[a-z]+$/.test(str);
        case 'upper':
            return /^[A-Z]+$/.test(str);
        default:
            return true;
    }
}

违反开放 - 封闭原则[对扩展开放, 对修改封闭]
策略模式: 把一系列算法进行封装,使算法代码和逻辑代码相互独立
函数单一原则

let checkType = (function() {
    let rules = {
        email (str) {
            return //.test(str);
        }
        ...
    };
    
    return {
        check (str, type) {
            return rules[type]? rules[type]() : false;
        }
        addRule (type, fn) {
            rules[type] = fn;
        }
    }
})();

可扩展性的表现形式

对原生对象、库、框架的扩展

1. prototype

2. jquery的扩展性
   三个API:$.extend()、$.fn和$.fn.extend()

3. vue扩展
添加全局方法或属性
添加全局资源: 过滤器、指令、过渡
通过全局mixin添加一些组件选项
添加vue实例方法
基于vue的扩展[ 在组件或插件 install]

日常开发中

函数写法优化

function formatStr (str) {
    return str.replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, '$1-$2-$3 $4:$5:$6');
}

function formatStr(str, type) {
    let i = 0;
    let _type = type || 'xxxx-xx-xx xx:xx:xx';
    return _type.replace(/x/g, () => str[i++]);
}
function createPhoneNumber(numbers){
    var format = "(xxx) xxx-xxxx";
    let i = 0;
    return format.replace(/x/g, () => numbers[i++]);
}

who like it?

// 模版字符串 or 手动拼写
function likes(names) {
    let template = [
        'no one likes this',
        '{name} likes this',
        '{name} and {name} likes this',
        '{name}, {name} and {name} likes this',
        '{name}, {name} and {n} others likes this'
    ];
    let idx = Math.min(names.length, 4);
    
    template[idx].replace(/{name}|{n}/g, (value) => {
        return value === '{name}' ? names[idx++]: names.length;
    });
    
}

shortest word?

// apply | call
function findShortest (s) {
    return Math.min.apply(null, s.split(' ').map((val) => val.length));
}

有李
108 声望12 粉丝

通过注意生活中细节性的风景