最好實踐

什麼是重構?

字面上的明白: 重新組織構造

為何要重構?

本來的構造是什麼模樣的?有什麼題目?
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));
}
    原文作者:有李
    原文地址: https://segmentfault.com/a/1190000014920021
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞