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

編程人員怎樣才能寫出美麗的代碼

開發(fā) 后端 開發(fā)工具
應(yīng)該說,我們中的許多人,編程的歷史并不短,但很多時(shí)候,我們對(duì)自己編寫出來的代碼卻毫無自信,有時(shí)候自己見了都怕,盡管這段代碼實(shí)現(xiàn)了要求的功能。歸其原因,往往是代碼風(fēng)格差導(dǎo)致的代碼凌亂沒有美感,本文的目的就是要講解一般的良好風(fēng)格,幫助讀者寫出“美麗”的代碼,事先要說明的是文中所涉及到的語言有C、C++、JAVA及BASIC,我之所以用了三種語言而不是只用一種語言是為了向讀者表明風(fēng)格對(duì)語言的通用的。

  編程人員怎樣才能寫出美麗的代碼?本文將從以下10個(gè)方面講述:

  1. 標(biāo)識(shí)符(命名規(guī)則)

  標(biāo)識(shí)符應(yīng)當(dāng)直觀且可以拼讀,可望文知意,***采用英文單詞或其組合,便于記憶和閱讀,切忌使用漢語拼音來命名。長(zhǎng)名字能更好地表達(dá)含義,所以函數(shù)名、變量名、類名長(zhǎng)達(dá)十幾個(gè)字符不足為怪,例如:

  1. 好的命名 int student_age,teacher_age;  
  2. 壞的命名 int age1,age2; 

  但名字是否越長(zhǎng)越好呢?不是的,請(qǐng)看下面的例子:

  1. struct student  
  2.      {  
  3.           int student_age;    /* 壞的命名 */ 
  4.           char *student_name;  
  5.      }  
  6. struct student  
  7.      {  
  8.           int age;               /* 好的命名 */ 
  9.           char *name;  
  10.      } 

  為什么前者不好呢,因?yàn)楹芏嘤?,結(jié)構(gòu)體的名student已經(jīng)表達(dá)了student_age前面的student的意思。再比如字符串拷貝函數(shù):void StringCopy(char *str1, char *str2);我們很難搞清楚究竟是把str1拷貝到str2中,還是剛好倒過來??梢园褏?shù)名字起得更有意義,如叫strSource和trDestination。這樣從名字上就可以看出應(yīng)該把strSource拷貝到strDestination。單字符的名字也是有用的,常見的如i,j,k,m,n,x,y,z等,它們通??捎米骱瘮?shù)內(nèi)的局部變量。

  2. 運(yùn)算符的優(yōu)先級(jí)

  如果代碼行中的運(yùn)算符比較多,應(yīng)該用括號(hào)確定表達(dá)式的操作順序,避免使用默認(rèn)的優(yōu)先級(jí)。因?yàn)槭煊浉鬟\(yùn)算符的優(yōu)先級(jí)是比較困難的,就算你熟記并正確使用了,寫出來的代碼也容易產(chǎn)生歧義而使其可讀性較差。

  1. 好的風(fēng)格 if ((a | b) && (a & c))  
  2. 壞的風(fēng)格 if (a | b && a & c)   

  雖然后者和前者功能一樣,但后者是很恐怖的,難以閱讀。

  3. 不要編寫太復(fù)雜的復(fù)合表達(dá)式。

  復(fù)合表達(dá)式使用在適當(dāng)?shù)膱?chǎng)合可以使代碼更加簡(jiǎn)潔,但不能因?yàn)檫@個(gè)簡(jiǎn)潔而帶來理解的復(fù)雜。

  例如:

  1. max = a > b ?(a > c ? a : c) : (b > c ? b : c) // 復(fù)合表達(dá)式過于復(fù)雜 

  應(yīng)該修改為:

  1. max = a;  
  2. if(max < b)  
  3.   {  
  4.   max = b;  
  5.   }  
  6. if(max < c)  
  7.   {  
  8.   max = c;  
  9.   }  

  上面的if的執(zhí)行語句只有一行也加了{(lán)},是因?yàn)樽裱?ldquo;不論if、for、while的執(zhí)行語句有多少都要加{}”的規(guī)則,這樣可以防止書寫失誤,當(dāng)這樣的語句層層嵌套的時(shí)候你就會(huì)知道這樣做的好處。

  4. 各種數(shù)據(jù)類型與零值比較

  在JAVA中,對(duì)于布爾變量flag,與零值(注意:不是0)比較的方式自然是if (flag== TRUE)或者if (flag == FALSE),但是在C/C++中這卻不是正確的選擇。正確的選擇應(yīng)該是if (flag)或者if (!flag),這是因?yàn)門RUE的值究竟是什么并沒有統(tǒng)一的標(biāo)準(zhǔn),例如Visual C++ 將TRUE定義為1,而Visual Basic則將TRUE定義為-1。if (flag == TRUE)、if (flag == 1 )、if(flag == FALSE)、if (flag == 0)都屬于不良風(fēng)格。

  應(yīng)當(dāng)將整型變量用“==”或“!=”直接與0比較。

  1. if (value == 0)  
  2. if (value != 0) 

  不可以寫成

  1. if (value) // 會(huì)讓人誤解 value是布爾變量  
  2. if (!value)   

  指針變量的零值是NULL。盡管NULL的值與0相同,但是兩者意義不同。對(duì)于指針變量p ,它與零值比較的if語句如下:

  1. if (p == NULL)  
  2. if (p != NULL) 

  不要寫成

  1. if (p == 0) // 容易讓人誤解p是整型變量  
  2. if (p != 0)   

  5. 多層if語句

  不要出現(xiàn)這樣的結(jié)構(gòu):

  1. if (condition1)  
  2.  {  
  3.     …  
  4.      if (condition2)  
  5.      …  
  6.        if (condition3)  
  7.        …  
  8.          …  
  9.  }  

  而應(yīng)該代之以if-else-if結(jié)構(gòu):

  1. if (condition1)   
  2.   {   
  3.   …   
  4.   }   
  5.   else if (condition2)   
  6.   {   
  7.   …   
  8.   }   
  9.   else if (condition3)   
  10.   {   
  11.   …   
  12.   } …   

  這樣的結(jié)構(gòu)條理清楚,前者則容易導(dǎo)致寫到后來自己都不知道寫了些什么的事實(shí)??梢杂胹witch語句替換嵌套的if語句來實(shí)現(xiàn)多分支選擇。

#p#

  6. 改善循環(huán)的效率

  對(duì)于字符串name,看下面的循環(huán):

  1. for (i = 0; i < strlen(name); i++)效率明顯差于下面的循環(huán):  
  2. n = strlen(name);  
  3. for (i = 0; i < n; i++) 

  后者只要計(jì)算name的長(zhǎng)度一次。

  7. 少用、慎用goto語句,并不禁用

  goto語句能從多重循環(huán)體或者代碼堆里一下子跳到外面, 例如:

  1. { …  
  2. { …  
  3. { …  
  4. on error goto errorhandler;  
  5. }  
  6. }  
  7. }  
  8. errorhandler:  
  9. …      

  在Visual Basic中這一招是常用的。

  8. 消除魔鬼數(shù)

  魔鬼數(shù)者,沒名字的常數(shù)也,你若看英文資料,它們的說法是magic data,我們的一些作品將其翻譯為“魔術(shù)數(shù)”,我更愿意將其翻譯為“魔鬼數(shù)”,因?yàn)樗且粋€(gè)導(dǎo)致代碼的可讀性極差的“魔鬼”。

  假使你在程序里寫下下面的一段代碼:

  1. for (i=0; i < 100; i++);for (i=0; i < 99; i++); 

  誰都不知道100、99是個(gè)什么玩意,你可能意味著100是范圍的邊界(***值),就應(yīng)該給出定義,代碼的讀者才能明白你的意思:

  1. #define MAX 100 /* C語言的宏常量 */  
  2. const int MAX = 100; // C++ 語言的const常量  
  3. for (i=0; i < MAX; i++);for (i=0; i < MAX-1; i++)的意思就很清楚了。 

  并且如果某一常量與其它常量密切相關(guān),應(yīng)在定義中包含這種關(guān)系,而不應(yīng)給出一些孤立的值。

  例如:

  1. const float RADIUS = 100;  
  2. const float DIAMETER = RADIUS * 2;  

  9. 函數(shù)返回值

  函數(shù)名字與返回值類型在語義上不可沖突,C標(biāo)準(zhǔn)庫函數(shù)getchar違反了這一規(guī)則。

  例如:

  1. char c;  
  2. c = getchar();  
  3. if (c == EOF)   

  按照getchar名字的意思,將變量c聲明為char類型是很自然的事情。但不幸的是getchar的確不是char類型,而是int類型,其原型如下:

  1. int getchar(void); 

  10. 亂指一氣的指針

  “野指針”者,亂指一氣的指針也,它不是NULL指針,是指向“垃圾”內(nèi)存的指針。野指針是很危險(xiǎn)的,是經(jīng)常導(dǎo)致bug的原因,它的成因主有兩種:

  一是指針變量沒有被初始化。在C/C++中任何指針變量剛被創(chuàng)建時(shí)不會(huì)自動(dòng)成為NULL指針,它的缺省值是隨機(jī)的。所以,指針變量在創(chuàng)建的同時(shí)應(yīng)當(dāng)被初始化,要么將指針設(shè)置為NULL,要么讓它指向合法的內(nèi)存。例如:

  1. char *p = NULL;  
  2. char *str = (char *) malloc(100);    

  二是指針p被free或者delete之后,沒有置為NULL,讓人誤以為p是個(gè)合法的指針。

  關(guān)于編碼的風(fēng)格,筆者還有許多需要講解的,本文筆者暫時(shí)講到這里,希望能對(duì)編程者有所幫助。

【編輯推薦】

  1. 編寫超級(jí)可讀代碼的15個(gè)***實(shí)踐
  2. 編程必讀 15個(gè)編程好習(xí)慣
  3. c++編程常用工具
  4. Java程序員必讀 編程中的一些共同問題
  5. 程序員:永遠(yuǎn)不要去請(qǐng)示是否應(yīng)該整理你的代碼

 

責(zé)任編輯:韓亞珊 來源: 中國IT實(shí)驗(yàn)室
相關(guān)推薦

2012-12-27 14:11:21

簡(jiǎn)歷應(yīng)屆畢業(yè)生

2019-05-06 11:06:30

PyTorch深度學(xué)習(xí)框架

2022-02-21 08:00:23

開發(fā)代碼程序員

2018-07-16 12:36:48

編程語言PythonJava

2021-05-18 17:55:29

SaaS軟件

2010-09-02 09:44:16

室外WLAN

2015-11-16 10:48:35

2009-07-06 18:24:51

IT資產(chǎn)運(yùn)維管理廣通信達(dá)科技

2022-04-27 10:07:02

Linux文檔命令

2012-09-25 13:32:31

大數(shù)據(jù)Hadoop

2011-07-15 16:57:43

AJAX

2022-03-25 08:34:57

物聯(lián)網(wǎng)安全物聯(lián)網(wǎng)IOT

2020-04-10 09:07:09

BEC商業(yè)郵件欺詐網(wǎng)絡(luò)釣魚

2015-07-01 16:11:30

數(shù)據(jù)人才數(shù)據(jù)

2015-12-03 10:14:04

2020-02-28 15:37:58

架構(gòu)運(yùn)維技術(shù)

2022-04-11 15:05:32

元宇宙虛擬工作空間虛假身份注冊(cè)

2011-12-15 21:16:08

蘋果

2015-10-28 17:35:51

資本

2017-04-05 06:40:32

科技新聞早報(bào)
點(diǎn)贊
收藏

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