摘要:上一個(gè)版本的問(wèn)題接這篇文章,聊聊參數(shù)檢查工具的完善。最終實(shí)現(xiàn)了這樣的效果檢查是否在區(qū)間與的交集內(nèi)檢查是否在區(qū)間與的并集內(nèi)檢查是否是數(shù)組并且長(zhǎng)度大于檢查是否不是之間的偶數(shù)即
上一個(gè)版本的問(wèn)題
接這篇文章,聊聊參數(shù)檢查工具 param-check 的完善。
按照之前的接口設(shè)計(jì),鏈?zhǔn)秸{(diào)用表示“與”,參數(shù)表表示“或”,自然產(chǎn)生了一個(gè)問(wèn)題——如果我要表達(dá)“(A與B)或(C與D)”這樣的邏輯組合應(yīng)該怎么辦?
以及,由于 not 調(diào)用只對(duì)它后面的第一個(gè)調(diào)用生效,那么如果我要實(shí)現(xiàn)“非(A與B)”,該怎么辦?
總結(jié)起來(lái),實(shí)際上就是給邏輯表達(dá)式加括號(hào)的問(wèn)題。
or 和 and 方法為了自由表達(dá)與或關(guān)系,我們需要擴(kuò)展一下規(guī)則。分析可知,函數(shù)調(diào)用的參數(shù)表是一個(gè)天然的括號(hào),所以只用來(lái)表達(dá)“或”太奢侈了。我們添加方法 or 和 and,使之能表達(dá)與和或。但是這里有個(gè)問(wèn)題,param-check 目前的接口都是即時(shí)計(jì)算的,如果你把調(diào)用串當(dāng)做參數(shù)傳遞,沒(méi)有傳進(jìn)去之前已經(jīng)計(jì)算完了,異常捕獲不到,沒(méi)法實(shí)現(xiàn)邏輯關(guān)系。比如:
check(a).or(check(a).gt(1).lt(3), check(a).gt(2).lt(4));
上面的代碼是沒(méi)法實(shí)現(xiàn) or 的。
解決方法比較容易想到的有兩個(gè):
改變接口模式,不再拋出異常,二是返回 false。這樣 or 和 and 就很容易實(shí)現(xiàn)了,但是鏈?zhǔn)秸{(diào)用就沒(méi)法實(shí)現(xiàn)了。
提取 check 的調(diào)用路徑,使得一個(gè)檢查過(guò)程能保存在一個(gè)對(duì)象(高階函數(shù))里,當(dāng)做參數(shù)傳到其它函數(shù)中,本質(zhì)上這是一種函數(shù)式編程方法。如果不考慮到書(shū)寫(xiě)方便,這是很容易實(shí)現(xiàn)的:
function myCheck(a) { check(a).gt(1).lt(3); } function myCheck2(a) { check(a).is("string"); } +function (a) { check(a).or(myCheck, myCheck2); }(2);“使用鏈?zhǔn)秸{(diào)用記錄鏈?zhǔn)秸{(diào)用路徑”
顯然上面的寫(xiě)法非常不方便,所以我實(shí)現(xiàn)了一種更好用的接口,使用同樣的鏈?zhǔn)秸{(diào)用方式,實(shí)現(xiàn)調(diào)用路徑提取和參數(shù)緩存。具體的實(shí)現(xiàn)方式在這篇文章里。最終實(shí)現(xiàn)了這樣的效果:
// 檢查 param 是否在區(qū)間(1,3) 與 (2,4) 的交集內(nèi) check(param, "param").and(check.policy.gt(1).lt(3), check.policy.gt(2).lt(4)); // 檢查 param 是否在區(qū)間(1,2) 與 (3,4) 的并集內(nèi) check(param, "param").or(check.policy.gt(1).lt(2), check.policy.gt(3).lt(4)); function myCheck(obj) { return obj.length > 4; } // 檢查 param 是否是數(shù)組并且長(zhǎng)度大于 4 check(param, "param").and(check.policy.is("array"), myCheck); // 檢查 param 是否*不是*[1,3]之間的偶數(shù)(即2) check(param, "param").not.and( check.policy.is("number").not.lt(1).not.gt(3), function (obj) { return obj % 2 === 0; });
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/86403.html
摘要:本文嘗試編寫(xiě)一種參數(shù)檢查工具,期待能緩解類(lèi)似問(wèn)題。為了實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用,返回的是一個(gè)特殊的包裝對(duì)象。如果要打印出檢查失敗的參數(shù)名,需要寫(xiě)成。由于德摩根定律的存在,后的參數(shù)表實(shí)際上在表達(dá)與的關(guān)系,比如表示的是參數(shù)既不為也不為。 綜述 javascript 屬于弱類(lèi)型語(yǔ)言,參數(shù)的類(lèi)型錯(cuò)誤只能在運(yùn)行期發(fā)現(xiàn)。當(dāng)你需要 expose 非常健壯的接口給外部,或者在調(diào)試較大項(xiàng)目的時(shí)候,你可能會(huì)懷念強(qiáng)類(lèi)型...
摘要:但好在還給我們提供了一個(gè)方法,每一個(gè)對(duì)象都有這樣一個(gè)方法,專(zhuān)門(mén)用來(lái)判斷某個(gè)屬性是否是該對(duì)象的私有屬性。如果你想要用對(duì)象字面形式,你只能在創(chuàng)建對(duì)象時(shí)定義訪問(wèn)器屬性。在中,我們使用凍結(jié)一個(gè)對(duì)象,并且使用來(lái)判斷一個(gè)對(duì)象是否被凍結(jié)。 說(shuō)完了對(duì)象那些不常用的冷知識(shí),是時(shí)候來(lái)看看JavaScript中對(duì)象屬性有哪些有意思的東西了。 不出你所料,對(duì)象屬性自然也有其相應(yīng)的特征屬性,但是這個(gè)話題有點(diǎn)復(fù)雜...
摘要:從而輔助整個(gè)團(tuán)隊(duì)提高代碼質(zhì)量統(tǒng)一代碼規(guī)范。如果你的團(tuán)隊(duì)還沒(méi)有這么一份代碼評(píng)審清單,也許這正是你需要的如果你的團(tuán)隊(duì)已經(jīng)有了代碼評(píng)審參照標(biāo)準(zhǔn),這份清單也許能起到錦上添花的效果。如果違反這個(gè)規(guī)則,那么代碼會(huì)很難被測(cè)試或者重用。 前言 ? 前端團(tuán)隊(duì)有評(píng)審代碼的要求,但由于每個(gè)開(kāi)發(fā)人員的水平不同,技術(shù)關(guān)注點(diǎn)不同,所以對(duì)代碼評(píng)審的關(guān)注點(diǎn)不同,為了保證代碼質(zhì)量,團(tuán)隊(duì)代碼風(fēng)格統(tǒng)一,特此擬定...
摘要:而測(cè)試驅(qū)動(dòng)開(kāi)發(fā)技術(shù)并不只是單純的測(cè)試工作。需求向來(lái)就是軟件開(kāi)發(fā)過(guò)程中感覺(jué)最不好明確描述易變的東西。這里說(shuō)的需求不只是指用戶的需求,還包括對(duì)代碼 可能很多人和我一樣, 首次聽(tīng)到前端架構(gòu)這個(gè)詞, 第一反應(yīng)是: 前端還有架構(gòu)這一說(shuō)呢? 在后端開(kāi)發(fā)領(lǐng)域, 系統(tǒng)規(guī)劃和可擴(kuò)展性非常關(guān)鍵, 因此架構(gòu)師備受重視, 早在開(kāi)發(fā)工作啟動(dòng)之前, 他們就被邀請(qǐng)加入到項(xiàng)目中, 而且他們會(huì)跟客戶討論即將建成的平臺(tái)的...
閱讀 946·2023-04-25 21:21
閱讀 3286·2021-11-24 09:39
閱讀 3136·2021-09-02 15:41
閱讀 2087·2021-08-26 14:13
閱讀 1890·2019-08-30 11:18
閱讀 2886·2019-08-29 16:25
閱讀 579·2019-08-28 18:27
閱讀 1655·2019-08-28 18:17