国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

改善編碼風(fēng)格(超級(jí)簡(jiǎn)單實(shí)用)

2019-11-18 15:04:43
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  改善編碼風(fēng)格(超級(jí)簡(jiǎn)單實(shí)用)
出自:SongBarry 2002年11月20日 15:51
應(yīng)該說(shuō),我們中的許多人,編程的歷史并不短,但很多時(shí)候,我們對(duì)自己編寫(xiě)出來(lái)的代碼卻毫無(wú)自信,有時(shí)候自己見(jiàn)了都怕,盡管這段代碼實(shí)現(xiàn)了要求的功能。歸其原因,往往是代碼風(fēng)格差導(dǎo)致的代碼凌亂沒(méi)有美感,本文的目的就是要講解一般的良好風(fēng)格,幫助讀者寫(xiě)出“漂亮”的代碼,事先要說(shuō)明的是文中所涉及到的語(yǔ)言有C、C++、java及BASIC,我之所以用了三種語(yǔ)言而不是只用一種語(yǔ)言是為了向讀者表明風(fēng)格對(duì)語(yǔ)言的通用的。

1)標(biāo)識(shí)符(命名規(guī)則)
標(biāo)識(shí)符應(yīng)當(dāng)直觀且可以拼讀,可望文知意,最好采用英文單詞或其組合,便于記憶和閱讀,切忌使用漢語(yǔ)拼音來(lái)命名。長(zhǎng)名字能更好地表達(dá)含義,所以函數(shù)名、變量名、類(lèi)名長(zhǎng)達(dá)十幾個(gè)字符不足為怪,例如:
好的命名 int student_age,teacher_age;
壞的命名 int age1,age2;
但名字是否越長(zhǎng)越好呢?不是的,請(qǐng)看下面的例子:
strUCt student
{
int student_age; /* 壞的命名 */
char *student_name;
}
struct student
{
int age; /* 好的命名 */
char *name;
}
為什么前者不好呢,因?yàn)楹芏嘤啵Y(jié)構(gòu)體的名student已經(jīng)表達(dá)了student_age前面的
student的意思。
再比如字符串拷貝函數(shù):void StringCopy(char *str1, char *str2);我們很難搞清
楚究竟是把str1拷貝到str2中,還是剛好倒過(guò)來(lái)。可

以把參數(shù)名字起得更有意義,如叫strSource和trDestination。這樣從名字上就可以看出
應(yīng)該把strSource拷貝到strDestination。
單字符的名字也是有用的,常見(jiàn)的如i,j,k,m,n,x,y,z等,它們通常可用作函數(shù)內(nèi)的局
部變量。
2)運(yùn)算符的優(yōu)先級(jí)
假如代碼行中的運(yùn)算符比較多,應(yīng)該用括號(hào)確定表達(dá)式的操作順序,避免使用默認(rèn)的
優(yōu)先級(jí)。因?yàn)槭煊浉鬟\(yùn)算符的優(yōu)先級(jí)是比較困難的,

就算你熟記并正確使用了,寫(xiě)出來(lái)的代碼也輕易產(chǎn)生歧義而使其可讀性較差。
好的風(fēng)格 if ((a b) && (a & c))
壞的風(fēng)格 if (a b && a & c)
雖然后者和前者功能一樣,但后者是很恐怖的,難以閱讀。
3)不要編寫(xiě)太復(fù)雜的復(fù)合表達(dá)式。
復(fù)合表達(dá)式使用在適當(dāng)?shù)膱?chǎng)合可以使代碼更加簡(jiǎn)潔,但不能因?yàn)檫@個(gè)簡(jiǎn)潔而帶來(lái)理解的復(fù)雜。
例如:
max = a > b ?(a > c ? a : c) : (b > c ? b : c) // 復(fù)合表達(dá)式過(guò)于復(fù)雜
應(yīng)該修改為:
max = a;
if(max < b)
{
max = b;
}
if(max < c)
{
max = c;
}

上面的if的執(zhí)行語(yǔ)句只有一行也加了{(lán)},是因?yàn)樽裱恕安徽搃f、for、while的執(zhí)行語(yǔ)句
有多少都要加{}”的規(guī)則,這樣可以防止書(shū)寫(xiě)失誤,

當(dāng)這樣的語(yǔ)句層層嵌套的時(shí)候你就會(huì)知道這樣做的好處。
4)各種數(shù)據(jù)類(lèi)型與零值比較
在JAVA中,對(duì)于布爾變量flag,與零值(注重:不是0)比較的方式自然是if (flag
== TRUE)或者if (flag == FALSE),但是在C/C++中這卻不是正確的選擇。正確的選擇應(yīng)該是if (flag)或者if (!flag),這是因?yàn)門(mén)RUE的值究竟是什么并沒(méi)有統(tǒng)一的標(biāo)準(zhǔn),例如Visual C++ 將TRUE定義為1,而Visual Basic則將TRUE定義為-1。if (flag == TRUE)、if (flag == 1 )、if(flag == FALSE)、if (flag == 0)都屬于不良風(fēng)格。
應(yīng)當(dāng)將整型變量用“==”或“!=”直接與0比較。
if (value == 0)
if (value != 0)
不可以寫(xiě)成
if (value) // 會(huì)讓人誤解 value是布爾變量
if (!value)
指針變量的零值是NULL。盡管NULL的值與0相同,但是兩者意義不同。對(duì)于指針變量p ,它與零值比較的if語(yǔ)句如下:
if (p == NULL)
if (p != NULL)
不要寫(xiě)成
if (p == 0) // 輕易讓人誤解p是整型變量
if (p != 0)
5)多層if語(yǔ)句
不要出現(xiàn)這樣的結(jié)構(gòu):
if (condition1)
{

if (condition2)

if (condition3)


}
而應(yīng)該代之以if-else-if結(jié)構(gòu):
if (condition1)
{

}
else if (condition2)
{

}
else if (condition3)
{

} …

這樣的結(jié)構(gòu)條理清楚,前者則輕易導(dǎo)致寫(xiě)到后來(lái)自己都不知道寫(xiě)了些什么的事實(shí)。
可以用switch語(yǔ)句替換嵌套的if語(yǔ)句來(lái)實(shí)現(xiàn)多分支選擇。

6)改善循環(huán)的效率
對(duì)于字符串name,看下面的循環(huán):
for (i = 0; i < strlen(name); i++)效率明顯差于下面的循環(huán):
n = strlen(name);
for (i = 0; i < n; i++)
后者只要計(jì)算name的長(zhǎng)度一次。
7)少用、慎用goto語(yǔ)句,并不禁用

goto語(yǔ)句能從多重循環(huán)體或者代碼堆里一下子跳到外面, 例如:
{ …
{ …
{ …
on error goto errorhandler;
}
}
}
errorhandler:

在Visual Basic中這一招是常用的。
8)消除魔鬼數(shù)
魔鬼數(shù)者,沒(méi)名字的常數(shù)也,你若看英文資料,它們的說(shuō)法是magic data,我們的一些作品將其翻譯為“魔術(shù)數(shù)”,我更愿意將其翻譯為“魔鬼數(shù)”,因?yàn)樗且粋€(gè)導(dǎo)致代碼的可讀性極差的“魔鬼”。
假使你在程序里寫(xiě)下下面的一段代碼:
for (i=0; i < 100; i++);for (i=0; i < 99; i++);誰(shuí)都不知道100、99是個(gè)什么玩
意,你可能意味著100是范圍的邊界(最大值),就應(yīng)該給出定義,代碼的讀者才能明白你的意思:
#define MAX 100 /* C語(yǔ)言的宏常量 */
const int MAX = 100; // C++ 語(yǔ)言的const常量
for (i=0; i < MAX; i++);for (i=0; i < MAX-1; i++)的意思就很清楚了。

并且假如某一常量與其它常量密切相關(guān),應(yīng)在定義中包含這種關(guān)系,而不應(yīng)給出一些孤立的值。
例如:
const float RADIUS = 100;
const float DIAMETER = RADIUS * 2;
9)函數(shù)返回值
函數(shù)名字與返回值類(lèi)型在語(yǔ)義上不可沖突,C標(biāo)準(zhǔn)庫(kù)函數(shù)getchar違反了這一規(guī)則。
例如:
char c;
c = getchar();
if (c == EOF)
按照getchar名字的意思,將變量c聲明為char類(lèi)型是很自然的事情。但不幸的是getch
ar的確不是char類(lèi)型,而是int類(lèi)型,其原型如下:

int getchar(void);
10)亂指一氣的指針
“野指針”者,亂指一氣的指針也,它不是NULL指針,是指向“垃圾”內(nèi)存的指針。野
指針是很危險(xiǎn)的,是經(jīng)常導(dǎo)致bug的原因,它的成因主有兩種:一是指針變量沒(méi)有被初始化。在C/C++中任何指針變量剛被創(chuàng)建時(shí)不會(huì)自動(dòng)成為NULL指針,它的缺省值是隨機(jī)的。所以,指針變量在創(chuàng)建的同時(shí)應(yīng)當(dāng)被初始化,要么將指針設(shè)置為NULL,要么讓它指向合法的內(nèi)存。例如

char *p = NULL;
char *str = (char *) malloc(100);

二是指針p被free或者delete之后,沒(méi)有置為NULL,讓人誤以為p是個(gè)合法的指針。

關(guān)于編碼的風(fēng)格,筆者還有許多需要講解的,限于本文的篇幅,筆者暫時(shí)講到這里,希望能對(duì)編程者有所幫助。

上一篇:給JAR簽名

下一篇:分頁(yè)JavaBean

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 阿巴嘎旗| 蕉岭县| 石屏县| 巴楚县| 临沭县| 乌拉特中旗| 内丘县| 镶黄旗| 施秉县| 潼关县| 民权县| 鲜城| 山东省| 临桂县| 胶州市| 邛崃市| 长子县| 中宁县| 怀来县| 泰顺县| 京山县| 双峰县| 双柏县| 泸溪县| 通辽市| 洱源县| 兴义市| 兴化市| 类乌齐县| 六安市| 高碑店市| 留坝县| 阳原县| 丹阳市| 玛多县| 清流县| 逊克县| 昌黎县| 都匀市| 文登市| 绥宁县|