自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

這些被同事噴的JS代碼風(fēng)格你寫過多少?

開發(fā) 前端
現(xiàn)在寫代碼比以前好多了,代碼的格式都有 eslint、prettier、babel(寫新版語法) 這些來保證,然而,技術(shù)手段再高端都不能解決代碼可讀性(代碼能否被未來的自己和同事看懂)的問題,因?yàn)檫@個(gè)問題只有人自己才能解決。

 現(xiàn)在寫代碼比以前好多了,代碼的格式都有 eslint、prettier、babel(寫新版語法) 這些來保證,然而,技術(shù)手段再高端都不能解決代碼可讀性(代碼能否被未來的自己和同事看懂)的問題,因?yàn)檫@個(gè)問題只有人自己才能解決。我們寫代碼要寫到下圖中左邊這樣基本上就功德圓滿了。

一、變量相關(guān)

(1)變量數(shù)量的定義

NO:濫用變量 

  1. let kpi = 4;  // 定義好了之后再也沒用過  
  2. function example() {  
  3.     var a = 1 
  4.     var b = 2 
  5.     var c = a+b;  
  6.     var d = c+1;  
  7.     var e = d+a;  
  8.     return e;  

YES: 數(shù)據(jù)只使用一次或不使用就無需裝到變量中 

  1. let kpi = 4;  // 沒用的就刪除掉,不然過三個(gè)月自己都不敢刪,怕是不是那用到了  
  2. function example() {  
  3.     var a = 1 
  4.     var b = 2 
  5.     return 2a+b+1;  

(2)變量的命名

NO:自我感覺良好的縮寫 

  1. let fName = 'jackie'; // 看起來命名挺規(guī)范,縮寫,駝峰法都用上,ESlint各種檢測規(guī)范的工具都通過,But,fName是啥?這時(shí)候,你是不是想說What are you 弄啥呢?  
  2. let lName = 'willen'; // 這個(gè)問題和上面的一樣 

YES:無需對(duì)每個(gè)變量都寫注釋,從名字上就看懂 

  1. let firstName = 'jackie'; // 怎么樣,是不是一目了然。少被噴了一次  
  2.  let lastName = 'willen' 
  3.   ``` 

(3)特定的變量

NO:無說明的參數(shù) 

  1. if (value.length < 8) { // 為什么要小于8,8表示啥?長度,還是位移,還是高度?Oh,my God!!  
  2.     ....  

YES:添加變量 

  1. const MAX_INPUT_LENGTH = 8 
  2. if (value.length < MAX_INPUT_LENGTH) { // 一目了然,不能超過***輸入長度  
  3.     ....  

(4)變量的命名

NO:命名過于啰嗦 

  1. let nameString;  
  2. let theUsers; 

YES: 做到簡潔明了 

  1. let name;  
  2. let users; 

(5)使用說明性的變量(即有意義的變量名)

NO:長代碼不知道啥意思 

  1. const address = 'One Infinite Loop, Cupertino 95014' 
  2. const cityZipCodeRegex = /^[^,\]+[,\s]+(.+?)s*(d{5})?$/;  
  3. saveCityZipCode(  
  4.   address.match(cityZipCodeRegex)[1], // 這個(gè)公式到底要干嘛,對(duì)不起,原作者已經(jīng)離職了。自己看代碼  
  5.   address.match(cityZipCodeRegex)[2], // 這個(gè)公式到底要干嘛,對(duì)不起,原作者已經(jīng)離職了。自己看代碼  
  6. ); 

YES:用變量名來解釋長代碼的含義 

  1. const address = 'One Infinite Loop, Cupertino 95014' 
  2. const cityZipCodeRegex = /^[^,\]+[,\s]+(.+?)s*(d{5})?$/;  
  3. const [, city, zipCode] = address.match(cityZipCodeRegex) || [];  
  4. saveCityZipCode(city, zipCode); 

(6)避免使用太多的全局變量

NO:在不同的文件不停的定義全局變量 

  1. name.js  
  2. window.name = 'a' 
  3. hello.js  
  4. window.name = 'b' 
  5. time.js  
  6. window.name = 'c';  //三個(gè)文件的先后加載順序不同,都會(huì)使得window.name的值不同,同時(shí),你對(duì)window.name的修改了都有可能不生效,因?yàn)槟悴恢滥阈薷倪^之后別人是不是又在別的說明文件中對(duì)其的值重置了。所以隨著文件的增多,會(huì)導(dǎo)致一團(tuán)亂麻。 

YES:少用或使用替代方案

你可以選擇只用局部變量。通過(){}的方法。

如果你確實(shí)用很多的全局變量需要共享,你可以使用vuex,redux或者你自己參考flux模式寫一個(gè)也行。

(7)變量的賦值。

NO:對(duì)于求值獲取的變量,沒有兜底。 

  1. const MIN_NAME_LENGTH = 8 
  2. let lastName = fullName[1];  
  3. if(lastName.length > MIN_NAME_LENGTH) { // 這樣你就給你的代碼成功的埋了一個(gè)坑,你有考慮過如果fullName = ['jackie']這樣的情況嗎?這樣程序一跑起來就爆炸。要不你試試。  
  4.     ....  

YES:對(duì)于求值變量,做好兜底。 

  1. const MIN_NAME_LENGTH = 8 
  2. let lastName = fullName[1] || ''; // 做好兜底,fullName[1]中取不到的時(shí)候,不至于賦值個(gè)undefined,至少還有個(gè)空字符,從根本上講,lastName的變量類型還是String,String原型鏈上的特性都能使用,不會(huì)報(bào)錯(cuò)。不會(huì)變成undefined。 
  3.  if(lastName.length > MIN_NAME_LENGTH) {  
  4.     ....  
  5.  
  6. 其實(shí)在項(xiàng)目中有很多求值變量,對(duì)于每個(gè)求值變量都需要做好兜底。  
  7. let propertyValue = Object.attr || 0; // 因?yàn)镺bject.attr有可能為空,所以需要兜底。  
  8. 但是,賦值變量就不需要兜底了。  
  9. let a = 2; // 因?yàn)橛械琢?,所以不要兜著?nbsp; 
  10. let myName = 'Tiny'; // 因?yàn)橛械琢耍圆灰抵?nbsp;

二、函數(shù)相關(guān)

(1)函數(shù)命名

NO:從命名無法知道返回值類型 

  1. function showFriendsList() {....} // 現(xiàn)在問,你知道這個(gè)返回的是一個(gè)數(shù)組,還是一個(gè)對(duì)象,還是true or false。你能答的上來否?你能答得上來我請(qǐng)你吃松鶴樓的滿漢全席還請(qǐng)你不要當(dāng)真。 

Yes:對(duì)于返回true or false的函數(shù),***以should/is/can/has開頭 

  1. function shouldShowFriendsList() {...}  
  2. function isEmpty() {...}  
  3. function canCreateDocuments() {...}  
  4. function hasLicense() {...} 

(2)功能函數(shù)***為純函數(shù)

NO: 不要讓功能函數(shù)的輸出變化無常。 

  1. function plusAbc(a, b, c) {  // 這個(gè)函數(shù)的輸出將變化無常,因?yàn)閍pi返回的值一旦改變,同樣輸入函數(shù)的a,b,c的值,但函數(shù)返回的結(jié)果卻不一定相同。  
  2.         var c = fetch('../api');  
  3.         return a+b+c;  

YES:功能函數(shù)使用純函數(shù),輸入一致,輸出結(jié)果永遠(yuǎn)唯一 

  1. function plusAbc(a, b, c) {  // 同樣輸入函數(shù)的a,b,c的值,但函數(shù)返回的結(jié)果永遠(yuǎn)相同。  
  2.         return a+b+c;  

(3)函數(shù)傳參

NO:傳參無說明 

  1. page.getSVG(api, true, false); // true和false啥意思,一目不了然 

YES: 傳參有說明 

  1. page.getSVG({  
  2.     imageApi: api,  
  3.     includePageBackground: true, // 一目了然,知道這些true和false是啥意思  
  4.     compress: false,  
  5. }) 

(4)動(dòng)作函數(shù)要以動(dòng)詞開頭

NO: 無法辨別函數(shù)意圖 

  1. function emlU(user) {  
  2.     ....  

YES:動(dòng)詞開頭,函數(shù)意圖就很明顯 

  1. function sendEmailToUser(user) {  
  2.     ....  

(5)一個(gè)函數(shù)完成一個(gè)獨(dú)立的功能,不要一個(gè)函數(shù)混雜多個(gè)功能

這是軟件工程中最重要的一條規(guī)則,當(dāng)函數(shù)需要做更多的事情時(shí),它們將會(huì)更難進(jìn)行編寫、測試、理解和組合。當(dāng)你能將一個(gè)函數(shù)抽離出只完成一個(gè)動(dòng)作,他們將能夠很容易的進(jìn)行重構(gòu)并且你的代碼將會(huì)更容易閱讀。如果你嚴(yán)格遵守本條規(guī)則,你將會(huì)領(lǐng)先于許多開發(fā)者。

NO:函數(shù)功能混亂,一個(gè)函數(shù)包含多個(gè)功能。***就像能以一當(dāng)百的老師傅一樣,被亂拳打死(亂拳(功能復(fù)雜函數(shù))打死老師傅(老程序員)) 

  1. function sendEmailToClients(clients) {  
  2.   clients.forEach(client => {  
  3.     const clientRecord = database.lookup(client)  
  4.     if (clientRecord.isActive()) {  
  5.       email(client)  
  6.     }  
  7.   })  

YES: 功能拆解, 

  1. function sendEmailToActiveClients(clients) {  //各個(gè)擊破,易于維護(hù)和復(fù)用  
  2.   clients.filter(isActiveClient).forEach(email)  
  3.  
  4. function isActiveClient(client) {  
  5.   const clientRecord = database.lookup(client)  
  6.   return clientRecord.isActive()  

(6)優(yōu)先使用命令式編程

NO: 使用for循環(huán)編程 

  1. for(i = 1; i <= 10; i++) { // 一看到for循環(huán)讓人頓生不想看的情愫  
  2.    a[i] = a[i] +1;  

YES:使用命令式編程 

  1. let b = a.map(item => ++item) // 怎么樣,是不是很好理解,就是把a(bǔ)的值每項(xiàng)加一賦值給b就可以了?,F(xiàn)在在javascript中幾乎所有的for循環(huán)都可以被map,filter,find,some,any,forEach等命令式編成取代。 

(7)函數(shù)中過多的采用if else ..

No: if else過多 

  1. if (a === 1) {  
  2.     ...  
  3. } else if (a ===2) {  
  4.     ...  
  5. } else if (a === 3) {  
  6.     ...  
  7. } else {  
  8.    ...  

YES: 可以使用switch替代或用數(shù)組替代 

  1. switch(a) {  
  2.    case 1:  
  3.            ....  
  4.    case 2:  
  5.            ....  
  6.    case 3:  
  7.            ....  
  8.   default:  
  9.        ....  
  10.  
  11. Or  
  12. let handler = {  
  13.     1: () => {....},  
  14.     2: () => {....}.  
  15.     3: () => {....},  
  16.     default: () => {....}  
  17.  
  18. handler[a]() || handler['default']() 

三、盡量使用ES6,有可以能的話ES7中新語法

(只羅列最常用的新語法,說實(shí)話,有些新語法不怎么常用)

(1)盡量使用箭頭函數(shù)

NO:采用傳統(tǒng)函數(shù) 

  1. function foo() {  
  2.   // code  
  3.  
  4. YES:使用箭頭函數(shù)  
  5. let foo = () => {  
  6.   // code  

(2)連接字符串

NO:采用傳統(tǒng)+號(hào) 

  1. var message = 'Hello ' + name + ', it's ' + time + ' now' 

YES:采用模板字符 

  1. var message = `Hello ${name}, it's ${time} now` 

(3)使用解構(gòu)賦值

NO:使用傳統(tǒng)賦值: 

  1. var data = { name: 'dys', age: 1 };  
  2. var name = data.name;  
  3. var age = data.age;  
  4. var fullName = ['jackie', 'willen'];  
  5. var firstName = fullName[0];  
  6. var lastName = fullName[1]; 

YES:使用結(jié)構(gòu)賦值: 

  1. const data = {name:'dys', age:1};  
  2. const {name, age} = data;   // 怎么樣,是不是簡單明了  
  3. var fullName = ['jackie', 'willen'];  
  4. const [firstName, lastName] = fullName; 

(4) 盡量使用類class

NO: 采用傳統(tǒng)的函數(shù)原型鏈實(shí)現(xiàn)繼承 

  1. 典型的 ES5 的類(function)在繼承、構(gòu)造和方法定義方面可讀性較差,當(dāng)需要繼承時(shí),優(yōu)先選用 class。代碼太多,就省略了。 

YES:采用ES6類實(shí)現(xiàn)繼承 

  1. class Animal {  
  2.   constructor(age) {  
  3.     this.age = age  
  4.   }  
  5.   move() {  
  6.     /* ... */  
  7.   }  
  8.  
  9. class Mammal extends Animal {  
  10.   constructor(age, furColor) {  
  11.     super(age)  
  12.     this.furColor = furColor  
  13.   }  
  14.   liveBirth() {  
  15.     /* ... */  
  16.   }  
  17.  
  18. class Human extends Mammal {  
  19.   constructor(age, furColor, languageSpoken) {  
  20.     super(age, furColor)  
  21.     this.languageSpoken = languageSpoken  
  22.   }  
  23.   speak() {  
  24.     /* ... */  
  25.   }  

先寫到這了,這是目前為止發(fā)現(xiàn)的問題,這篇文章中并沒有完全覆蓋到常見的寫代碼的不好的習(xí)慣,所以你如果覺的有需要補(bǔ)充的,都可以在文章下方評(píng)論,或者直接到我的Github的這篇文章中評(píng)論。對(duì)于有用的,都將補(bǔ)充到我的掘金和Github中去。同時(shí),你如果覺的文章寫得還可以,Please在我的Github中送上你寶貴的Star,你的Star是我繼續(xù)寫文章***的動(dòng)力。

注:除了上述這些人為習(xí)慣之外,就像前面提到的,對(duì)于機(jī)械性的,你可以使用Babel、Eslint、Prettier這些工具來保證代碼的格式一致。

責(zé)任編輯:龐桂玉 來源: Web開發(fā)
相關(guān)推薦

2014-04-09 09:12:08

2020-02-20 10:45:57

代碼JS開發(fā)

2011-05-10 10:56:29

DBA面試

2017-09-08 12:15:54

Python代碼Pythonic

2020-03-20 08:00:32

代碼程序員追求

2022-02-07 22:25:01

手機(jī)關(guān)機(jī)定位

2022-10-08 00:03:00

Debug技巧調(diào)試

2021-03-18 07:52:42

代碼性能技巧開發(fā)

2019-04-23 11:21:57

ERP系統(tǒng)管理信息化

2022-08-17 13:30:43

爬蟲Python

2020-04-14 15:20:18

JSIF代碼

2012-06-18 15:18:32

JS

2015-03-16 11:33:16

程序員代碼bug

2020-12-09 18:16:48

容器云開發(fā)CaaS

2012-08-01 10:32:07

代碼

2013-08-30 13:40:42

喬布斯蘋果

2022-08-09 08:29:50

TIOBE編程語言排行榜程序員

2019-10-30 09:40:52

代碼程序員爬蟲

2015-02-05 09:24:48

代碼

2021-04-27 19:26:16

代碼項(xiàng)目工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)