官术网_书友最值得收藏!

1.6 命名的藝術

在給代碼中的變量和函數取名時,要盡量使用正確的英文術語及其簡寫。

但需要注意的是,不同的領域有不同的術語使用習慣。比如,當我們的代碼涉及樹形數據結構時,就會經常使用如下英文術語。

node:表示樹形數據結構中的一個節點;不要用itemelement表示節點,這兩個詞的準確含義為條目元素

child:表示子節點。

sibling:表示兄弟節點,不要用brother表示兄弟節點。

parentroot:分別表示父節點和根節點,不要使用father或者mother等表示上一級節點。

firstlast:分別表示頭節點和尾節點。

nextprevious(或prev):分別表示下一節點和前一節點。

ascendantdescendants:分別表示祖先節點或子孫節點。

再比如,當我們的代碼涉及鏈表(linked list)這種數據結構時,則會經常使用如下英文術語。

node:表示鏈表中的一個節點。

headtail:分別表示鏈表的頭節點和尾節點。

nextprevious(或prev):分別表示下一節點和前一節點。

針對相應的領域使用正確的英文術語并基于這些英文術語來命名,可以避免很多誤解,這是提升代碼可讀性的一種重要手段。需要特別提醒的是,在有合適英文術語的情形下,要避免使用一些“萬金油”名稱,如itemdata等含義廣泛的名稱。

為變量和函數取名時,還要考慮正確的時態和單復數形式。如前所述,表示鏈表的變量應該取名為linked_list而不是link_list。又如,雙鏈表可以用dbl_linked_list表示。表示單個元素的變量用單數形式,如node表示一個節點、child表示一個子節點。表示多個元素的變量則用復數形式,如nodes表示節點數組、children表示子節點數組等。

在代碼中,縮寫是十分常見的。采用約定俗成的縮寫不僅可以提高代碼的輸入效率、節省版面空間,而且完全不會影響代碼的可讀性。但是,要盡量采用約定俗成的縮寫,不要自創,更不要使用漢字拼音首字母縮寫的名稱。C代碼中經常使用的一些縮寫如表1.1所示。

表1.1 C代碼中經常使用的一些縮寫

圖片表格

為局部變量命名時,應該盡量采用簡潔的名稱。例如,ijk一般并不推薦作為變量的名稱,但在forwhile循環中,將這3個字母作為變量的名稱非常方便,不會有任何歧義;而且循環變量一般僅限于這3個字母,如果一個循環中還需要更多的循環變量,則說明程序的結構存在問題,需要進行重構。

在局部代碼塊中,還可以用n表示數量,用len表示長度,用sz表示大小或尺寸,用p表示指針,用tmp表示臨時變量,用buf表示臨時緩沖區。這些都是約定俗成的簡潔名稱,不會影響代碼的可讀性。

對于函數或全局變量的命名,應采用下面的約定。

(1)函數庫接口:<type> <lib prefix>_<short phrase>(...)。例如:

void mylib_init_linked_list(struct linked_list *p);

(2)文件內:static <type><short phrase>(...)。例如:

static void init_liked_list(struct linked_list *p);

(3)模塊間:<type>_<module_prefix>_<short phrase>(...)。例如:

void _mymodule_init_liked_list(struct linked_list *p);

此外,如果使用的是GCC這樣的編譯器,那么可以在聲明模塊間接口時添加屬性,例如:

void _mymodule_init_liked_list(struct linked_list *p)
    __attribute__((visibility("hidden")));

這里的visibility(可見性)屬性取值為hidden,表示這個符號(即函數名)在形成函數庫后對外不可見,從而可以有效地防止命名污染。

主站蜘蛛池模板: 区。| 五寨县| 江口县| 华蓥市| 麦盖提县| 忻城县| 车致| 盐城市| 罗平县| 民和| 沙洋县| 平塘县| 昂仁县| 玛纳斯县| 黔南| 天镇县| 沽源县| 额济纳旗| 平远县| 平乐县| 蓝田县| 德昌县| 商城县| 溧阳市| 松桃| 城口县| 宁都县| 洪江市| 青州市| 海伦市| 阿坝县| 腾冲县| 闽清县| 舟曲县| 陆川县| 嘉荫县| 东平县| 庆阳市| 南汇区| 和平县| 清水县|