国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[探索]怎么樣的參數(shù)能讓 JS - API 更靈活

Integ / 812人閱讀

摘要:所以參數(shù)多多少少影響了的一個(gè)靈活程度和使用復(fù)雜程度。如果多個(gè)參數(shù),使用能更方便,靈活,簡單。是否使用對(duì)象作為參數(shù),判斷的指標(biāo)應(yīng)該只有一個(gè)是否方便使用,靈活。即使這樣可能違法了單一指責(zé)原則,但是呼應(yīng)了最少知識(shí)原則。

外在決定是否需要了解內(nèi)在,內(nèi)在決定是否會(huì)一票否決外在。內(nèi)外結(jié)合,好上加好。
1.前言

開發(fā) API 的時(shí)候,把參數(shù)的名字和位置確定下來,函數(shù)定義就可以說是完成了。因?yàn)?API 使用者來說,只需要知道如何傳遞參數(shù),以及函數(shù)將返回什么樣的值就夠了,無需了解內(nèi)部。所以參數(shù)多多少少影響了 API 的一個(gè)靈活程度和使用復(fù)雜程度。在設(shè)計(jì) API 的時(shí)候,應(yīng)該怎么設(shè)計(jì)參數(shù),下面就簡單的寫下,如果大家有不同的想法,歡迎在評(píng)論區(qū)留言。

下面使用的例子,除了原生了 JQuery 的 API。其他的例子都是取自自己封裝的一個(gè)常用函數(shù)庫 ecDo 。歡迎提建議和 star。
2.什么時(shí)候該設(shè)置參數(shù)

其實(shí)什么時(shí)候設(shè)置參數(shù)并沒什么什么說法,規(guī)范。只要覺得用參數(shù)會(huì)使得 API 的使用會(huì)更加的簡單和靈活就用了。

設(shè)置參數(shù),可能一開始不會(huì)有很好的靈感,但是在使用過程中,用得難受了,自然會(huì)像辦法優(yōu)化。

比如 有 ecDo.count(array|string,item) 這個(gè) API 就是統(tǒng)計(jì)一個(gè)數(shù)組的每個(gè)元素的出現(xiàn)次數(shù)或者字符串每一個(gè)字符的個(gè)數(shù)。

這很容易實(shí)現(xiàn),代碼也貼下

count(arr) {
    let obj = {}, k, arr1 = []
    //記錄每一元素出現(xiàn)的次數(shù)
    for (let i = 0, len = arr.length; i < len; i++) {
        k = arr[i];
        if (obj[k]) {
            obj[k]++;
        } else {
            obj[k] = 1;
        }
    }
    //保存結(jié)果{el-"元素",count-出現(xiàn)次數(shù)}
    for (let o in obj) {
        arr1.push({el: o, count: obj[o]});
    }
    return arr1;
},



let strTest1="abbccc"
console.log(ecDo.count(strTest1));
//result:[{el: "a", count: 1},{el: "b", count: 2},el: "c", count: 3}]

但是有些時(shí)候,開發(fā)者并不需要知道所有元素的個(gè)數(shù),比如就需要知道 "a" 的出現(xiàn)次數(shù),這個(gè)情況直接返回 "a" 的個(gè)數(shù)就行了,不需要像上面例子一樣,返回一個(gè)數(shù)組。這樣用起來會(huì)舒服一些,改起來也很簡單,只要增加一個(gè)參數(shù),一個(gè)判斷即可。

count(arr,item) {
    //重復(fù)代碼略
    return item?obj[item]:arr1;
},



let strTest1="abbccc"
console.log(ecDo.count(strTest1),"a");
//result:1

還有一個(gè)常用的 API 是ecDo.clearKeys(obj)--清除對(duì)象中值為‘空’(null, undefined和"")的屬性。

這個(gè)也很容易實(shí)現(xiàn),

clearKeys(obj) {
    let _newPar = {};
    for (let key in obj) {
        if (obj[key]===0||obj[key]===false||obj[key]) {
            _newPar[key] = obj[key];
        }
    }
    return _newPar;
},


ecDo.clearKeys({1:0,2:2,3:""})
//result:{1: 0, 2: 2}

想必大家也發(fā)現(xiàn)這樣寫法太不靈活了,如果下次要把 0false 的屬性也清空呢?如果下次要把值為 "--" 的屬性也清空呢?這樣就做不到了,所以還要改一下,增加一個(gè)參數(shù) clearValues - 待清空的值。

要使用的一個(gè)函數(shù)

clearKeys(obj, clearValues = [null, undefined, ""]) {
    clearValues.forEach((item, index) => {
        clearValues[index] = Number.isNaN(item) ? "NaN" : item
    });
    let _newPar = {};
    for (let key in obj) {
        //checkValue 看下面定義
        if (!checkValue(obj[key], clearValues)) {
            _newPar[key] = obj[key];
        }
    }
    return _newPar;
},


ecDo.clearKeys({a:"",b:0,c:11})
//result:{b: 0,c: 11}
ecDo.clearKeys({a:"",b:0,c:"--"},["--",""])
//result:{b: 0}
ecDo.clearKeys({a:"",b:0,c:11,d:false},[0,""])
//result:{c: 11,d: false}
ecDo.clearKeys({a:NaN,b:2,c:undefined},[NaN,undefined])
//result:{b: 2}

checkValue 函數(shù)

function checkValue(val, vals) {
    let _val = val;
    if (Number.isNaN(val)) {
        _val = "NaN"
    }
    return vals.indexOf(_val) !== -1;
}

這樣以來,想清除任何值的屬性,這里都可以實(shí)現(xiàn)。

3.參數(shù)數(shù)量和前置

這兩個(gè)注意點(diǎn)可以說是平常接觸最頻繁的,也是最無可辯解的。

首先參數(shù)的數(shù)量,在不影響 API 使用的情況下肯定是能少就少,越少越好。因?yàn)閰?shù)的越少,API 的記憶成本越低,調(diào)用也更加便利。

參數(shù)能少就少,越少越好,是有前提的--不影響 API 的使用。如果多個(gè)參數(shù), API 使用能更方便,靈活,簡單。多個(gè)參數(shù)就多個(gè)參。

然后參數(shù)的前置性,就是參數(shù)相關(guān)性越高,越不能省略的,就越要放在前面。雖然可以把可省略參數(shù)放后面,但是這樣問題可能會(huì)很多。

4.使用對(duì)象作為參數(shù)

什么時(shí)候該使用對(duì)象作為函數(shù)的參數(shù),暫時(shí)發(fā)現(xiàn)是兩種情況。

1.參數(shù)過多的時(shí)候

2.參數(shù)不固定的時(shí)候

比如 ajax 的參數(shù),至少至少也有 5 個(gè)。url-請(qǐng)求鏈接,method-請(qǐng)求方式,data-請(qǐng)求參數(shù),success-成功回調(diào),fail-失敗回調(diào)。如果不使用對(duì)象作為參數(shù),完整的寫法,是下面這樣

ajax(url,method,data,success,fail)

但這5個(gè)參數(shù)里面,除了 url ,其他參數(shù)都可以省略或者默認(rèn)。如果只需要傳 url 和 success,需要像下面這樣寫

ajax(url,"","",success)

因?yàn)閰?shù)的順序不能亂,所以就要這樣寫。這樣多難受就不說了,如果參數(shù)過多,參數(shù)看著會(huì)很長,容易搞錯(cuò)參數(shù)順序,就會(huì)出現(xiàn)問題了。

如果使用對(duì)象傳參,就舒服很多了。

ajax({url:url,success:function(){}})

這樣寫的會(huì)多一點(diǎn),但是好處也有。首先用戶還是需要記住參數(shù)名,但不用關(guān)心參數(shù)順序,不用擔(dān)心參數(shù)過多。然后就是開發(fā)者想增加多少參數(shù)都比較方便,也不用關(guān)心參數(shù)后置的問題。

是否使用對(duì)象作為參數(shù),判斷的指標(biāo)應(yīng)該只有一個(gè):是否方便使用,靈活。
5.參數(shù)默認(rèn)值

什么時(shí)候應(yīng)該設(shè)計(jì)默認(rèn)值?也分幾種情況討論

首先是,一個(gè)參數(shù)值出現(xiàn)頻率比其他情況大的時(shí)候。比如有一個(gè) ecDo.encrypt(str,regIndex,repText) 的 API,作用很簡單,就是對(duì)字符串的特定位置進(jìn)行加密。比如經(jīng)常會(huì)遇到隱藏用戶的手機(jī)號(hào)碼的需求。

電話號(hào)碼隨便編造的
ecDo.encrypt("18819233362","3,7")
//result:188*****362

ecDo.encrypt("18819233362","3,7","+")
//result:188+++++362

ecDo.encrypt("18819233362","4")
//result:*****233362

ecDo.encrypt("18819233362","-4")
//result:188192*****

在這個(gè) API 里面 ,第三個(gè)參數(shù) repText 可能大多數(shù)情況都是使用 。如果不對(duì) repText 設(shè)置默認(rèn)值,如果每一次都傳一個(gè) ,不但寫的多,看得也難受。

還有一種情況,從特定位置執(zhí)行到結(jié)尾結(jié)束的時(shí)候。比如原生的 substr(start,length) ,第一個(gè)參數(shù)是開始字符的下標(biāo),第二個(gè)參數(shù)是截取的長度。如果省略,就從開始位置截取到結(jié)尾。這樣就算是一種方便。

5.參數(shù)多態(tài)
這里說的參數(shù)多態(tài)跟繼承方面的多態(tài)有點(diǎn)區(qū)別

參數(shù)多態(tài)這個(gè)很常見,目的很簡單,就是通過不同的傳參方式讓一個(gè)函數(shù)進(jìn)行不同的操作??吹竭@里,可能大家一下子就想到 splice。因?yàn)橐粋€(gè) splice 可以實(shí)現(xiàn)數(shù)組的增加,刪除,替換

//刪除
let arr=[1,2,3,4,5,6]
arr.splice(0,1)
//result:arr:[2, 3, 4, 5, 6]

//替換
arr=[1,2,3,4,5,6]
arr.splice(2,1,0)
//result:arr:[1, 2, 0, 4, 5, 6]

//增加
arr=[1,2,3,4,5,6]
arr.splice(2,0,0)
//result:arr:[1, 2, 0, 3, 4, 5, 6]

但是 splice 應(yīng)該并不算是參數(shù)多態(tài),只能算是一些技巧的一個(gè)寫法。

表現(xiàn)出參數(shù)多態(tài)的,比如 JQuery 的 attr 。既可以獲取屬性的值,也可以設(shè)置屬性的值。

//獲取 dom 元素 id 的值
$(dom).attr("id")
//設(shè)置 dom 元素 id 的值
$(dom).attr("id","domId")

JQuery 把多態(tài)表現(xiàn)得更好的應(yīng)該是 $() 。JQuery 火的原因,跟這個(gè) $() 有很大的關(guān)系,只要是合法的選擇器,頁面存在這個(gè)元素,就能找到。讓選擇元素變得非常簡單。

關(guān)于 $() 的強(qiáng)大特性,可參考 jQuery 選擇器

在自己封裝 API 的時(shí)候,也會(huì)遇到操作 cookie 的一系列操作(設(shè)置,獲取,刪除)。之前是這樣

ecDo.setCookie(cookieName,value,day)//設(shè)置(cookie名稱,cookie值,有效的天數(shù))
ecDo.getCookie(cookieName)//獲取
ecDo.removeCookie(cookieName)//刪除

現(xiàn)在是這樣

ecDo.cookie(cookieName,value,day)//設(shè)置(cookie名稱,cookie值,有效的天數(shù))
ecDo.cookie(cookieName)//獲取
ecDo.cookie(cookieName,value,-1)//刪除

這樣使用起來,就比之前簡單一點(diǎn),相當(dāng)于只是記住一個(gè) API 就可以了。

參數(shù)的多態(tài),就是讓 API 的指責(zé)會(huì)根據(jù)參數(shù)的情況進(jìn)行改變。相當(dāng)于把相似職責(zé)的 API 給合并成一個(gè)。不需要給用戶提供出太多 API,方便用戶的使用。即使這樣可能違法了單一指責(zé)原則,但是呼應(yīng)了最少知識(shí)原則。能讓 API 的使用盡可能簡單化了。

5-1.什么時(shí)候不該設(shè)置參數(shù)多態(tài)

參數(shù)多態(tài)就是把相似職責(zé)的 API 給合并成一個(gè)。但是有時(shí)候并不適合使用。更適合把合并的 API 拆分成幾個(gè)。

比如之前封裝常用 API 的時(shí)候。有一個(gè)去除字符串空格的 API : ecDo.trim(str,type) (str-待處理的字符串,type-去除空格的類型----1-左右空格,2-所有空格,3-左空格,4-右空格) 。

使用形式

ecDo 是我封裝的一個(gè)常用函數(shù)庫。
let str=" 守 候 ";
console.log(ecDo.trim(str,1));//"守 候"
console.log(ecDo.trim(str,2));//"守候"
console.log(ecDo.trim(str,3));//"守候 "
console.log(ecDo.trim(str,4));//" 守候"

這樣使用的話,想必大家都看到問題了。1 2 3 4 是什么鬼?就算知道是什么鬼,也要把這幾個(gè)鬼記住。記憶成本大,調(diào)用也不方便。后來就拆分成四個(gè)函數(shù)了。

let str=" 守 候 ";
console.log(ecDo.trim(str));//"守 候"
console.log(ecDo.trimAll(str));//"守候"
console.log(ecDo.trimLeft(str));//"守候 "
console.log(ecDo.trimRright(str));//" 守候"

這樣雖然多了幾個(gè) API 但是使用起來簡單了。記憶成本也比之前少。是否設(shè)置參數(shù)多態(tài),還是要看調(diào)用的情況而言。

6.小結(jié)

好了,關(guān)于 API 參數(shù)方面的東西就暫時(shí)寫到這里了,這部分的內(nèi)容不多,所以篇幅不是很長,也容易理解。但是參數(shù)這個(gè)話題也相對(duì)開放,如果大家有什么好的想法。歡迎在評(píng)論區(qū)留言。

-------------------------華麗的分割線--------------------

想了解更多,和我交流,內(nèi)推職位,請(qǐng)?zhí)砑游椅⑿??;蛘哧P(guān)注我的微信公眾號(hào):守候書閣

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/109659.html

相關(guān)文章

  • [探索]么樣參數(shù)能讓 JS - API 靈活

    摘要:所以參數(shù)多多少少影響了的一個(gè)靈活程度和使用復(fù)雜程度。如果多個(gè)參數(shù),使用能更方便,靈活,簡單。是否使用對(duì)象作為參數(shù),判斷的指標(biāo)應(yīng)該只有一個(gè)是否方便使用,靈活。即使這樣可能違法了單一指責(zé)原則,但是呼應(yīng)了最少知識(shí)原則。 外在決定是否需要了解內(nèi)在,內(nèi)在決定是否會(huì)一票否決外在。內(nèi)外結(jié)合,好上加好。 1.前言 開發(fā) API 的時(shí)候,把參數(shù)的名字和位置確定下來,函數(shù)定義就可以說是完成了。因?yàn)?API 使...

    psychola 評(píng)論0 收藏0
  • Promise in ECMAScript | 前端技術(shù)探索

    摘要:而納入規(guī)范的也是建立在基礎(chǔ)上的。繼續(xù)閱讀的相關(guān)解釋語法其中函數(shù)擁有兩個(gè)參數(shù)和??梢钥吹剑谡Z法上看,還是有點(diǎn)像回調(diào)函數(shù)那種形式的,囧。完成操作已經(jīng)成功執(zhí)行完畢。消費(fèi),即對(duì)的所代表的值進(jìn)行一系列的處理。 文 | Leigh,UPYUN 已獲得授權(quán)原文鏈接:http://t.cn/R403hc4 在 JavaScript 這么多年發(fā)展中,尤其在前端領(lǐng)域框架層出不窮,解決方案也琳瑯滿目,Pr...

    SillyMonkey 評(píng)論0 收藏0
  • 開發(fā)零成本 :En-Tan-Mo黃皮書解讀之開發(fā)者篇

    摘要:項(xiàng)目黃皮書一經(jīng)發(fā)布,區(qū)塊鏈垂直媒體星球日?qǐng)?bào)就對(duì)這本書作了專題式的解讀。在接受星球日?qǐng)?bào)采訪中,開發(fā)者們表示,擔(dān)心節(jié)點(diǎn)集中化帶來的安全風(fēng)險(xiǎn)。本文,星球日?qǐng)?bào)將通過解讀黃皮書,解答開發(fā)者關(guān)心的問題。 showImg(https://segmentfault.com/img/bVbt2EX?w=800&h=534); 由ETM科學(xué)院歷時(shí)半年打磨的黃皮書,從科學(xué)和技術(shù)兩方面全方位解讀了ETM的理論...

    pakolagij 評(píng)論0 收藏0
  • 開發(fā)零成本 :En-Tan-Mo黃皮書解讀之開發(fā)者篇

    摘要:項(xiàng)目黃皮書一經(jīng)發(fā)布,區(qū)塊鏈垂直媒體星球日?qǐng)?bào)就對(duì)這本書作了專題式的解讀。在接受星球日?qǐng)?bào)采訪中,開發(fā)者們表示,擔(dān)心節(jié)點(diǎn)集中化帶來的安全風(fēng)險(xiǎn)。本文,星球日?qǐng)?bào)將通過解讀黃皮書,解答開發(fā)者關(guān)心的問題。 showImg(https://segmentfault.com/img/bVbt2EX?w=800&h=534); 由ETM科學(xué)院歷時(shí)半年打磨的黃皮書,從科學(xué)和技術(shù)兩方面全方位解讀了ETM的理論...

    plus2047 評(píng)論0 收藏0
  • 接口

    摘要:前言這一系列的文章將主要基于設(shè)計(jì)模式這本書的要點(diǎn)還有一些翻閱的博客文章借鑒來源會(huì)注明外加自己的一些與直覺不同于其他設(shè)計(jì)模式類的書設(shè)計(jì)模式是一本講述設(shè)計(jì)模式在動(dòng)態(tài)語言中的實(shí)現(xiàn)的書它從設(shè)計(jì)的角度教人編寫代碼書中的許多實(shí)例代碼來自實(shí)戰(zhàn)項(xiàng)目對(duì)面向?qū)? 前言 這一系列的文章將主要基于js設(shè)計(jì)模式這本書的要點(diǎn)還有一些翻閱的博客文章,借鑒來源會(huì)注明,外加自己的一些demo與直覺.不同于其他設(shè)計(jì)模式類的...

    zhjx922 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<