成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

重構(gòu) - 保持函數(shù)的單一職責(zé)

haitiancoder / 907人閱讀

摘要:學(xué)習(xí)的步伐不能就此停止,今天的文章,將會(huì)提及開發(fā)的另一個(gè)原則單一職責(zé)原則。通俗點(diǎn)說(shuō)就是一個(gè)函數(shù)只做一件事,下面將會(huì)通過(guò)幾個(gè)實(shí)例,探究單一職責(zé)原則。遵守單一職責(zé)的實(shí)例太多了,下面簡(jiǎn)單列舉一下。在市面上,也有是違反單一職責(zé)的。

1.前言

上篇文章寫了添加擴(kuò)展性方面的重構(gòu),講到了開放封閉原則。學(xué)習(xí)的步伐不能就此停止,今天的文章,將會(huì)提及開發(fā)的另一個(gè)原則:?jiǎn)我宦氊?zé)原則。通俗點(diǎn)說(shuō)就是一個(gè)函數(shù)只做一件事,下面將會(huì)通過(guò)幾個(gè)實(shí)例,探究單一職責(zé)原則。

2.單一職責(zé)表現(xiàn)形式

單一職責(zé)的定義可以理解為:一個(gè)對(duì)象或者方法,只做一件事。

遵守單一職責(zé)的實(shí)例太多了,下面簡(jiǎn)單列舉一下。

原生的API方面

trimRight()和trimLeft():trimRight 只負(fù)責(zé)去除右邊的空白,其它地方一概不管。 trimLeft 只負(fù)責(zé)去除右邊的空白,其它地方也一概不關(guān)。

concat(): concat 只負(fù)責(zé)連接兩個(gè)或更多的數(shù)組,并返回結(jié)果。不會(huì)涉及刪除數(shù)組的操作。

toFixed(): toFixed 只把 Number 類型的值四舍五入為指定小數(shù)位數(shù)的數(shù)字。不會(huì)執(zhí)行其它操作。

JQuery 的 API

$.each() 只負(fù)責(zé)遍歷,要處理什么,自己再動(dòng)手操作。

css() 只負(fù)責(zé)設(shè)置 DOM 的 style ,不會(huì)設(shè)置 innerHTML 。

animate() 只負(fù)責(zé)執(zhí)行 CSS 屬性集的自定義動(dòng)畫,不會(huì)涉及其它操作。

說(shuō)是這樣說(shuō),但是大家看著可能會(huì)有點(diǎn)懵,看不出來(lái)遵守單一原則有什么好處,下面看一個(gè)實(shí)例。

3.實(shí)例-數(shù)組處理

如下例子:

現(xiàn)有一批的錄入學(xué)生信息,但是數(shù)據(jù)有重復(fù),需要把數(shù)據(jù)根據(jù) id 進(jìn)行去重。然后把為空的信息,改成"--"。

let students=[
    {
        id:5,
        name:"守候",
        sex:"男",
        age:"",
    },
    {
        id:2,
        name:"浪跡天涯",
        sex:"男",
        age:""
    },
    {
        id:5,
        name:"守候",
        sex:"",
        age:""
    },
    {
        id:3,
        name:"鴻雁",
        sex:"",
        age:"20"
    }
];

function handle(arr) {
    //數(shù)組去重
    let _arr=[],_arrIds=[];
    for(let i=0;i{
        for(let key in item){
            if(item[key]===""){
                item[key]="--";
            }
        }
    });
    return _arr;
}
console.log(handle(students))

運(yùn)行結(jié)果沒有問題,但是大家想一下,

1.如果改了需求,比如,學(xué)生信息不會(huì)再有重復(fù)的記錄,要求把去重的函數(shù)去掉,無(wú)論,就是整個(gè)函數(shù)都要改了,還影響到下面的操作。

2.如果項(xiàng)目另一個(gè)地方也是同樣的操作,但是不需要去重。這樣只能再寫一個(gè)基本一樣的函數(shù),因?yàn)樯厦娴暮瘮?shù)無(wú)法復(fù)用。如下

function handle1(arr) {
    //數(shù)組深拷貝
    let _arr=JSON.parse(JSON.stringify(arr));
    //遍歷替換
    _arr.map(item=>{
        for(let key in item){
            if(item[key]===""){
                item[key]="--";
            }
        }
    });
    return _arr;
}

3.如果項(xiàng)目有一個(gè)地方還需要根據(jù) ID 排序。這樣還是得寫一個(gè)函數(shù),因?yàn)樵诓荒茉谏厦娴暮瘮?shù)上面排序。

function handle2(arr) {
    //數(shù)組去重
    let _arr=[],_arrIds=[];
    for(let i=0;i{
        for(let key in item){
            if(item[key]===""){
                item[key]="--";
            }
        }
    });
    //根據(jù)ID排序
    _arr.sort((item1,item2)=>item1.id-item2.id);
    return _arr;
}

這樣的問題就是在于,面對(duì)需求的變化,不能靈活的處理。函數(shù)也基本沒辦法復(fù)用。

下面使用單一原則構(gòu)造一下

let handle={
    //數(shù)組去重
    removeRepeat(arr){
        let _arr=[],_arrIds=[];
        for(let i=0;i{
            for(let key in item){
                if(item[key]===""){
                    item[key]="--";
                }
            }
        });
        return arr;
    },
    //根據(jù)id排序
    sortForId(arr){
        return arr.sort((item1,item2)=>item1.id-item2.id);
    }
};
//去重
students=handle.removeRepeat(students);
//設(shè)置信息
students=handle.setInfo(students);
console.log(students);

結(jié)果一樣,而且這樣的方式,可以使得方法可以組合使用,更加的靈活,也方便復(fù)用。

如果還需要根據(jù)ID排序,就在上面代碼執(zhí)行結(jié)果的基礎(chǔ)上,再加一行代碼即可。

//根據(jù)ID排序
students=handle.sortForId(students);
console.log(students);

如果原始數(shù)據(jù)不需要去重,設(shè)置完信息之后,直接排序

let students=[
    {
        id:5,
        name:"守候",
        sex:"男",
        age:"",
    },
    {
        id:2,
        name:"浪跡天涯",
        sex:"男",
        age:""
    },
    {
        id:5,
        name:"守候",
        sex:"",
        age:""
    },
    {
        id:3,
        name:"鴻雁",
        sex:"",
        age:"20"
    }
];
//設(shè)置信息
students=handle.setInfo(students);
//根據(jù)ID排序
students=handle.sortForId(students);

這樣操作起來(lái),即使以后需求有改動(dòng),在可控的范圍內(nèi),可以靈活的組合使用,函數(shù)也可以復(fù)用。

如果覺得要讓 students 連續(xù)賦值麻煩,可以借鑒 JQuery 的鏈?zhǔn)秸{(diào)用方式。

let ec=(function () {
    let handle=function (obj) {
        this.obj=JSON.parse(JSON.stringify(obj));
    };
    handle.prototype={
        /**
         * @description 去重
         */
        unique(){
            //根據(jù)id數(shù)組去重
            let _arr=[],_arrIds=[];
            for(let i=0;i{
                for(let key in item){
                    if(item[key]===""){
                        item[key]="--";
                    }
                }
            });
            return this;
        },
        sortForId(){
            this.obj.sort((item1,item2)=>item1.id-item2.id);
            return this;
        },
        /**
         * @description 返回處理結(jié)果
         * @return {Array|*}
         */
        end(){
            return this.obj;
        }
    }
    //暴露構(gòu)造函數(shù)接口
    return function (obj) {
        return new handle(obj);
    }
})();
let students=[
    {
        id:5,
        name:"守候",
        sex:"男",
        age:"",
    },
    {
        id:2,
        name:"浪跡天涯",
        sex:"男",
        age:""
    },
    {
        id:5,
        name:"守候",
        sex:"",
        age:""
    },
    {
        id:3,
        name:"鴻雁",
        sex:"",
        age:"20"
    }
];
//根據(jù)id去重和設(shè)置"--"
students=ec(students).unique().setInfo().end();
console.log(students)

結(jié)果還是一樣,只是增加了一個(gè)方法,方便鏈?zhǔn)秸{(diào)用。

關(guān)于實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用,這個(gè)肯定是會(huì)增加代碼的,如果調(diào)用的方法并不是一些常用,通用的方法的話,只是處理一些特殊格式的數(shù)據(jù)的方法(如上實(shí)例),不建議花費(fèi)時(shí)間,實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用,普通調(diào)用就好。如果是一些常用的函數(shù)的封裝,就建議使用鏈?zhǔn)秸{(diào)用。
4.違反單一職責(zé)原則

在上面的實(shí)例里面,相信大家都看到了,遵守單一職責(zé)的好處,但是單一職責(zé)也有缺點(diǎn),就是會(huì)增加代碼的復(fù)雜程度。

在市面上,也有API是違反單一職責(zé)的。

JQuery 的 html() 方法,既可以獲取 innerHTML ,也可以設(shè)置 innerHTML 。 attr ()既可以獲取 DOM 元素的某一個(gè)屬性,也可以設(shè)置 DOM 元素的某一個(gè)屬性。

在維護(hù)上面,這樣的代碼,可能會(huì)給維護(hù)增加難度,但是對(duì)于使用者而言,這樣簡(jiǎn)化了使用。這應(yīng)該是一個(gè)取舍關(guān)系,取什么,舍什么。這個(gè)就是具體情況具體分析。

5.小結(jié)

今天的例子就到這里了,這個(gè)例子,解釋降解函數(shù)單一原則會(huì)有什么好處。這個(gè)例子比上篇文章的例子還要簡(jiǎn)單。大家看不明白,把代碼拷貝在瀏覽器上運(yùn)行,就很好理解。如果大家對(duì)這個(gè)例子有什么更好的建議,或者代碼上有什么問題,歡迎在評(píng)論區(qū)留言,大家多交流,相互學(xué)習(xí)。

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

想了解更多,關(guān)注關(guān)注我的微信公眾號(hào):守候書閣

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

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

相關(guān)文章

  • 讀懂 SOLID 單一職責(zé)」原則

    摘要:同時(shí),在方法命名上也投入一精力,盡可能地使方法名保持簡(jiǎn)單,它將幫助你在重構(gòu)代碼時(shí),更好的達(dá)到單一職責(zé)。 這是理解SOLID原則中,關(guān)于單一職責(zé)原則如何幫助我們編寫低耦合和高內(nèi)聚的第二篇文章。 單一職責(zé)原則是什么 之前的第一篇文章闡述了依賴倒置原則(DIP)能夠使我們編寫的代碼變得低耦合,同時(shí)具有很好的可測(cè)試性,接下來(lái)我們來(lái)簡(jiǎn)單了解下單一職責(zé)原則的基本概念: Every module o...

    Magicer 評(píng)論0 收藏0
  • 重構(gòu) - 改善代碼各方面問題

    摘要:暴露接口如果是函數(shù),就擴(kuò)展,否則就是驗(yàn)證數(shù)據(jù)使用金額校驗(yàn)規(guī)則這樣運(yùn)行能正常,也有擴(kuò)展性性,但是對(duì)于代碼潔癖的來(lái)說(shuō),這樣寫法不優(yōu)雅。 重構(gòu)不是對(duì)以前代碼的全盤否定,而是利用更好的方式,寫出更好,更有維護(hù)性代碼。不斷的追求與學(xué)習(xí),才有更多的進(jìn)步。 1.前言 做前端開發(fā)有一段時(shí)間了,在這段時(shí)間里面,對(duì)于自己的要求,不僅僅是項(xiàng)目能完成,功能正常使用這一層面上。還盡力的研究怎么寫出優(yōu)雅的代碼,性...

    AlphaWallet 評(píng)論0 收藏0
  • 深入理解JavaScript系列6:S.O.L.I.D五大原則之單一職責(zé)

    摘要:,開始我們的第一篇單一職責(zé)。通過(guò)解耦可以讓每個(gè)職責(zé)工更加有彈性地變化。關(guān)于本文本文轉(zhuǎn)自大叔的深入理解系列。深入理解系列文章,包括了原創(chuàng),翻譯,轉(zhuǎn)載,整理等各類型文章,原文是大叔的一個(gè)非常不錯(cuò)的專題,現(xiàn)將其重新整理發(fā)布。 前言 Bob大叔提出并發(fā)揚(yáng)了S.O.L.I.D五大原則,用來(lái)更好地進(jìn)行面向?qū)ο缶幊?,五大原則分別是: The Single Responsibility Princi...

    walterrwu 評(píng)論0 收藏0
  • 可靠React組件設(shè)計(jì)7個(gè)準(zhǔn)則之終篇

    摘要:?jiǎn)卧獪y(cè)試不僅涉及早期錯(cuò)誤檢測(cè)。當(dāng)組件的架構(gòu)設(shè)計(jì)很脆弱時(shí),就會(huì)變得難以測(cè)試,而當(dāng)組件難以測(cè)試的時(shí)候,你大概念會(huì)跳過(guò)編寫單元測(cè)試的過(guò)程,最終的結(jié)果就是組件未測(cè)試??蓽y(cè)試性是確定組件結(jié)構(gòu)良好程度的實(shí)用標(biāo)準(zhǔn)??蓮?fù)用的組件是精心設(shè)計(jì)的系統(tǒng)的結(jié)果。 翻譯:劉小夕原文鏈接:https://dmitripavlutin.com/7-... 本篇文章重點(diǎn)闡述可測(cè)試和富有意義。因水平有限,文中部分翻譯可...

    jasperyang 評(píng)論0 收藏0
  • 讀懂 SOLID 「接口隔離」原則

    摘要:接口隔離原則是什么客戶端代碼不應(yīng)當(dāng)被迫依賴于它們不需要的方法。 這是理解SOLID原則,關(guān)于接口隔離原則如何幫助我們創(chuàng)建簡(jiǎn)單的抽象接口,并使客戶端代與接口之間存在的更少的依賴關(guān)系。 接口隔離原則是什么 Clients should not be forced to depend on methods that they do not use.客戶端代碼不應(yīng)當(dāng)被迫依賴于它們不需要的方法。...

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

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

0條評(píng)論

閱讀需要支付1元查看
<