《编写可维护的JavaScript》读书笔记之编程实践-将配置数

2019-01-08  本文已影响8人  游学者灬墨槿

将配置数据从代码中分离出来

任何时候修改源代码都会有引入 bug 的风险,且只修改一些数据的值也会带来一些不必要的风险。精心设计的应用应当将关键数据从主要的源码中抽离出来,因为数据是不应当影响指令的正常运行。

什么是配置数据

配置数据是应用中写死(hardcoded)的值。

// 将配置数据埋藏在代码中
function validate(value) {
    if(!value) {
        alert("Invalid value");
        location.href = "/errors/invalid.php";
    }
}

function toggleSelected(element) {
    if(hasClass(element, "selected")) {
        removeClass(element, "selected");
    } else {
        addClass(element, "selected");
    }
}

抽离配置数据

将配置数据从代码中抽离出来的第一步是将配置数据拿到外面,即将数据从 JavaScript 代码之中拿掉。

// 将配置数据抽离出来
var config = {
    MSG_INVALID_VALUE : "Invalid value",
    URL_INVALID : "/errors/invalid.php",
    CSS_SELECTED : "selected"
};

function validate(value) {
    if(!value) {
        alert(config.MSG_INVALID_VALUE);
        location.href = config.URL_INVALID;
    }
}

function toggleSelected(element) {
    if(hasClass(element, config.CSS_SELECTED)) {
        removeClass(element, config.CSS_SELECTED);
    } else {
        addClass(element, config.CSS_SELECTED);
    }
}

保存配置数据

配置数据最好放在单独的文件中,以便清晰地分隔数据和应用逻辑。

作者推荐使用非 JavaScript 文件形式来存储配置数据。

【理由】:不需要遵照 JavaScript 语言的语法来阻止配置数据,这样可确保不会出语法错误。如果你将多个 JavaScript 文件合并成一个,一个语法错误就会导致整个应用程序崩溃。

【观点】:将文件中的配置数据正确格式化是很麻烦的一件事,当你拿到这样一个文件时,你会觉得将配置数据自动转换为 JavaScript 格式是无足轻重的一件事。

【我的理解】:起初看到作者说 JavaScript 配置数据很麻烦,且容易出语法错误时不是很理解。采用对象字面量的书写方式也不会出语法错误,而且书写也不麻烦,但继续往下阅读到“拿到这样一个文件时”这句话时,有些明白作者的意思了。比如说业务或设计直接丢给你一个 EXCEL 文件,一列 key,一列 value,如果要按照 JSON 的写法,我必须给每个 key 加一对引号,然后在其后面加一个冒号,再给 value 加一对引号,最后在 value 的右引号后加一个逗号。作者推荐使用 Java 属性文件(Java properties file)来存放配置数据,形式如下:

MSG_INVALID_VALUE = Invalid value
URL_INVALID = /errors/invalid.php
CSS_SELECTED = selected

此时,我只需要先将 key 列全部复制粘贴,让其各占一行,然后在每行后面加个等号,再复制 value 列,让其与相匹配的 key 对应。

接下去的步骤是将该 Java 属性文件转换为 JavaScript 可用的文件。

{
    "MSG_INVALID_VALUE": "Invalid value",
    ...
}
{
    myfunc({
        "MSG_INVALID_VALUE": "Invalid value",
        ...
    });
}
var config = {
    MSG_INVALID_VALUE: "Invalid value",
    ...
}

本书的作者创建了一个工具 Props2Js,用以读取 Java 属性文件并给出以上三种格式的输出。

Props2Js

java -jar props2js-0.1.0.jar --to jsonp --name myfunc 
--output result.js source.properties
上一篇下一篇

猜你喜欢

热点阅读