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

6個(gè)編寫優(yōu)質(zhì)干凈代碼的技巧

開發(fā) 前端
編寫干凈的代碼并不是一件容易的事情,這需要嘗試不同的技巧和實(shí)踐。問(wèn)題是,在這個(gè)問(wèn)題上有太多的實(shí)踐和技巧,因此開發(fā)人員很難進(jìn)行選擇,所以要把這個(gè)問(wèn)題簡(jiǎn)化一下。在本文中,將首先討論編寫干凈代碼的一些好處,然后將討論6個(gè)技巧或者實(shí)踐,用于編寫最常用的干凈代碼。

【譯者注】作為一名開發(fā)者,編寫一手干凈的代碼很重要,所以在本文中作者先列舉出編寫干凈代碼的一些好處,再提出6個(gè)技巧用于編寫干凈代碼,供開發(fā)者進(jìn)行參考學(xué)習(xí)。

以下為譯文:

編寫干凈的代碼并不是一件容易的事情,這需要嘗試不同的技巧和實(shí)踐。問(wèn)題是,在這個(gè)問(wèn)題上有太多的實(shí)踐和技巧,因此開發(fā)人員很難進(jìn)行選擇,所以要把這個(gè)問(wèn)題簡(jiǎn)化一下。在本文中,將首先討論編寫干凈代碼的一些好處,然后將討論6個(gè)技巧或者實(shí)踐,用于編寫最常用的干凈代碼。

[[203596]]

以下是目錄內(nèi)容:

引用

編寫干凈代碼的好處

  1. 更容易開始和繼續(xù)一個(gè)項(xiàng)目
  2. 有利于團(tuán)隊(duì)新員工培訓(xùn)
  3. 更容易遵循編碼模式

寫干凈代碼的技巧

  1. 編寫可讀的代碼
  2. 為變量、函數(shù)和方法使用有意義的名稱
  3. 讓每個(gè)函數(shù)或方法只執(zhí)行一個(gè)任務(wù)
  4. 使用注釋來(lái)解釋代碼
  5. 保持代碼風(fēng)格一致性
  6. 定期檢查你的代碼

關(guān)于編寫干凈代碼的一些想法

寫干凈代碼的好處

先來(lái)了解編寫干凈代碼的一些好處。其中一個(gè)主要好處是,干凈的代碼可以減少花在閱讀上的時(shí)間和理解代碼的時(shí)間。凌亂的代碼會(huì)減慢任何開發(fā)人員的速度,使開發(fā)者的工作變得更加困難。代碼越混亂,開發(fā)人員就越需要花更多的時(shí)間去充分理解它,這樣才能使用這些代碼。而且,如果代碼太亂,開發(fā)人員可能會(huì)決定停止閱讀這些代碼,并自己從頭開始編寫。

1.更容易開始和繼續(xù)一個(gè)項(xiàng)目

先用一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明這個(gè)問(wèn)題。假設(shè)在很長(zhǎng)一段時(shí)間后我們回到了之前的一個(gè)項(xiàng)目,也許在這段時(shí)間是一位客戶聯(lián)系我們?nèi)プ隽肆硪豁?xiàng)工作?,F(xiàn)在,想象一下,那時(shí)如果沒(méi)有編寫干凈的代碼,那么在第一眼看到代碼之后,該是有多糟糕和混亂。而且,也可以知道從當(dāng)初離開的地方開始編碼有多困難。

因此,現(xiàn)在必須花更多的時(shí)間在項(xiàng)目上,因?yàn)槲覀冃枰斫庵熬帉懙拇a。這本來(lái)是可以避免的,如果從一開始就編寫干凈的代碼,然而現(xiàn)在必須為此付出代價(jià)。而且,舊代碼是如此混亂和糟糕,以至于我們可能決定從頭開始??蛻袈牭竭@些消息后可能不會(huì)高興。

另一方面,干凈的代碼通常就沒(méi)有這個(gè)問(wèn)題。假設(shè)前面的例子是相反的情況,以前的代碼是干凈和優(yōu)雅的,那么理解它需要多長(zhǎng)時(shí)間?也許只需要讀幾分鐘的代碼就能理解所有的工作原理,而且我們可能已經(jīng)開始編寫一段時(shí)間了,所以在這種情況下花的精力將明顯小于第一個(gè)案例,同時(shí),客戶也不會(huì)太在意。

這是編寫干凈代碼的第一個(gè)好處,而且,這不僅適用于自己的項(xiàng)目,也適用于其他開發(fā)人員的工作。干凈的代碼可以更快地啟動(dòng)工作,任何人都不需要花費(fèi)數(shù)小時(shí)來(lái)研究代碼,相反,我們可以直接進(jìn)入工作。

2.有利于團(tuán)隊(duì)新員工培訓(xùn)

編寫干凈代碼的另一個(gè)好處與第一個(gè)好處是密切相關(guān)的,那就是可以讓新員工更容易更快地使用代碼。假設(shè)我們需要雇傭一個(gè)開發(fā)人員,那么她要花多長(zhǎng)時(shí)間才能理解代碼并學(xué)會(huì)使用它呢?當(dāng)然這要視情況而定。如果我們的代碼很亂,寫得很差,她就需要花更多的時(shí)間來(lái)學(xué)習(xí)代碼。另一方面,如果代碼干凈、易讀、簡(jiǎn)單易懂,她將能夠更快地開始她的工作。

有些人可能會(huì)說(shuō),這不是個(gè)問(wèn)題,因?yàn)槠渌_發(fā)人員可以幫助她。當(dāng)然這是正確的,但是幫助只應(yīng)該花很短的時(shí)間,是兩三次或者一兩天,而并不應(yīng)該是兩三個(gè)星期。所以,決定雇傭另一個(gè)開發(fā)人員的目的,是來(lái)加速我們的工作,而不是減慢速度,也不是花費(fèi)更多的時(shí)間來(lái)幫助她學(xué)會(huì)使用代碼。

當(dāng)我們努力寫出干凈的代碼時(shí),其他人就會(huì)向我們學(xué)習(xí),也就更容易跟著寫出干凈的代碼。當(dāng)然,仍然需要留出一些時(shí)間來(lái)幫助每個(gè)新開發(fā)人員了解和理解代碼。當(dāng)然,我的意思是幾天,而不是幾周。此外,干凈的代碼將幫助團(tuán)隊(duì)帶來(lái)更多的開發(fā)人員,并同時(shí)幫助他們理解代碼。簡(jiǎn)單地說(shuō),代碼越簡(jiǎn)潔就越容易解釋,誤解也就越少。

3.更容易遵循編碼模式

有一件事需要記住,理解和學(xué)習(xí)如何使用代碼是一回事。然而,這僅僅是個(gè)開始,同時(shí)還需要確保開發(fā)人員能夠愿意遵循我們的編碼模式。當(dāng)然,使用干凈的代碼比混亂的代碼更容易實(shí)現(xiàn)這個(gè)目標(biāo)。這是很重要的,因?yàn)閳F(tuán)隊(duì)不僅想要編寫干凈的代碼,而且還一直保持這種模式,這也是需要長(zhǎng)期思考的。

另外,如果開發(fā)人員不遵循當(dāng)前的編碼模式該怎么辦? 這個(gè)問(wèn)題通??梢宰孕薪鉀Q。假設(shè)有一群人在同一個(gè)代碼基礎(chǔ)上工作,其中一個(gè)人開始偏離標(biāo)準(zhǔn)樣式。然后,團(tuán)隊(duì)的其他成員將推動(dòng)這個(gè)開發(fā)人員遵循標(biāo)準(zhǔn)。她會(huì)接受建議,因?yàn)樗幌腚x開這個(gè)團(tuán)隊(duì)。

還有一種情況,開發(fā)人員會(huì)說(shuō)服團(tuán)隊(duì)的其他人采納并遵循自己的編碼模式。如果開發(fā)人員提出的編碼模式更干凈,并且能帶來(lái)更好的結(jié)果,這當(dāng)然是件好事。的確,編寫和保持干凈的代碼并不意味著應(yīng)該忽略任何改進(jìn)它的機(jī)會(huì),我認(rèn)為應(yīng)該始終對(duì)目前的做法保持可改進(jìn)的態(tài)度,并努力尋找改進(jìn)的機(jī)會(huì)。

因此,如果一個(gè)開發(fā)人員偏離了當(dāng)前的模式,同時(shí)她的模式也更好,那么我們做出改變也許會(huì)更合適。所以在嘗試其他模式之前,不應(yīng)該忽視其他人的編碼實(shí)踐,同時(shí)我們應(yīng)該繼續(xù)尋找改進(jìn)的余地。最后,第三種情況。開發(fā)人員決定既不采用我們的實(shí)踐,也不說(shuō)服我們采用她的實(shí)踐。因?yàn)樗龑Q定離開團(tuán)隊(duì)。

寫干凈代碼的技巧

現(xiàn)在除了討論編寫干凈代碼的好處,也是時(shí)候?qū)W習(xí)一些技巧來(lái)幫助我們實(shí)現(xiàn)這個(gè)目標(biāo)了。正如將在以下看到的,干凈的代碼包含并遵循著一些方法。這些方法使代碼更干凈、易讀、更易于理解、更簡(jiǎn)單。當(dāng)然沒(méi)有必要實(shí)施所有的方法,實(shí)施并遵循一兩項(xiàng)措施就足以帶來(lái)積極的結(jié)果。

1.編寫可讀的代碼

的確,所寫的代碼將會(huì)機(jī)器解釋,然而這并不意味著應(yīng)該忽視代碼的可讀性和可理解性,因?yàn)樵趯?lái)總會(huì)有另一個(gè)人會(huì)使用我們寫的代碼。即使讓別人無(wú)法訪問(wèn)我們的代碼,但我們自己也可能在將來(lái)又重新拾起這些代碼。出于這些原因,讓代碼便于閱讀和理解是符合我們自己的利益的。那么如何實(shí)現(xiàn)呢?

最簡(jiǎn)單的方法是使用空格。在發(fā)布代碼之前,可以縮減代碼,但是沒(méi)有必要讓代碼看起來(lái)很小型化。相反,可以使用縮進(jìn)、換行和空行來(lái)使代碼結(jié)構(gòu)更具可讀性。當(dāng)決定采用這種方式時(shí),代碼的可讀性和可理解性就會(huì)顯著提高。然后,看著代碼就可以更容易理解它了。來(lái)看兩個(gè)簡(jiǎn)單的例子。

 

  1. // Bad 
  2. const userData=[{userId: 1, userName: 'Anthony Johnson', memberSince: '08-01-2017', fluentIn: [ 'English''Greek''Russian']},{userId: 2, userName: 'Alice Stevens', memberSince: '02-11-2016', fluentIn: [ 'English''French''German']},{userId: 3, userName: 'Bradley Stark', memberSince: '29-08-2013', fluentIn: [ 'Czech''English''Polish']},{userId: 4, userName: 'Hirohiro Matumoto', memberSince: '08-05-2015', fluentIn: [ 'Chinese''English''German''Japanese']}]; 
  3.  
  4. // Better 
  5. const userData = [ 
  6.   { 
  7.     userId: 1, 
  8.     userName: 'Anthony Johnson'
  9.     memberSince: '08-01-2017'
  10.     fluentIn: [ 
  11.       'English'
  12.       'Greek'
  13.       'Russian' 
  14.     ] 
  15.   }, { 
  16.     userId: 2, 
  17.     userName: 'Alice Stevens'
  18.     memberSince: '02-11-2016'
  19.     fluentIn: [ 
  20.       'English'
  21.       'French'
  22.       'German' 
  23.     ] 
  24.   }, { 
  25.     userId: 3, 
  26.     userName: 'Bradley Stark'
  27.     memberSince: '29-08-2013'
  28.     fluentIn: [ 
  29.       'Czech'
  30.       'English'
  31.       'Polish' 
  32.     ] 
  33.   }, { 
  34.     userId: 4, 
  35.     userName: 'Hirohiro Matumoto'
  36.     memberSince: '08-05-2015'
  37.     fluentIn: [ 
  38.       'Chinese'
  39.       'English'
  40.       'German'
  41.       'Japanese' 
  42.     ] 
  43.   } 
  44. ]; 
  45.  
  46. // Bad 
  47. class CarouselLeftArrow extends Component{render(){return ( <a href="#" className="carousel__arrow carousel__arrow--left" onClick={this.props.onClick}> <span className="fa fa-2x fa-angle-left"/> </a> );}}; 
  48.  
  49. // Better 
  50. class CarouselLeftArrow extends Component { 
  51.   render() { 
  52.     return ( 
  53.       <a 
  54.         href="#" 
  55.         className="carousel__arrow carousel__arrow--left" 
  56.         onClick={this.props.onClick} 
  57.       > 
  58.         <span className="fa fa-2x fa-angle-left" /> 
  59.       </a> 
  60.     ); 
  61.   } 
  62. }; 

 

2.為變量、函數(shù)和方法使用有意義的名稱

來(lái)看一看第二個(gè)技巧,它將幫助我們編寫可理解和干凈的代碼。這個(gè)技巧是關(guān)于變量、函數(shù)和方法的有意義的名稱。“有意義的”是什么意思?有意義的名字是描述性足夠多的名字,而不僅僅是編寫者自己才能夠理解的變量、函數(shù)或方法。換句話說(shuō),名稱本身應(yīng)該根據(jù)變量、函數(shù)或方法的內(nèi)容和使用方式來(lái)定義。

 

  1. // Bad 
  2. const fnm = ‘Tom’; 
  3. const lnm = ‘Hanks’ 
  4. const x = 31; 
  5. const l = lstnm.length; 
  6. const boo = false
  7. const curr = true
  8. const sfn = ‘Remember the name’; 
  9. const dbl = [‘1984’, ‘1987’, ‘1989’, ‘1991’].map((i) => { 
  10.   return i * 2; 
  11. }); 
  12.  
  13. // Better 
  14. const firstName = ‘Tom’; 
  15. const lastName = ‘Hanks’ 
  16. const age = 31; 
  17. const lastNameLength = lastName.length; 
  18. const isComplete = false
  19. const isCurrentlyActive = true
  20. const songFileName = ‘Remember the name’; 
  21. const yearsDoubled = [‘1984’, ‘1987’, ‘1989’, ‘1991’].map((year) => { 
  22.   return year * 2; 
  23. }); 

 

然而需要注意的是,使用描述性名稱并不意味著可以隨意使用任意多個(gè)字符。一個(gè)好的經(jīng)驗(yàn)則是將名字限制在3或4個(gè)單詞。如果需要使用超過(guò)4個(gè)單詞,說(shuō)明這個(gè)函數(shù)或方法需要同時(shí)執(zhí)行很多的任務(wù),所以應(yīng)該簡(jiǎn)化代碼,只使用必要的字符。

3.讓一個(gè)函數(shù)或方法只執(zhí)行一個(gè)任務(wù)

當(dāng)開始編寫代碼時(shí),使用的函數(shù)和方法看起來(lái)就像一把瑞士軍刀,幾乎可以處理任何事情,但是很難找到一個(gè)好的命名。另外,除了編寫者,幾乎沒(méi)有人知道函數(shù)是用來(lái)做什么的以及該如何使用它。有時(shí)我就會(huì)遇到這些問(wèn)題,我在這方面做的很不好。

然后,有人提出了一個(gè)很好的建議:讓每個(gè)函數(shù)或方法只執(zhí)行一個(gè)任務(wù)。這個(gè)簡(jiǎn)單的建議改變了一切,幫助我寫出了干凈的代碼,至少比以前更干凈了。從那以后,其他人終于能夠理解我的代碼了,或者說(shuō),他們不需要像以前一樣花很多時(shí)間去讀懂代碼了,功能和方法也變得更好理解。在相同的輸入下,總是能產(chǎn)生相同的輸出,而且,命名也變得容易得多。

如果你很難找到函數(shù)和方法的描述性名稱,或者需要編寫冗長(zhǎng)的指令以便其他人可以使用,那請(qǐng)考慮這個(gè)建議,讓每個(gè)函數(shù)或方法只執(zhí)行一個(gè)任務(wù)。如果你的功能和方法看起來(lái)像瑞士軍刀一樣無(wú)所不能,那請(qǐng)你執(zhí)行這個(gè)方法,相信我,這種多才多藝不是一種優(yōu)勢(shì)。這是一個(gè)相當(dāng)不利的情況,可能會(huì)產(chǎn)生事與愿違的結(jié)果。

附注:這種讓每一個(gè)函數(shù)或方法只執(zhí)行一項(xiàng)任務(wù)的做法被稱為保持純函數(shù)。這種編碼實(shí)踐來(lái)自于函數(shù)式編程的概念。如果你想了解更多,我推薦閱讀《So You Want to be a Functional Programmer series[4]》。

 

  1. // Examples of pure functions 
  2. function subtract(x, y) { 
  3.     return x - y; 
  4.  
  5. function multiply(x, y) { 
  6.     return x * y; 
  7.  
  8. // Double numbers in an array 
  9. function doubleArray(array) { 
  10.   return array.map(number => number * 2) 

 

4.更容易遵循編碼模式

不管多么努力地為變量、函數(shù)和方法想出有意義的名字,代碼仍然不可能完全清晰易懂,還有一些思路需要進(jìn)行解釋。問(wèn)題可能不是代碼很難理解或使用,相反,其他人可能不理解為什么要實(shí)現(xiàn)這個(gè)函數(shù)或方法,或者為什么要以特定的方式創(chuàng)建它。意思是,創(chuàng)建函數(shù)或方法的意圖還不清楚。

有時(shí)可能不得不采用非傳統(tǒng)的方法來(lái)解決問(wèn)題,因?yàn)闆](méi)有足夠的時(shí)間來(lái)想出更好的解決方案,這也很難用代碼來(lái)解釋。所以,通過(guò)代碼注釋可以幫助解決這個(gè)問(wèn)題,也可以幫助我們向其他人解釋為什么寫了這個(gè)方法,為什么要用這種特定的方式來(lái)寫,那么其他人就不必猜測(cè)這些方法或函數(shù)的用途了。

更重要的是,當(dāng)我們使用注來(lái)解釋代碼后,其他人可能會(huì)找到一個(gè)更好的方法來(lái)解決這個(gè)問(wèn)題并改進(jìn)代碼。這是有可能的,因?yàn)樗麄冎绬?wèn)題是什么,以及期望的結(jié)果是什么。如果不知道這些信息,其他人就很難創(chuàng)建更好的解決方案,或者他們可能不會(huì)去嘗試,因?yàn)樗麄冋J(rèn)為沒(méi)有必要去修改創(chuàng)建者自己的想法。

因此,每當(dāng)自己決定使用一些快速修復(fù)或非傳統(tǒng)的方法時(shí),要用注釋來(lái)解釋為什么這么做。最好是用一兩行注釋來(lái)解釋,而不用別人來(lái)猜測(cè)。

也就是說(shuō),我們應(yīng)該只在必要的時(shí)候使用注釋,而不是解釋糟糕的代碼。編寫無(wú)窮無(wú)盡的注釋將無(wú)助于將糟糕的代碼轉(zhuǎn)換成干凈的代碼。如果代碼不好,應(yīng)該通過(guò)改進(jìn)代碼來(lái)解決這個(gè)問(wèn)題,而不是添加一些如何使用它的說(shuō)明。編寫干凈的代碼更重要。

5.保持代碼風(fēng)格一致性

當(dāng)我們有自己喜歡的特定編碼方式或風(fēng)格時(shí),就會(huì)在任何地方一直使用它。但在不同的項(xiàng)目中使用不同的編碼風(fēng)格不是一個(gè)好主意,而且也不可能很自然地回到以前的代碼,所以仍然需要一些時(shí)間來(lái)理解在項(xiàng)目中使用的編碼風(fēng)格。

最好的方法是選擇一套編碼方式,然后在所有的項(xiàng)目中堅(jiān)持使用。這樣的話,回到之前的舊代碼會(huì)變得更容易。當(dāng)然,嘗試新的編碼方式是一件好事,它可以幫助我們找到更好的方法來(lái)開展工作。但是最好是在不同的實(shí)驗(yàn)項(xiàng)目或練習(xí)上嘗試不同的編碼風(fēng)格,而不是在主要項(xiàng)目上進(jìn)行。

另外,當(dāng)我們決定做一些試驗(yàn)的時(shí)候,就應(yīng)該嘗試多次練習(xí),應(yīng)該花時(shí)間徹底地做好。只有真正確信喜歡這種做法,并且對(duì)它感到滿意時(shí),才應(yīng)該去實(shí)施它。而且決定這樣做的時(shí)候,最好應(yīng)用在所有的項(xiàng)目中。是的,這需要時(shí)間,這也會(huì)促使我們正確地思考。

6.檢查你的代碼

這是最后一個(gè)技巧。不僅僅是編寫干凈的代碼,還要完成最后的工作,那就是需要維護(hù)干凈代碼。我們應(yīng)該定期檢查代碼,并試著改進(jìn)它。否則,如果不審查和更新我們的舊代碼,它很快就會(huì)過(guò)時(shí),就像我們的設(shè)備一樣。如果想讓代碼保持最佳狀態(tài),就需要定期更新它們。

對(duì)于每天使用的代碼,情況也是如此。代碼會(huì)變得更加復(fù)雜和混亂,所有應(yīng)該避免這種情況發(fā)生,并保持代碼干凈。實(shí)現(xiàn)這一點(diǎn)的唯一方法是定期檢查我們的代碼。換句話說(shuō),我們需要保持它。對(duì)于那些未來(lái)不再關(guān)心的項(xiàng)目來(lái)說(shuō),這可能是不必要的,但對(duì)其他的來(lái)說(shuō),維護(hù)代碼是工作的一部分。

關(guān)于編寫干凈代碼的一些想法

今天討論的這六種做法,可能不是影響最大的,也可能不是最重要的,但這些是經(jīng)驗(yàn)豐富的開發(fā)人員最常提到的,這也就是我選擇它們的原因。我希望這些實(shí)踐或技巧能夠幫助你開始編寫干凈的代碼?,F(xiàn)在,就像所有的事情一樣,最重要的是開始。所以,至少選一個(gè)技巧,然后試一試。

責(zé)任編輯:未麗燕 來(lái)源: ITeye
相關(guān)推薦

2020-05-27 10:38:16

開發(fā)代碼技巧

2020-07-15 14:51:39

代碼C+開發(fā)

2023-03-27 15:05:10

Python技巧

2022-07-18 10:15:16

Python

2022-06-07 09:30:35

JavaScript變量名參數(shù)

2020-08-27 07:00:00

代碼軟件應(yīng)用程序

2014-08-11 12:54:27

構(gòu)建模塊代碼審查編程

2014-07-29 13:55:10

程序員代碼

2024-06-24 10:31:46

2025-01-14 00:01:01

2017-11-16 15:18:42

Clean Code技巧代碼

2023-01-27 14:53:03

2020-05-08 19:52:31

Reactreact.js前端

2024-01-30 08:54:05

JavaScript技巧代碼

2021-02-23 10:48:30

Python代碼開發(fā)

2024-02-23 08:00:00

2020-08-06 16:34:48

Python開發(fā)工具

2024-04-09 14:27:39

2020-06-23 07:50:13

Python開發(fā)技術(shù)

2022-08-28 19:03:18

JavaScript編程語(yǔ)言開發(fā)
點(diǎn)贊
收藏

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