歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> UNIX 風格的命名習慣

UNIX 風格的命名習慣

日期:2017/2/28 15:58:48   编辑:Linux教程
有一個標准的編程風格非常重要,真的非常重要,千萬不要不以為然, 尤其是大團隊合作. 同時,遵循統一的命名規則, 程序代碼看起來也更漂亮,更容易讀懂.

主要有2種命名規則,一是Windows風格的匈牙利命名法. 我做了好幾年的MFC開發. 我感覺匈法挺好的,不像一些人說的那樣, 不可否認微軟也出好東西. 匈法的優點在於類型,作用域一目了然, 也非常完善,規則覆蓋了變量名,函數名,類名,類的數據成員等. 這對於公司內部學習和規范化是非常好的, 有現成的范本可以依照. 另一種就是所謂的 unix風格. 主要是一些經典C程序的慣用規則. 並沒有一套非常明確的說法. 所以在網上搜匈法很容易,但是專門說unix風格的就很少, 我認為所謂"unix風格"都是一些被普遍接受的習慣 , 隱藏在大眾的各個源代碼中,並沒有固定的,硬性的規則 (所以,前面我稱之為習慣), 小子不自量力, 來嘗試總結一下, 歡迎斧正和補充.

習慣1 - 變量名/函數名 以小寫的單詞用下劃線連接 (又被形象的稱為駝峰式命名). 比如 用戶名 user_name , 總數 total_count. 單詞選擇首先要貼切,其次才考慮長短. 可以視情況采用縮寫,但是不應過度縮寫. 比如習慣上常用的 min, max 等都是非常好的縮寫 (類似的還有 sum, num, str...) 總而言之,要做到望文知意, 否則寧願用長一點的單詞.

注1: 也有一種命名函數名的風格是 首字母小寫,後面單詞首字母大寫,中間不用連接符, 比如 getMaxValue(). 類名單詞首字母大寫不用分隔符,如 class MyDateClass; 類的成員首單詞首字母小寫後面的單詞首字母大寫 如 int MyClass::myFunc(); 數據成員也是這樣, 如 bool MyClass::writeOnly; <> 和 <>用的就是這個風格. JAVA的代碼也偏向這個風格.

注2: 有些人喜歡用首字母大寫的方式(不用下劃線連接)命名全局的變量/函數. 如果 AddChild(), MaxValue 等.我個人不是很喜歡,這樣看起來像匈法的風格,不要混用.

習慣2 - 類名首字母用大寫,以區分函數名和變量名,單詞間用下劃線連接. 如 class Date; class Base_date; 標准庫了類名都是小寫的. 自定義的結構體也用小寫.

關於這一點, 由於C的歷史要長得多,大量的經典代碼都是C寫的, 所以在這些經典代碼中看不到類命名的習慣寫法. 不過神人Bjarne.Stroustrup 的 << The C++ Programming>> 裡的代碼絕大部分的類的首字母都大寫, 鑒於C++之父的巨大影響力,相信其代碼風格也會被廣泛模仿.我特意對照了英文版和中文版,都一樣,不要告訴我是排版錯誤.-) 不過,總的說來,和類相關的命名習慣比較混亂.

習慣3 - 用全部大寫單詞加下劃線命名常量. 常量名前加下劃線一般被編譯器或者庫函數使用. 自定義的常量前面不要加下劃線. #define SIZE 10 / const int MAX_VALUE= 10; 等

習慣4 - i, j, k, m, n, x, y, z 等單字母變量普遍被用在索引,循環語句控制,數學函數等處. 不應濫用.

習慣5 - Linux函數命名一般采取 "前綴_名詞_動詞" 的方式, 前綴為模塊縮寫,用大寫字母 IO_get_char(), 如. 普通函數則采用 "名詞_動詞" 的方式命名,小寫字母, 比如獲總數 get_total_count(). 如果是類的成員函數則采用 "動詞" 的方式命名, 因為"名詞"的含義已經隱藏在類名裡了, 如 box.draw().

習慣6 - 采用通用的前綴和後綴命名變量能提高可讀性.

_ptr Suffix for pointer
Examples:
int *entry_ptr; /* Pointer to current entry */
char *last_ptr; /* Pointer to last char in str */


_p Another suffix for pointer. This can be a little confusing to people who are not
familiar with it, so the suffix _ptr is preferred.
Examples:
event *next_p;/* Pointer to next event in queue */
char *word_p; /* Pointer to start of next word */


_file A variable of type FILE *, or a C++ I/O stream.
Examples:
FILE *in_file; /* Input data file */
FILE *database_file;/*Where we put the database */


_fd File descriptor (returned by the open function.)
Examples:
/* The dictionary file descriptor */
int dictionary_fd;
/* File where we put the memory dump */
int dump_fd;


n_ Number of. For example, if you store a set of events in the array events, the
n_events is the number of entries in the events array. Does this violate the rule
about putting the most important word first? Yes, but it's established usage.
Examples:
/* A list of events */
int events[EVENT_MAX];
/* Number of items in event array */
int n_events = 0;
/* A list of accounts */
struct account account;
/* Number of accounts seen so far */
int n_accounts = 0;

以上總結的習慣主要來源上海貝爾的<<< C++編程規范 >> 和 Steve Oualline的<< C Elements of Style>>,應該說還是有一定權威性. 不過, 最好的方法是閱讀權威的 unix/linux 源代碼 , 看看大師們是怎麼命名的, 比如 linux 的源代碼就很容易找到 - << Linux 內核完全注釋 >> 趙炯.

以下說說我自己的看法,僅供參考:

補充1 - 對於全局函數/變量名可以采用前綴 g_ , 靜態函數/成員可以采用前綴 s_ (匈法也有類似的建議,但我認為這不會破壞unix風格的一致性, 都是小寫字母和下劃線)

補充2 - 類的數據成員用 m_ 前綴 或者 針對非public的數據成員, 用_前綴 (一個下劃線前綴), 對public的成員和函數名相同規則, 在定義類的成員函數時,方便區分<< C++ Primer >>用這種風格.

Copyright © Linux教程網 All Rights Reserved