摘要:學習的步伐不能就此停止,今天的文章,將會提及開發的另一個原則單一職責原則。通俗點說就是一個函數只做一件事,下面將會通過幾個實例,探究單一職責原則。遵守單一職責的實例太多了,下面簡單列舉一下。在市面上,也有是違反單一職責的。
1.前言
上篇文章寫了添加擴展性方面的重構,講到了開放封閉原則。學習的步伐不能就此停止,今天的文章,將會提及開發的另一個原則:單一職責原則。通俗點說就是一個函數只做一件事,下面將會通過幾個實例,探究單一職責原則。
2.單一職責表現形式單一職責的定義可以理解為:一個對象或者方法,只做一件事。
遵守單一職責的實例太多了,下面簡單列舉一下。
原生的API方面
trimRight()和trimLeft():trimRight 只負責去除右邊的空白,其它地方一概不管。 trimLeft 只負責去除右邊的空白,其它地方也一概不關。
concat(): concat 只負責連接兩個或更多的數組,并返回結果。不會涉及刪除數組的操作。
toFixed(): toFixed 只把 Number 類型的值四舍五入為指定小數位數的數字。不會執行其它操作。
JQuery 的 API
$.each() 只負責遍歷,要處理什么,自己再動手操作。
css() 只負責設置 DOM 的 style ,不會設置 innerHTML 。
animate() 只負責執行 CSS 屬性集的自定義動畫,不會涉及其它操作。
說是這樣說,但是大家看著可能會有點懵,看不出來遵守單一原則有什么好處,下面看一個實例。
3.實例-數組處理如下例子:
現有一批的錄入學生信息,但是數據有重復,需要把數據根據 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) { //數組去重 let _arr=[],_arrIds=[]; for(let i=0;i{ for(let key in item){ if(item[key]===""){ item[key]="--"; } } }); return _arr; } console.log(handle(students))
運行結果沒有問題,但是大家想一下,
1.如果改了需求,比如,學生信息不會再有重復的記錄,要求把去重的函數去掉,無論,就是整個函數都要改了,還影響到下面的操作。
2.如果項目另一個地方也是同樣的操作,但是不需要去重。這樣只能再寫一個基本一樣的函數,因為上面的函數無法復用。如下
function handle1(arr) { //數組深拷貝 let _arr=JSON.parse(JSON.stringify(arr)); //遍歷替換 _arr.map(item=>{ for(let key in item){ if(item[key]===""){ item[key]="--"; } } }); return _arr; }
3.如果項目有一個地方還需要根據 ID 排序。這樣還是得寫一個函數,因為在不能在上面的函數上面排序。
function handle2(arr) { //數組去重 let _arr=[],_arrIds=[]; for(let i=0;i{ for(let key in item){ if(item[key]===""){ item[key]="--"; } } }); //根據ID排序 _arr.sort((item1,item2)=>item1.id-item2.id); return _arr; }
這樣的問題就是在于,面對需求的變化,不能靈活的處理。函數也基本沒辦法復用。
下面使用單一原則構造一下
let handle={ //數組去重 removeRepeat(arr){ let _arr=[],_arrIds=[]; for(let i=0;i{ for(let key in item){ if(item[key]===""){ item[key]="--"; } } }); return arr; }, //根據id排序 sortForId(arr){ return arr.sort((item1,item2)=>item1.id-item2.id); } }; //去重 students=handle.removeRepeat(students); //設置信息 students=handle.setInfo(students); console.log(students);
結果一樣,而且這樣的方式,可以使得方法可以組合使用,更加的靈活,也方便復用。
如果還需要根據ID排序,就在上面代碼執行結果的基礎上,再加一行代碼即可。
//根據ID排序 students=handle.sortForId(students); console.log(students);
如果原始數據不需要去重,設置完信息之后,直接排序
let students=[ { id:5, name:"守候", sex:"男", age:"", }, { id:2, name:"浪跡天涯", sex:"男", age:"" }, { id:5, name:"守候", sex:"", age:"" }, { id:3, name:"鴻雁", sex:"", age:"20" } ]; //設置信息 students=handle.setInfo(students); //根據ID排序 students=handle.sortForId(students);
這樣操作起來,即使以后需求有改動,在可控的范圍內,可以靈活的組合使用,函數也可以復用。
如果覺得要讓 students 連續賦值麻煩,可以借鑒 JQuery 的鏈式調用方式。
let ec=(function () { let handle=function (obj) { this.obj=JSON.parse(JSON.stringify(obj)); }; handle.prototype={ /** * @description 去重 */ unique(){ //根據id數組去重 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 返回處理結果 * @return {Array|*} */ end(){ return this.obj; } } //暴露構造函數接口 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" } ]; //根據id去重和設置"--" students=ec(students).unique().setInfo().end(); console.log(students)
結果還是一樣,只是增加了一個方法,方便鏈式調用。
關于實現鏈式調用,這個肯定是會增加代碼的,如果調用的方法并不是一些常用,通用的方法的話,只是處理一些特殊格式的數據的方法(如上實例),不建議花費時間,實現鏈式調用,普通調用就好。如果是一些常用的函數的封裝,就建議使用鏈式調用。4.違反單一職責原則
在上面的實例里面,相信大家都看到了,遵守單一職責的好處,但是單一職責也有缺點,就是會增加代碼的復雜程度。
在市面上,也有API是違反單一職責的。
JQuery 的 html() 方法,既可以獲取 innerHTML ,也可以設置 innerHTML 。 attr ()既可以獲取 DOM 元素的某一個屬性,也可以設置 DOM 元素的某一個屬性。
在維護上面,這樣的代碼,可能會給維護增加難度,但是對于使用者而言,這樣簡化了使用。這應該是一個取舍關系,取什么,舍什么。這個就是具體情況具體分析。
5.小結今天的例子就到這里了,這個例子,解釋降解函數單一原則會有什么好處。這個例子比上篇文章的例子還要簡單。大家看不明白,把代碼拷貝在瀏覽器上運行,就很好理解。如果大家對這個例子有什么更好的建議,或者代碼上有什么問題,歡迎在評論區留言,大家多交流,相互學習。
---------------------華麗的分割線---------------------
想了解更多,關注關注我的微信公眾號:守候書閣
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94949.html
摘要:同時,在方法命名上也投入一精力,盡可能地使方法名保持簡單,它將幫助你在重構代碼時,更好的達到單一職責。 這是理解SOLID原則中,關于單一職責原則如何幫助我們編寫低耦合和高內聚的第二篇文章。 單一職責原則是什么 之前的第一篇文章闡述了依賴倒置原則(DIP)能夠使我們編寫的代碼變得低耦合,同時具有很好的可測試性,接下來我們來簡單了解下單一職責原則的基本概念: Every module o...
摘要:暴露接口如果是函數,就擴展,否則就是驗證數據使用金額校驗規則這樣運行能正常,也有擴展性性,但是對于代碼潔癖的來說,這樣寫法不優雅。 重構不是對以前代碼的全盤否定,而是利用更好的方式,寫出更好,更有維護性代碼。不斷的追求與學習,才有更多的進步。 1.前言 做前端開發有一段時間了,在這段時間里面,對于自己的要求,不僅僅是項目能完成,功能正常使用這一層面上。還盡力的研究怎么寫出優雅的代碼,性...
摘要:,開始我們的第一篇單一職責。通過解耦可以讓每個職責工更加有彈性地變化。關于本文本文轉自大叔的深入理解系列。深入理解系列文章,包括了原創,翻譯,轉載,整理等各類型文章,原文是大叔的一個非常不錯的專題,現將其重新整理發布。 前言 Bob大叔提出并發揚了S.O.L.I.D五大原則,用來更好地進行面向對象編程,五大原則分別是: The Single Responsibility Princi...
摘要:單元測試不僅涉及早期錯誤檢測。當組件的架構設計很脆弱時,就會變得難以測試,而當組件難以測試的時候,你大概念會跳過編寫單元測試的過程,最終的結果就是組件未測試。可測試性是確定組件結構良好程度的實用標準。可復用的組件是精心設計的系統的結果。 翻譯:劉小夕原文鏈接:https://dmitripavlutin.com/7-... 本篇文章重點闡述可測試和富有意義。因水平有限,文中部分翻譯可...
摘要:接口隔離原則是什么客戶端代碼不應當被迫依賴于它們不需要的方法。 這是理解SOLID原則,關于接口隔離原則如何幫助我們創建簡單的抽象接口,并使客戶端代與接口之間存在的更少的依賴關系。 接口隔離原則是什么 Clients should not be forced to depend on methods that they do not use.客戶端代碼不應當被迫依賴于它們不需要的方法。...
閱讀 1308·2019-08-30 15:44
閱讀 1979·2019-08-30 13:49
閱讀 1651·2019-08-26 13:54
閱讀 3485·2019-08-26 10:20
閱讀 3241·2019-08-23 17:18
閱讀 3294·2019-08-23 17:05
閱讀 2130·2019-08-23 15:38
閱讀 1012·2019-08-23 14:35