成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

  1. 標識符(命名規則)

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

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

  但名字是否越長越好呢?不是的,請看下面的例子:

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

  為什么前者不好呢,因為很多余,結構體的名student已經表達了student_age前面的student的意思。再比如字符串拷貝函數:void StringCopy(char *str1, char *str2);我們很難搞清楚究竟是把str1拷貝到str2中,還是剛好倒過來??梢园褏得制鸬酶幸饬x,如叫strSource和trDestination。這樣從名字上就可以看出應該把strSource拷貝到strDestination。單字符的名字也是有用的,常見的如i,j,k,m,n,x,y,z等,它們通??捎米骱瘮祪鹊木植孔兞?。

  2. 運算符的優先級

  如果代碼行中的運算符比較多,應該用括號確定表達式的操作順序,避免使用默認的優先級。因為熟記各運算符的優先級是比較困難的,就算你熟記并正確使用了,寫出來的代碼也容易產生歧義而使其可讀性較差。

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

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

  3. 不要編寫太復雜的復合表達式。

  復合表達式使用在適當的場合可以使代碼更加簡潔,但不能因為這個簡潔而帶來理解的復雜。

  例如:

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

  應該修改為:

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

  上面的if的執行語句只有一行也加了{},是因為遵循了“不論if、for、while的執行語句有多少都要加{}”的規則,這樣可以防止書寫失誤,當這樣的語句層層嵌套的時候你就會知道這樣做的好處。

  4. 各種數據類型與零值比較

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

  應當將整型變量用“==”或“!=”直接與0比較。

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

  不可以寫成

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

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

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

  不要寫成

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

  5. 多層if語句

  不要出現這樣的結構:

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

  而應該代之以if-else-if結構:

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

  這樣的結構條理清楚,前者則容易導致寫到后來自己都不知道寫了些什么的事實??梢杂胹witch語句替換嵌套的if語句來實現多分支選擇。

#p#

  6. 改善循環的效率

  對于字符串name,看下面的循環:

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

  后者只要計算name的長度一次。

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

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

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

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

  8. 消除魔鬼數

  魔鬼數者,沒名字的常數也,你若看英文資料,它們的說法是magic data,我們的一些作品將其翻譯為“魔術數”,我更愿意將其翻譯為“魔鬼數”,因為它是一個導致代碼的可讀性極差的“魔鬼”。

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

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

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

  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++)的意思就很清楚了。 

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

  例如:

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

  9. 函數返回值

  函數名字與返回值類型在語義上不可沖突,C標準庫函數getchar違反了這一規則。

  例如:

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

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

  1. int getchar(void); 

  10. 亂指一氣的指針

  “野指針”者,亂指一氣的指針也,它不是NULL指針,是指向“垃圾”內存的指針。野指針是很危險的,是經常導致bug的原因,它的成因主有兩種:

  一是指針變量沒有被初始化。在C/C++中任何指針變量剛被創建時不會自動成為NULL指針,它的缺省值是隨機的。所以,指針變量在創建的同時應當被初始化,要么將指針設置為NULL,要么讓它指向合法的內存。例如:

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

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

  關于編碼的風格,筆者還有許多需要講解的,本文筆者暫時講到這里,希望能對編程者有所幫助。

【編輯推薦】

  1. 編寫超級可讀代碼的15個***實踐
  2. 編程必讀 15個編程好習慣
  3. c++編程常用工具
  4. Java程序員必讀 編程中的一些共同問題
  5. 程序員:永遠不要去請示是否應該整理你的代碼

 

責任編輯:韓亞珊 來源: 中國IT實驗室
相關推薦

2012-12-27 14:11:21

簡歷應屆畢業生

2019-05-06 11:06:30

PyTorch深度學習框架

2022-02-21 08:00:23

開發代碼程序員

2018-07-16 12:36:48

編程語言PythonJava

2010-09-02 09:44:16

室外WLAN

2021-05-18 17:55:29

SaaS軟件

2015-11-16 10:48:35

2009-07-06 18:24:51

IT資產運維管理廣通信達科技

2022-04-27 10:07:02

Linux文檔命令

2011-07-15 16:57:43

AJAX

2012-09-25 13:32:31

大數據Hadoop

2022-03-25 08:34:57

物聯網安全物聯網IOT

2015-12-03 10:14:04

2020-02-28 15:37:58

架構運維技術

2022-04-11 15:05:32

元宇宙虛擬工作空間虛假身份注冊

2015-07-01 16:11:30

數據人才數據

2020-04-10 09:07:09

BEC商業郵件欺詐網絡釣魚

2011-12-15 21:16:08

蘋果

2010-03-15 11:47:11

網絡安全

2017-04-05 06:40:32

科技新聞早報
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美成人一区二区三区 | 午夜影院操 | 国产成人免费视频 | 日本人做爰大片免费观看一老师 | 911网站大全在线观看 | 在线看成人av | 国产成人99久久亚洲综合精品 | 精品日韩在线观看 | 国产一区二区影院 | 日本一区二区高清视频 | 国产精品一区在线观看 | 草草精品| 国产精品久久久久久吹潮 | 日韩欧美国产精品 | 国产一区二区免费在线 | 在线免费观看欧美 | 欧美日韩1区 | 日本超碰| 东方伊人免费在线观看 | 午夜激情一区 | 国产精品久久久久久久久久免费 | 久久精品色欧美aⅴ一区二区 | 久国产视频 | 999久久久免费精品国产 | 国产福利免费视频 | 美女视频一区二区三区 | 一区二区在线 | 国产精品一区二区三区99 | 91视频久久 | 别c我啊嗯国产av一毛片 | 精品国产一区二区三区在线观看 | 国产精品片 | 亚洲一区国产精品 | 色黄视频在线 | 中文字幕一区二区视频 | 99精品久久 | 91欧美| 91精品久久久久久久久久入口 | 午夜免费福利影院 | 九九综合 | 伊人网伊人网 |