成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

haitiancoder / 862人閱讀

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

1.前言

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

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

單一職責的定義可以理解為:一個對象或者方法,只做一件事。

遵守單一職責的實例太多了,下面簡單列舉一下。

原生的API方面

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

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

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

JQuery 的 API

$.each() 只負責遍歷,要處理什么,自己再動手操作。

css() 只負責設(shè)置 DOM 的 style ,不會設(shè)置 innerHTML 。

animate() 只負責執(zhí)行 CSS 屬性集的自定義動畫,不會涉及其它操作。

說是這樣說,但是大家看著可能會有點懵,看不出來遵守單一原則有什么好處,下面看一個實例。

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

如下例子:

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

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))

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

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

2.如果項目另一個地方也是同樣的操作,但是不需要去重。這樣只能再寫一個基本一樣的函數(shù),因為上面的函數(shù)無法復(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.如果項目有一個地方還需要根據(jù) ID 排序。這樣還是得寫一個函數(shù),因為在不能在上面的函數(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;
}

這樣的問題就是在于,面對需求的變化,不能靈活的處理。函數(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);

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

如果覺得要讓 students 連續(xù)賦值麻煩,可以借鑒 JQuery 的鏈式調(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é)果還是一樣,只是增加了一個方法,方便鏈式調(diào)用。

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

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

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

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

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

5.小結(jié)

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

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

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

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/94949.html

相關(guān)文章

  • 讀懂 SOLID 單一職責」原則

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

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

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

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

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

    walterrwu 評論0 收藏0
  • 可靠React組件設(shè)計7個準則之終篇

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

    jasperyang 評論0 收藏0
  • 讀懂 SOLID 「接口隔離」原則

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

    wing324 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<