摘要:用且只用一個完成這一需求。執(zhí)行時可以增加規(guī)則對要變量的合法性進(jìn)行判斷。繼承該類時可以重載默認(rèn)行為。讓對象擁有私有成員。理想情況下,應(yīng)將調(diào)用其他函數(shù)的函數(shù)寫在被調(diào)用函數(shù)的上方。避免位置標(biāo)記避免在源文件中寫入法律評論參考
變量
使用有意義、可讀性好的變量
使用 ES6 的 const 聲明常量
對功能類似的變量名采用統(tǒng)一的命名風(fēng)格
使用易于檢索名稱
舉例
// 反例 for (var i = 0; i < 525600; i++) { runCronJob(); } // 正例 var MINUTES_IN_A_YEAR = 525600; for (var i = 0; i < MINUTES_IN_A_YEAR; i++) { runCronJob(); }
使用說明變量(即有意義的變量名)
顯式優(yōu)于隱式(變量名盡量簡潔明了)
避免重復(fù)的描述
避免無意義的條件判斷
舉例
var currentPage=""; var pageNumInfo = JSON.parse(localStorage.getItem("pageNumInfo")); if (pageNumInfo) { currentPage = parseInt(pageNumInfo[0].pageNum); } else { currentPage = 1; } // 以上代碼片段可用以下代碼取代 var pageNumInfo = JSON.parse(localStorage.getItem("pageNumInfo")); var currentPage = parseInt(pageNumInfo[0].pageNum) || 1;函數(shù)
函數(shù)參數(shù)
函數(shù)參數(shù)理想情況下應(yīng)該不超過 2 個。當(dāng)確實需要多個參數(shù)時,大多情況下可以考慮將這些參數(shù)封裝成一個對象。
保證函數(shù)功能的單一性
功能不單一的函數(shù)將導(dǎo)致難以重構(gòu)、測試和理解。功能單一的函數(shù)易于重構(gòu),并使代碼更加干凈。
提高函數(shù)名的可讀性(函數(shù)名應(yīng)明確表明其功能)
函數(shù)應(yīng)該只做一層抽象
當(dāng)函數(shù)需要的抽象多于一層時通常意味著函數(shù)功能過于復(fù)雜,需將其進(jìn)行分解以提高其可重用性和可測試性。
避免在一個函數(shù)中寫重復(fù)的代碼
采用默認(rèn)參數(shù)精簡代碼
使用 Object.assign() 設(shè)置默認(rèn)對象
不要使用標(biāo)記(Flag)作為函數(shù)參數(shù)(會破壞函數(shù)功能的單一性)
避免副作用
函數(shù)副作用:當(dāng)函數(shù)產(chǎn)生了除了“接受一個值并返回一個結(jié)果”之外的行為時,稱該函數(shù)產(chǎn)生了副作用。比如寫文件、修改全局變量等。
程序在某些情況下確實需要副作用這一行為,如先前例子中的寫文件。這時應(yīng)該將這些功能集中在一起,不要用多個函數(shù)/類修改某個文件。用且只用一個 service 完成這一需求。
不要寫全局函數(shù)
采用函數(shù)式編程
封裝判斷條件
避免“否定條件”的判斷
避免條件判斷
許多情況下通過使用多態(tài)(polymorphism)可以達(dá)到同樣的目的。
// 反例 class Airplane { //... getCruisingAltitude() { switch (this.type) { case "777": return getMaxAltitude() - getPassengerCount(); case "Air Force One": return getMaxAltitude(); case "Cessna": return getMaxAltitude() - getFuelExpenditure(); } } } // 正例 class Airplane { //... } class Boeing777 extends Airplane { //... getCruisingAltitude() { return getMaxAltitude() - getPassengerCount(); } } class AirForceOne extends Airplane { //... getCruisingAltitude() { return getMaxAltitude(); } } class Cessna extends Airplane { //... getCruisingAltitude() { return getMaxAltitude() - getFuelExpenditure(); } }
避免類型判斷
避免過度優(yōu)化
無效代碼及時刪除
對象和數(shù)據(jù)結(jié)構(gòu)
使用 getters 和 setters
使用 getters 和 setters 獲取對象的數(shù)據(jù)遠(yuǎn)比直接使用點操作符具有優(yōu)勢,為什么呢??
1、當(dāng)需要對獲取的對象屬性執(zhí)行額外操作時。
2、執(zhí)行 set 時可以增加規(guī)則對要變量的合法性進(jìn)行判斷。
3、封裝了內(nèi)部邏輯。
4、在存取時可以方便的增加日志和錯誤處理。
5、繼承該類時可以重載默認(rèn)行為。
6、從服務(wù)器獲取數(shù)據(jù)時可以進(jìn)行懶加載。
讓對象擁有私有成員。(可以通過閉包實現(xiàn))
類列表項目
單一職責(zé)原則(SRP)
開閉原則(OCP)
代碼實體(類,模塊,函數(shù)等)應(yīng)該易于擴展,難于修改。
即代碼模塊的功能應(yīng)該要方便用戶拓展而不是修改源碼
利斯科夫替代原則(LSP)
子類對象應(yīng)該能夠替換其超類(父類)對象被使用。
接口隔離原則(ISP)
客戶端不應(yīng)該依賴它不需要的接口,一個類對另一個類的依賴應(yīng)該建立在最小的接口上。
依賴反轉(zhuǎn)原則(DIP)
該原則有兩個核心點:
1、高層模塊不應(yīng)該依賴于低層模塊。他們都應(yīng)該依賴于抽象接口。
2、抽象接口應(yīng)該脫離具體實現(xiàn),具體實現(xiàn)應(yīng)該依賴于抽象接口。
使用 ES6 的 classes 而不是 ES5 的 Function
典型的 ES5 的類(function)在繼承、構(gòu)造和方法定義方面可讀性較差。
當(dāng)需要繼承時,優(yōu)先選用 classes。
但是,當(dāng)在需要更大更復(fù)雜的對象時,最好優(yōu)先選擇更小的 function 而非 classes。
使用方法鏈
優(yōu)先使用組合模式而非繼承
測試單元測試,單一的測試每個概念
并發(fā)用 Promise 替代回調(diào)(支持 ES6 的情況,優(yōu)先使用)
async 和 await(支持 ES7 的情況,優(yōu)先使用)
錯誤處理try/catch 捕獲異常
不要忽略被拒絕的 promises
格式化大小寫一致
調(diào)用函數(shù)的函數(shù)和被調(diào)函數(shù)應(yīng)放在較近的位置
當(dāng)函數(shù)間存在相互調(diào)用的情況時,應(yīng)將兩者置于較近的位置。理想情況下,應(yīng)將調(diào)用其他函數(shù)的函數(shù)寫在被調(diào)用函數(shù)的上方。注釋
只對存在一定業(yè)務(wù)邏輯復(fù)雜性的代碼進(jìn)行注釋。注釋并不是必須的,好的代碼是能夠讓人一目了然,不用過多無謂的注釋。
被注釋掉的代碼及時刪除
不需要版本更新類型注釋。需要時可以使用 git log 獲取歷史版本。
避免位置標(biāo)記
避免在源文件中寫入法律評論
參考
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/99426.html
摘要:所有的塊語句都應(yīng)當(dāng)使用花括號包括花括號的對齊方式第一種風(fēng)格第二種風(fēng)格塊語句間隔第一種在語句名圓括號和左花括號之間沒有空格間隔第二種在左圓括號之前和右圓括號之后各添加一個空格第三種在左圓括號后和右圓括號前各添加一個空格我個人喜歡在右括號之后添 所有的塊語句都應(yīng)當(dāng)使用花括號, 包括: if for while do...while... try...catch...finally 3....
摘要:原文第一章主要介紹的大概情況基本語法。通過和來引用對象屬性或數(shù)組元素的值就構(gòu)成一個表達(dá)式。 原文:https://keelii.github.io/2016/06/16/javascript-definitive-guide-note-0/ 第一章 主要介紹 JavaScript 的大概情況、基本語法。之前沒有 JavaScript 基礎(chǔ)的看不懂也沒關(guān)系,后續(xù)章節(jié)會有進(jìn)一步的詳細(xì)說明...
摘要:編程書籍的整理和收集最近一直在學(xué)習(xí)深度學(xué)習(xí)和機器學(xué)習(xí)的東西,發(fā)現(xiàn)深入地去學(xué)習(xí)就需要不斷的去提高自己算法和高數(shù)的能力然后也找了很多的書和文章,隨著不斷的學(xué)習(xí),也整理了下自己的學(xué)習(xí)筆記準(zhǔn)備分享出來給大家后續(xù)的文章和總結(jié)會繼續(xù)分享,先分享一部分的 編程書籍的整理和收集 最近一直在學(xué)習(xí)deep learning深度學(xué)習(xí)和機器學(xué)習(xí)的東西,發(fā)現(xiàn)深入地去學(xué)習(xí)就需要不斷的去提高自己算法和高數(shù)的能力然后...
閱讀 3958·2021-11-22 13:53
閱讀 1688·2021-08-25 09:39
閱讀 2418·2019-08-29 18:36
閱讀 1479·2019-08-26 13:35
閱讀 1220·2019-08-26 11:57
閱讀 1686·2019-08-23 15:57
閱讀 809·2019-08-23 14:55
閱讀 1171·2019-08-23 14:51