天天看點

《C語言接口與實作:建立可重用軟體的技術》一1.2 程式設計風格

本節書摘來自異步社群《c語言接口與實作:建立可重用軟體的技術》一書中的第1章,第1.2節,作者 傅道坤,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

double說明了本書中程式所使用的風格慣例。程式能否更容易被閱讀并了解,比使程式更容易被計算機編譯更為重要。編譯器并不在意變量的名稱、代碼的布局或程式的子產品劃分方式。但這種細節對程式員閱讀以及了解程式的難易程度有很大影響。

本書代碼遵循c程式的一些既定的風格慣例。它使用一緻的慣例來命名變量、類型和例程,并在本書的排版約定下,采用一緻的縮進風格。風格慣例并非是一種必須遵循的剛性規則,它們表示的是程式設計的一種哲學方法,力求最大限度地增加程式的可讀性和可了解性。因而,凡是改變慣例能有助于強調代碼的重要方面或使複雜的代碼更可讀時,你完全可以違反“規則”。

一般來說,較長且富于語義的名稱用于全局變量和例程,而數學符号般的短名稱則用于局部變量。代碼塊〈compute x • y〉中的循環索引i屬于後一種慣例。對索引和變量使用較長的名稱通常會使代碼更難閱讀,例如下述代碼中

長變量名反而使代碼的語義含混不清。

變量的聲明應該靠近于其第一次使用的地方(可能在代碼塊中)。linenum的聲明很靠近在getword中首次使用該變量的地方,這就是個例子。在可能的情況下,局部變量的聲明在使用變量的複合語句的開始處。例如,代碼塊〈copy the word into buf[0..size-1] 5〉中對i的聲明。

一般來說,過程和函數的名稱,應能反映過程完成的工作及函數的傳回值。因而,getword應當傳回輸入中的下一個單詞,而doubleword則找到并顯示出現兩次或更多次的單詞。大多數例程都比較簡單,不會超過一頁代碼,代碼塊更短,通常少于12行。

代碼中幾乎沒有注釋,因為圍繞對應代碼塊的正文代替了注釋。有關注釋風格的建議幾乎會引發程式員間的戰争。本書将效法c程式設計方面的典範,最低限度地使用注釋。如果代碼很清晰,且使用了良好的命名和縮進慣例,則這樣的代碼通常是含義自明的。僅當進行解釋時(例如,解釋資料結構的細節、算法的特例以及異常情況)才需要注釋。編譯器無法檢查注釋是否與代碼一緻,誤導的注釋通常比沒有注釋更糟糕。最後,有些注釋隻不過是一種幹擾,其中的噪音和過多的版式掩蓋了注釋内容,進而使這些注釋隻會掩蓋代碼本身的含義。

文學程式設計避免了注釋戰争中的許多争論,因為它不受程式設計語言注釋機制的限制。程式員可以使用最适合于表達其意圖的任何版式特性,如表、方程、圖檔和引文。文學程式設計似乎提倡準确、精确和清晰。

本書中的代碼以c語言編寫,它所使用的大多數慣用法通常已被有經驗的c程式員所接受并希望采用。其中一些慣用法可能使不熟悉c語言的程式員困惑,但為了能用c語言流利地程式設計,程式員必須掌握這些慣用法。涉及指針的慣用法通常是最令人困惑的,因為c語言為指針的操作提供了幾種獨特且富有表達力的運算符。庫函數strcpy将一個字元串複制到另一個字元串中并傳回目标字元串,對該函數的不同實作就說明了“道地的c語言”和新手c程式員編寫的代碼之間的差别,後一種代碼通常使用數組:

“道地”的版本則使用指針:

這兩個版本都是strcpy的合理實作。指針版本使用通常的慣用法将指派、指針遞增和測試指派操作的結果合并為單一的指派表達式。它還修改了其參數dst和src,這在c語言中是可接受的,因為所有參數都是傳值的,實際上參數隻不過是已初始化的局部變量。

還可以舉出很好的例子,來表明使用數組版本比指針版本更好。例如,所有程式員都更容易了解數組版本,無論他們能否使用c語言流暢地程式設計。但指針版本是最有經驗的c程式員會編寫的那種代碼,因而程式員閱讀現存代碼時最有可能遇到它。本書可以幫助讀者學習這些慣用法、了解c語言的優點并避免易犯的錯誤。

繼續閱讀