Nginx源碼中值得學習的編程風格有哪些?
01-05
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都有typedef3.flag位用位域
吐槽,太多在struct裡面的回掉函數名字為handler,搜索調用的地方很不方便,如果能帶前綴就更好了,比如cleanup_handler推薦閱讀:
※請問nginx比apache性能高為什麼apache現在依然流行?
※為什麼 node.js 的官網不用 node.js 而用 nginx 搭建?
※Nginx 和 Apache 各有什麼優缺點?
※有哪些知名網站Web伺服器是Nginx?
※Nginx反向代理為什麼可以提高網站性能?