Nginx源碼中值得學習的編程風格有哪些?


void****


寫一行空一行


1.表驅動

用查表代替分支數據與邏輯分離,讓程序更清晰,參考 What are Table-Driven Methods

舉例,nginx.c中命令的定義:

static ngx_command_t ngx_core_commands[]

是一個數組,即表或者Table,它集中存儲數據,ngx_conf_file.c中ngx_conf_handler函數用到這些命令:

for ( /* void */ ; cmd-&>name.len; cmd++) {
... ...
if (ngx_strcmp(name-&>data, cmd-&>name.data) != 0) { //對比命令名稱
continue;
}
... ...

在一個循環中對比命令名稱,找到目標命令,則執行它。

如果不用循環,那麼通常會用if-else或switch分支邏輯,每個分支里都混有數據(此例即命令的名字),對於數據較多的情況,效率相同的情況下程序可讀性更差。

《代碼大全2》在前言部分就提到的一種方法,一開始看nginx這種用法很奇怪,後來學著用了下,就離不開它了。

2.重定義原始類型,重定義標準庫函數

可以更好得控制所用類型,方便隨時替換。標準庫的很多函數並不是效率最優的,用新的名字重定義,需要時可以用最優的實現去替換,不用時直接define就好。

舉例:整型 ngx_int_t,字元串長度ngx_strlen

typedef intptr_t ngx_int_t;
#define ngx_strlen(s) strlen((const char *) s)

對原始類型和標準庫大量的重定義也可能帶來編寫和閱讀的不便,但對於nginx這種效率至關重要的服務類程序,還是利大於弊。

3.控制代碼行長度

nginx源碼每行長度不超過80個字元,這雖然是歷史原因造成的(history - Why is 80 characters the "standard" limit for code width?),但80也是很多大牛推崇的最優美的寫法。

使用現代計算機的顯示器,對於大多數文本編輯器,除去左右的文件列表欄和符號列表欄,80個字元通常不會被遮擋,也就不用用滑鼠拖著水平滾動欄看代碼,而80個字元的長度對於設計合理的代碼有足夠的表現力,所以是很合適的選擇。

然而,確保80需要文本標尺來衡量,或者後期代碼自動斷行,現在多數代碼已經不遵循這個標準了,個人習慣,只要保證行不要過長就好,不必卡這個數字。


為什麼是學習編程風格而不是裡面最重要的框架設計,實現技術呢?會不會買櫝還珠呢?


1.每行不超過80列

2.每個struct都有typedef

3.flag位用位域

吐槽,太多在struct裡面的回掉函數名字為handler,搜索調用的地方很不方便,如果能帶前綴就更好了,比如cleanup_handler


推薦閱讀:

請問nginx比apache性能高為什麼apache現在依然流行?
為什麼 node.js 的官網不用 node.js 而用 nginx 搭建?
Nginx 和 Apache 各有什麼優缺點?
有哪些知名網站Web伺服器是Nginx?
Nginx反向代理為什麼可以提高網站性能?

TAG:編程 | C編程語言 | 開源項目 | Nginx |