第 2 章 程序的版式
版式雖然不會(huì)影響程序的功能,但會(huì)影響可讀性。程序的版式追求清晰、美觀,是程序風(fēng)格的重要構(gòu)成因素。
可以把程序的版式比喻為“書法”。好的“書法”可讓人對(duì)程序一目了然,看得興致勃勃。差的程序“書法”如螃蟹爬行,讓人看得索然無(wú)味,更令維護(hù)者煩惱有加。請(qǐng)程序員們學(xué)習(xí)程序的“書法”,彌補(bǔ)大學(xué)計(jì)算機(jī)教育的漏洞,實(shí)在很有必要。
2.1 空行
空行起著分隔程序段落的作用??招械皿w(不過(guò)多也不過(guò)少)將使程序的布局更加清晰??招胁粫?huì)浪費(fèi)內(nèi)存,雖然打印含有空行的程序是會(huì)多消耗一些紙張,但是值得。所以不要舍不得用空行。
l 【規(guī)則 2-1-1 】 在每個(gè)類聲明之后、每個(gè)函數(shù)定義結(jié)束之后都要加空行。參見示例 2-1 ( a )
l 【規(guī)則 2-1-2 】 在一個(gè)函數(shù)體內(nèi),邏揖上密切相關(guān)的語(yǔ)句之間不加空行,其它地方應(yīng)加空行分隔。參見示例 2-1 ( b )
// 空行
void Function1(…)
{
…
}
// 空行
void Function2(…)
{
…
}
// 空行
void Function3(…)
{
…
}
// 空行
while (condition)
{
statement1;
// 空行
if (condition)
{
statement2;
}
else
{
statement3;
}
// 空行
statement4;
}
示例 2-1(a) 函數(shù)之間的空行 示例2-1(b) 函數(shù)內(nèi)部的空行
2.2 代碼行
l 【規(guī)則 2-2-1 】 一行代碼只做一件事情,如只定義一個(gè)變量,或只寫一條語(yǔ)句。這樣的代碼容易閱讀,并且方便于寫注釋。
l 【規(guī)則 2-2-2 】 if 、 for 、 while 、 do 等語(yǔ)句自占一行,執(zhí)行語(yǔ)句不得緊跟其后。不論執(zhí)行語(yǔ)句有多少都要加 {} 。這樣可以防止書寫失誤。
示例 2-2 ( a )為風(fēng)格良好的代碼行,示例 2-2 ( b )為風(fēng)格不良的代碼行。
int width; // 寬度
int height; // 高度
int depth; // 深度
int width, height, depth; // 寬度高度深度
x = a + b;
y = c + d;
z = e + f;
X = a + b; y = c + d; z = e + f;
if (width < height)
{
dosomething();
}
if (width < height) dosomething();
for (initialization; condition; update)
{
dosomething();
}
// 空行
other();
for (initialization; condition; update)
dosomething();
other();
示例 2-2(a) 風(fēng)格良好 的代碼行 示例2-2(b) 風(fēng)格不良 的代碼行
2 【建議 2-2-1 】 盡可能在定義變量的同時(shí)初始化該變量(就近原則)
如果變量的引用處和其定義處相隔比較遠(yuǎn),變量的初始化很容易被忘記。如果引用了未被初始化的變量,可能會(huì)導(dǎo)致程序錯(cuò)誤。本建議可以減少隱患。例如
int width = 10; // 定義并初紿化width
int height = 10; // 定義并初紿化height
int depth = 10; // 定義并初紿化depth
2.3 代碼行內(nèi)的空格
l 【規(guī)則 2-3-1 】 關(guān)鍵字之后要留空格。象 const 、 virtual 、 inline 、 case 等關(guān)鍵字之后至少要留一個(gè)空格,否則無(wú)法辨析關(guān)鍵字。象 if 、 for 、 while 等關(guān)鍵字之后應(yīng)留一個(gè)空格再跟左括號(hào)‘(',以突出關(guān)鍵字。
l 【規(guī)則 2-3-2 】 函數(shù)名之后不要留空格,緊跟左括號(hào)‘(',以與關(guān)鍵字區(qū)別。
l 【規(guī)則 2-3-3 】 ‘('向后緊跟,‘)'、‘,'、‘ ; '向前緊跟,緊跟處不留空格。
l 【規(guī)則 2-3-4 】 ‘,'之后要留空格,如 Function(x, y, z) 。如果‘ ; '不是一行的結(jié)束符號(hào),其后要留空格,如 for (initialization; condition; update) 。
l 【規(guī)則 2-3-5 】 賦值操作符、比較操作符、算術(shù)操作符、邏輯操作符、位域操作符,如“ = ”、“ += ” “ >= ”、“ <= ”、“ + ”、“ * ”、“ % ”、“ && ”、“ || ”、“ << ” , “ ^ ”等二元操作符的前后應(yīng)當(dāng)加空格。
l 【規(guī)則 2-3-6 】 一元操作符如“ ! ”、“ ~ ”、“ ++ ”、“ -- ”、“ & ”(地址運(yùn)算符)等前后不加空格。
l 【規(guī)則 2-3-7 】 象“ []”、“ .”、“->” 這類操作符前后不加空格。
版式雖然不會(huì)影響程序的功能,但會(huì)影響可讀性。程序的版式追求清晰、美觀,是程序風(fēng)格的重要構(gòu)成因素。
可以把程序的版式比喻為“書法”。好的“書法”可讓人對(duì)程序一目了然,看得興致勃勃。差的程序“書法”如螃蟹爬行,讓人看得索然無(wú)味,更令維護(hù)者煩惱有加。請(qǐng)程序員們學(xué)習(xí)程序的“書法”,彌補(bǔ)大學(xué)計(jì)算機(jī)教育的漏洞,實(shí)在很有必要。
2.1 空行
空行起著分隔程序段落的作用??招械皿w(不過(guò)多也不過(guò)少)將使程序的布局更加清晰??招胁粫?huì)浪費(fèi)內(nèi)存,雖然打印含有空行的程序是會(huì)多消耗一些紙張,但是值得。所以不要舍不得用空行。
l 【規(guī)則 2-1-1 】 在每個(gè)類聲明之后、每個(gè)函數(shù)定義結(jié)束之后都要加空行。參見示例 2-1 ( a )
l 【規(guī)則 2-1-2 】 在一個(gè)函數(shù)體內(nèi),邏揖上密切相關(guān)的語(yǔ)句之間不加空行,其它地方應(yīng)加空行分隔。參見示例 2-1 ( b )
// 空行
void Function1(…)
{
…
}
// 空行
void Function2(…)
{
…
}
// 空行
void Function3(…)
{
…
}
// 空行
while (condition)
{
statement1;
// 空行
if (condition)
{
statement2;
}
else
{
statement3;
}
// 空行
statement4;
}
示例 2-1(a) 函數(shù)之間的空行 示例2-1(b) 函數(shù)內(nèi)部的空行
2.2 代碼行
l 【規(guī)則 2-2-1 】 一行代碼只做一件事情,如只定義一個(gè)變量,或只寫一條語(yǔ)句。這樣的代碼容易閱讀,并且方便于寫注釋。
l 【規(guī)則 2-2-2 】 if 、 for 、 while 、 do 等語(yǔ)句自占一行,執(zhí)行語(yǔ)句不得緊跟其后。不論執(zhí)行語(yǔ)句有多少都要加 {} 。這樣可以防止書寫失誤。
示例 2-2 ( a )為風(fēng)格良好的代碼行,示例 2-2 ( b )為風(fēng)格不良的代碼行。
int width; // 寬度
int height; // 高度
int depth; // 深度
int width, height, depth; // 寬度高度深度
x = a + b;
y = c + d;
z = e + f;
X = a + b; y = c + d; z = e + f;
if (width < height)
{
dosomething();
}
if (width < height) dosomething();
for (initialization; condition; update)
{
dosomething();
}
// 空行
other();
for (initialization; condition; update)
dosomething();
other();
示例 2-2(a) 風(fēng)格良好 的代碼行 示例2-2(b) 風(fēng)格不良 的代碼行
2 【建議 2-2-1 】 盡可能在定義變量的同時(shí)初始化該變量(就近原則)
如果變量的引用處和其定義處相隔比較遠(yuǎn),變量的初始化很容易被忘記。如果引用了未被初始化的變量,可能會(huì)導(dǎo)致程序錯(cuò)誤。本建議可以減少隱患。例如
int width = 10; // 定義并初紿化width
int height = 10; // 定義并初紿化height
int depth = 10; // 定義并初紿化depth
2.3 代碼行內(nèi)的空格
l 【規(guī)則 2-3-1 】 關(guān)鍵字之后要留空格。象 const 、 virtual 、 inline 、 case 等關(guān)鍵字之后至少要留一個(gè)空格,否則無(wú)法辨析關(guān)鍵字。象 if 、 for 、 while 等關(guān)鍵字之后應(yīng)留一個(gè)空格再跟左括號(hào)‘(',以突出關(guān)鍵字。
l 【規(guī)則 2-3-2 】 函數(shù)名之后不要留空格,緊跟左括號(hào)‘(',以與關(guān)鍵字區(qū)別。
l 【規(guī)則 2-3-3 】 ‘('向后緊跟,‘)'、‘,'、‘ ; '向前緊跟,緊跟處不留空格。
l 【規(guī)則 2-3-4 】 ‘,'之后要留空格,如 Function(x, y, z) 。如果‘ ; '不是一行的結(jié)束符號(hào),其后要留空格,如 for (initialization; condition; update) 。
l 【規(guī)則 2-3-5 】 賦值操作符、比較操作符、算術(shù)操作符、邏輯操作符、位域操作符,如“ = ”、“ += ” “ >= ”、“ <= ”、“ + ”、“ * ”、“ % ”、“ && ”、“ || ”、“ << ” , “ ^ ”等二元操作符的前后應(yīng)當(dāng)加空格。
l 【規(guī)則 2-3-6 】 一元操作符如“ ! ”、“ ~ ”、“ ++ ”、“ -- ”、“ & ”(地址運(yùn)算符)等前后不加空格。
l 【規(guī)則 2-3-7 】 象“ []”、“ .”、“->” 這類操作符前后不加空格。