第09章 將配置數(shù)據(jù)從代碼中分離出來(lái)
任何時(shí)候修改源代碼都會(huì)有引入 bug 的風(fēng)險(xiǎn),即使是只修改一些數(shù)據(jù)的值也會(huì)帶來(lái)一些不必要的風(fēng)險(xiǎn)。數(shù)據(jù)不應(yīng)該影響代碼的正常運(yùn)行。精心設(shè)計(jì)的應(yīng)用應(yīng)當(dāng)將關(guān)鍵數(shù)據(jù)從主要的源碼中抽離出來(lái),這樣我們修改數(shù)據(jù)時(shí)才更加放心。
9.1 什么是配置數(shù)據(jù)
// 不好的寫(xiě)法 將配置數(shù)據(jù)埋藏在代碼里
function validata(value) {
if (!value) {
alert("Invalid value");
location.href = "/error/invalid.php";
}
}
function toggleSelected(element) {
if (hasClass(element, "selected")) {
removeClass(element, "selected");
} else {
addClass(element, "selected");
}
}
這段代碼中有三個(gè)配置數(shù)據(jù)片段。第一個(gè)是字符串“Invalid value”(非法的值),這個(gè)是用來(lái)給用戶(hù)提示的。因?yàn)檫@個(gè)字符串可以被用戶(hù)接觸到,所有它可能會(huì)被很頻繁地修改。第二個(gè)是 URL “/error/invalid.php”。在開(kāi)發(fā)過(guò)程中,當(dāng)架構(gòu)變更時(shí)則很可能頻繁修改URL。第三個(gè)是CSS的className “selected”。有三處都用到這個(gè)className,這也就意味著想要修改這個(gè)className則必須修改三處,很可能不小心丟掉了某處修改。
下面給出了一些配置數(shù)據(jù)的例子:
- URL
- 需要展現(xiàn)給用戶(hù)的字符串
- 重復(fù)的值
- 設(shè)置(比如每頁(yè)的配置項(xiàng))。
- 任何可能發(fā)生變更的值。
我們時(shí)刻要記住,配置數(shù)據(jù)時(shí)可發(fā)生變更的,而且你不希望因?yàn)橛腥送蝗幌胄薷捻?yè)面中的展示信息,而導(dǎo)致你去修改JavaScript源碼。
9.2 抽離配置數(shù)據(jù)
將配置數(shù)據(jù)從代碼中抽離的第一步就是將配置數(shù)據(jù)拿到外部,即將數(shù)據(jù)從JavaScript代碼中拿掉:
// 好的寫(xiě)法 將配置數(shù)據(jù)抽離出來(lái)
var config = {
MSG_INVALID_VALUE: "invalid value",
URL_INVALID: "/error/invalid.php",
CSS_SELECTED: "selected"
};
function validata(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);
}
}
這段代碼中,我們將配置數(shù)據(jù)保存在了 config 對(duì)象中。config 對(duì)象的每個(gè)屬性都保存了一個(gè)數(shù)據(jù)片段,每個(gè)屬性名都有前綴,用以表明數(shù)據(jù)的類(lèi)型(MSG 表示展示給用戶(hù)的信息,URL 表示網(wǎng)絡(luò)地址,CSS 表示一個(gè)className)。當(dāng)然,命名約定是個(gè)人偏好。
將配置數(shù)據(jù)抽離出來(lái)意味著任何人都可以修改它們,而不會(huì)導(dǎo)致應(yīng)用邏輯出錯(cuò)。同樣,我們可以將整個(gè) config 對(duì)象放到單獨(dú)的文件中, 整個(gè)對(duì)配置數(shù)據(jù)的修改可以完全和使用這些數(shù)據(jù)的代碼隔離開(kāi)來(lái)。
9.3 保存配置數(shù)據(jù)
現(xiàn)在流行的做法就是將配置文件存放到j(luò)son格式的文件中。