縮排風格
在程式設計中,縮排風格(indent style)是管理代碼塊縮排以表達程式結構的一種約定。本條目主要討論自由形式語言,例如C及其後裔,但這也可以(並經常)適用於大多數其他程式語言(尤其是花括號程式語言),其中的空白字元則並不重要。縮排風格是代碼風格的一個方面。
縮排在大多數程式語言中不是必要條件,而只是作為輔助符號。不過,縮排有助於更好地向人類閱讀者表達程式的結構。尤其是用於澄清控制流程結構(例如條件或迴圈)與其內部、外部代碼之間的關係。不過,部分語言(例如Python和occam)使用縮排而非花括號或關鍵詞來確定結構,這被稱為越位規則。在這種語言中,縮排對編譯器或直譯器有意義,而不僅僅是清晰度或風格問題。
花括號位置
縮排風格的主要區別在於複合陳述式的花括號({...}
)的位置,這通常是為涵蓋一個控制聲明(if
、while
、for
...)。下表展示了本條目中討論的所有風格的所在位置。為了一致性,縮排深度(字元數)統一使用4個空格表示,這未考慮各風格中首選的縮排深度。
花括號位置 | 風格 |
---|---|
while (x == y) {
something();
somethingelse();
}
|
K&R及變種: |
while (x == y)
{
something();
somethingelse();
}
|
Allman |
while (x == y)
{
something();
somethingelse();
}
|
GNU |
while (x == y)
{
something();
somethingelse();
}
|
Whitesmiths |
while (x == y)
{ something();
somethingelse();
}
|
Horstmann |
while (x == y)
{ something();
somethingelse(); }
|
Pico |
while (x == y) {
something();
somethingelse();
}
|
Ratliff |
while (x == y) {
something();
somethingelse(); }
|
Lisp |
制表符、空格及縮排尺寸
縮排的尺寸通常與風格無關。許多早期程式使用制表符來縮排,從而簡化輸入和節約原始碼檔案的大小。Unix編輯器通常將制表符視為等同八個字元,而Macintosh和Windows環境將它視作四個字元[來源請求],這使代碼在各環境間交換時產生一種混亂。現代的編程編輯器通常可以設置任意的縮排尺寸,並會插入適當的制表符與空格。對Ruby、許多shell指令碼語言和某些形式的HTML格式,通常為每個縮排級別使用兩個空格。[1]
使用制表符還是空格作為縮排字元是編程界的一項持續爭論。傑米·加文斯基等一些程式設計師認為空格而非制表符有助增加跨平台可移植性。[2]而如WordPress編碼規範的作者則認為制表符增加了可移植性。[3]
工具
目前已有許多電腦程式可以自動校正縮排風格(依照程式作者或用戶的偏好)以及制表符表示的縮排長度。其中很著名的一個是indent
,這個程式包含在許多類Unix作業系統中。
在Emacs中,有多種命令可用於自動解決縮排問題。
Elastic tabstops是一種需要文字編輯器支援的制表風格,當塊中的一行的長度改變時,整個文字塊將自動對齊。
風格
K&R
K&R風格常在C、C++以及其他花括號程式語言中使用。在布萊恩·柯林漢與丹尼斯·里奇的《C程式語言》一書中也有使用。它起源於Kernighan和Plauger的《編程風格的元素》及軟件工具。
變種:1TBS (OTBS)
變種:Java
變種:Stroustrup
變種:Linux內核
變種:BSD KNF
阿爾曼風格
變種:Allman-8
Whitesmiths style
GNU風格
Horstmann風格
Pico風格
Ratliff風格
Lisp風格
Haskell風格
Haskell是一種花括號可選的語言[4],也就是說,下面的兩組代碼在語意上是相等的:
braceless = do
text <- getContents
let
firstWord = head $ words text
bigWord = map toUpper firstWord
putStrLn bigWord
braceful = do
{ text <- getContents
; let
{ firstWord = head $ words text
; bigWord = map toUpper firstWord
}
; putStrLn bigWord
}
通常,procedural do
的段落和一般程式文字會省略花括號和分號,但這種風格通常用於由一對括號或花括號組成的列表、記錄或其他句法元素,並用逗號或分號分隔。[5]
其他考慮
遺失塊蹤跡
在某些情況下存在着遺失塊邊界的軌跡的風險。這通常在包含許多複雜陳述式的大量代碼中看到,這些複合陳述式巢狀了許多層的縮排。當程式設計師捲動到一大堆巢狀陳述式的底部時,他可能已經忘記了哪些控制陳述式轉到哪裏。不過,過長的代碼也可能有其他原因, 諸如過於複雜,面對這個問題的程式設計師可能會考慮代碼重構以期待它在未來有更好的體驗。
for (int i = 0; i < total; i++) {
foo(bar);
} //for (i)
if (x < 0) {
bar(foo);
} //if (x < 0)
聲明的插入
在使用標準的Unix行編輯器ed時,K&R風格能防止一個常見的錯誤。在控制陳述式與迴圈塊的開啟花括號之間錯誤地插入的陳述式將使迴圈體變為單次執行。
for (int i = 0; i < 10; i++)
whoops(bar); /* repeated 10 times, with i from 0 to 9 */
{
only_once(); /* Programmer intended this to be done 10 times */
} //for (i) <-- This comment is no longer valid, and is very misleading!
K&R風格通過將控制陳述式和開啟括號保持在同一行來避免此問題。
參見
參考資料
- ^ Detecting Code Indentation. 2014-09-08 [2017-07-28]. (原始內容存檔於2020-11-12).
- ^ Zawinski, Jamie. Tabs versus Spaces: An Eternal Holy War. 2000 [2016-06-06]. (原始內容存檔於2018-06-12).
- ^ WordPress Coding Standards. [2016-06-06]. (原始內容存檔於2021-03-24).
- ^ The Haskell 98 Report. [2016-03-03]. (原始內容存檔於2021-04-11).
- ^ Lipovača, Miran. Making Our Own Types and Typeclasses. [2016-02-03]. (原始內容存檔於2021-04-13).
外部連結
- C Style: Standards and Guidelines: Defining Programming Standards for Professional C Programmers (頁面存檔備份,存於互聯網檔案館), Prentice Hall, ISBN 0-13-116898-3 / ISBN 978-0-13-116898-5 (full text is also online). Straker, David (1992).
- Contextual Indent (頁面存檔備份,存於互聯網檔案館)
- GNU Coding Standards (頁面存檔備份,存於互聯網檔案館)
- 開放目錄專案中的「Source Code Formatters」