哪種編碼風格是你的“菜”
英文原文:Reprogramming My Brace Style Mind
每個程序員都有自己的編碼風格,這基本上都是由他們的喜好決定的,此外,程序員還樂于爭論各種編碼風格的優劣,比如關于 Tab 和空格(見《Tab v.s. 空格:一個永恒的神圣戰爭》、《空格“異教徒”去死》)、80 列規則(見《保衛 80 列規則》),還有大括號的縮進風格等。
一致的編碼風格,更便于閱讀。因此程序員都想極力說服別人認同并使用與自己一致的編碼風格。下面來了解一下我的編碼風格變化歷程吧,哪種編碼風格是你的“菜”呢?
1980/1990 年代的緊湊風格
當我開始編程時,我使用 tab 字符,因為使用它保存的文件更小,還可以將代碼限制到 80 列。我還遵循 Kernighan 和 Ritchie 的《C Programming Language》一書中約定的“大括號放在同一行”規則,代碼看起來是這樣的:
int main (int argc, char *argv[]) { int a = rand () % 100; if (a > 25) { call_a_function (); call_another_function (); } else { call_b_function (); } // end if } // end main
當時 Tab 縮進默認為 8 個字符寬度,這意味著你不能縮進過多,以免打破“80 列”寬度的限制,這也迫使你寫更少、更精簡的函數名或代碼(這是好事)。大括號在同一行上,意味著可以在一頁中顯示更多的代碼。
但也有一些不好的事情。我們開始使用更短的變量名,這使代碼更難以閱讀和維護。我們在代碼行之間沒有添加任何空白行,結果很難找到代碼塊開始和結束標記(因此我們必須在代碼塊結束的地方加上注釋)。由于縮進太寬,留給我們的編碼空間就少了。
2000 年的寬松風格
在 2000 年,我以及周圍的程序員基本上都已經切換到了微軟的C/C#約定上,即使用 4 個空格,而不是 Tab,不限制代碼行的長度,大括號單獨一行。如下:
int main (int argc, char *argv[]) { int a = rand () % 100; if (a > 25) { call_a_function (); call_another_function (); } else { call_b_function (); } }
空格縮進意味著我們不必處理不同編輯器中 Tab 大小(Tab 大小可以根據用戶喜好進行設置)。我們使用空行,以使代碼更易于閱讀。單獨一行的大括號使代碼塊更加明顯(可以很快找出開始和結束點)。
但是,這也導致了一些問題。由于行長度(大屏幕)無限制,我們不再感覺必須要限制縮進的數量,并開始創建更大更長的代碼。由于當時的編輯器無法很好地格式化代碼,程序員經常會在水平滾動時無法看到左側的代碼。代碼變得難以閱讀,并排比較更困難。
因此,在 2000 年初,我選擇使用 4 個空格來縮進,依然遵循 80 列規則,將大括號單獨放在一行中,以改善可讀性。
2010 年的典型風格
現在,我開始使用 Xcode 4。Xcode 中默認為 4 個空格縮進,保持不變,還可以智能格式化代碼,不會出現滾動到右邊看不到左邊代碼的情況。但是,令我郁悶的是,默認代碼片段中大括號竟然不一致,有時單獨一行,有時和代碼共用一行。
看看默認的 initWithNibName 代碼片段:
- (id) initWithNibName:(NSString *) nibNameOrNil bundle:(NSBundle *) nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = NSLocalizedString (@"Detail", @"Detail"); } return self; }
事實證明,蘋果沒有弄錯。它使用了正確的 Kernighan & Ritchie 風格,在早期C語言書籍中是為了節省空間才將所有大括號放在代碼后面的。根據維基百科,K&R風格是:
當秉承K&R時,每一個函數左括號都應在下一行中,并與開頭行有相同的縮進。括號中的語句應該縮進,右括號應該與函數開頭有相同的縮進,并單獨一行。對于代碼塊內的控制語句,左括號應與控制語句在同一行中,右括號單獨一行(除非有 else 或 while 關鍵字)。
事實上,這是典型的K&R風格,針對所有的C衍生語言,包括C++、C#和 Objective-C。這是語言本身的設計者所遵循的風格。
因此,我也改變了我的括號使用風格,我仍然使用空格縮進,仍然遵循 80 列寬度原則,但現在更多依賴于編輯器來進行代碼格式化。不過,我現在堅持真正的K&R括號風格。
int main (int argc, char *argv[]) { int a = rand () % 100; if (a > 25) { call_a_function (); call_another_function (); } else { call_b_function (); } }
你的編碼風格是什么樣?歡迎評論。