资讯专栏INFORMATION COLUMN

基于ES6的代码重构要点

kviccn / 659人阅读

摘要:访问原文地址对原本代码逻辑进行提炼,提高代码的阅读性。增强代码的和特性。再逻辑还不算太复杂的时候,早点修订一些规范。

访问原文地址

Why

对原本代码逻辑进行提炼,提高代码的阅读性。

增强代码的Object Oriented和Functional Programming特性。

再逻辑还不算太复杂的时候,早点修订一些Coding规范。

重构要点

Construct HTML using template strings.

Eliminate if/else blocks with hash maps.

Collapse multiple arguments with a config object.

Pre-bind arguments to make point-free functions.

Break complex conditionals with intention revealing .variables.

Inline IIFE for complex initialization.

Use hoisting/composed-method to focus on important code.

1.使用ES6的template string来替换不好用的html文本
var html = "
" + "
" + title + "
" + "" + "
"; //使用template直接就可以像些angular的模板一样在js代码中插入html let tmp_html = `
${title}
`;
2.用hash-map来替换复杂的if/else判断条件
function getSomething(type) {
    if (type === "boy") {
        return "/img/bog.jpg"
    } else if (type === "man") {
        return "/img/man.jpg"
    } else if (type === "girl") {
        return "/img/girl.jpg"
    } else (type === "woman") {
        return "/img/woman.jpg"
    }
}

//hash-map
function getSomething(type) {
    var typeMap = {
        boy: "/img/bog.jpg",
        man: "/img/man.jpg",
        girl: "/img/girl.jpg",
        woman: "/img/woman.jpg",
    }
    
    return typeMap[type] || "/img/default.jpg";
}

//当condition或者type条件很复杂的时候,可以把他们提取出来,以便维护
import typeMap from "./conditions";
3.减少函数入参,用Object来代替。
function formatNumber(value, decimals, asPercent, prefix, suffix) {
    var formattedNumber = value;
    
    //do something
    
    return formattedNumber;
}
formatNumber(10,2,false,"","%");

//利用ES6默认值特性,以及对象定义参数
function formatNumber({value=0, decimals=0, asPercent=false, prefix=‘’, suffix=‘’}){}
var num = 20;
formatNumber({value: num, suffix:"%"});
4.使用bind方法,将一个函数分离成多个更好理解的函数
function doOperation(name="default", args=[]) {
    // 这是一个通过name来决定操作方法的函数
}
function findSome() {
    return Promise.resolve("LS460h");
}
function getCarList() {
    return Promise.resolve({size:4800, seats:5, output:6.0});
}
findSome().then(args => {
    doOperation("searchCar", args);
});
getCarList().then(args => {
    doOperation("buyLexus", args);
});

//修改过程
//先通过bind函数,将操作方法从参数导入的方式分离成2个函数
var play = doOperation.bind(null, "searchCar");
var buy = doOperation.bind(null, "buyLexus");

findSome().then(play);
getCarList().then(buy);
5.使用array的some方法来重构条件判断语句
import _ from "lodash";
var age,
    gamer = [],
    adNetworks = [],
    specialAchievements = [];

function showGame() {
    /* do something */
}

if((age > 0 && age <0) || 
    gamer.isFirstTime ||
    _.some(adNetworks, function(n) {
        return gamer.network === n;
    }) ||
    _.some(specialAchievements, function(ach) {
        return gamer.specialAchievement = ach;
    })) {
    showGame();    
}

把conditions提炼成Array,并使用箭头函数

var conditions = [
    () => {
        return age > 0 && age <0;
    },
    () => gamer.isFirstTime,
    () => {
        return _.some(adNetworks, n => gamer.network === n);
    },
    () => {
        return _.some(specialAchievements, ach => gamer.specialAchievement === ach);
    },
    //加入新的条件,就变得很轻松
    () => specialAchievements.length > 0
];

let matches = _.some(conditions, c=>c());
if(matches) {
    showGame();    
}
6.使用IIFE(Immediately-Invoked Function Expression)做复杂初始化
var settings = readSettings();
var apiUrl = `https://${settings.apiDomain}:${settings.apiPort}/api`;

var defaultConfig = {
    apiUrl:apiUrl,
    timezone: settings.timezone,
    account: settings.account,
    theme: settings.theme
}

// IIFE 
var defaultConfig = (() => {
    var settings = readSettings();
    var apiUrl = `https://${settings.apiDomain}:${settings.apiPort}/api`;

    var defaultConfig = {
        apiUrl:apiUrl,
        timezone: settings.timezone,
        account: settings.account,
        theme: settings.theme
    }
})();
7.把回调的逻辑抽取成函数,隐藏逻辑,让代码语义更清晰。
_fetchData(url)
    .then(data => {
        //do something
    })
    .then(transactions => {
        //do something
    })

//after
import {processData, renderHtml} from "./doSomething"
_fetchData(url)
    .then(processData)
    .then(renderHtml);

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80876.html

相关文章

  • 【译】前端练级攻略

    摘要:由于系统变得越来越复杂,人们提出了称为预处理器和后处理器的工具来管理复杂性。后处理器在由预处理器手写或编译后对应用更改。我之前建议的文章,,也涵盖了预处理器相关的知识。 译者:前端小智 原文:medium.freecodecamp.org/from-zero-t… medium.freecodecamp.org/from-zero-t… 我记得我刚开始学习前端开发的时候。我看到了很多文章及...

    wuyumin 评论0 收藏0
  • 如何用微服务重构应用程序

    摘要:以下两个要点将会对任何微服务重构策略产生重大影响。批量替换通过批发更换,您可以一次性重构整个应用程序,直接从单体式转移到一组微服务器。如果您通过使用破解您的微服务器,那么每个域将围绕一个用例,或者更常见的,一组相互关联的用例。 在决定使用微服务之后,为了将微服务付诸实践,也许你已经开始重构你的应用程序或把重构工作列入了待办事项清单。 无论是哪种情况,如果这是你第一次重构应用程序,那么您...

    KevinYan 评论0 收藏0
  • 记一次前端项目重构要点总结

    摘要:重构总共耗时个工作日。第一个重构原因就是没有引入静态类型,导致查看一个对象结构需要翻来覆去在多个文件中查找。第三是各个状态模块耦合度高,加大了代码维护难度。但如果耦合度过高,往往是因为模块没有细分到位。这个项目也不列外。 showImg(https://segmentfault.com/img/remote/1460000019660483); 不知不觉已是2019年的7月,恍惚之间已...

    frolc 评论0 收藏0
  • 重学前端学习笔记(七)--JavaScript对象:面向对象还是基于对象?

    摘要:对象有状态对象具有状态,同一对象可能处于不同状态之下。中对象独有的特色对象具有高度的动态性,这是因为赋予了使用者在运行时为对象添改状态和行为的能力。小结由于的对象设计跟目前主流基于类的面向对象差异非常大,导致有不是面向对象这样的说法。 笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些...

    mayaohua 评论0 收藏0

发表评论

0条评论

kviccn

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<