何雪英
摘要:C++是國(guó)內(nèi)大多數(shù)高校的計(jì)算機(jī)專(zhuān)業(yè)都開(kāi)設(shè)的一門(mén)專(zhuān)業(yè)基礎(chǔ)課,然而在這門(mén)課的教學(xué)中,很少有人重視編程習(xí)慣的培養(yǎng)。為此,本文通過(guò)介紹一些良好的編程風(fēng)格,結(jié)合筆者在實(shí)踐方面的經(jīng)驗(yàn),對(duì)培養(yǎng)學(xué)生的編程習(xí)慣提出了一些建議和看法,以使得學(xué)生在學(xué)習(xí)程序設(shè)計(jì)初期就養(yǎng)成良好的編程習(xí)慣。
關(guān)鍵詞:C++教學(xué);編程習(xí)慣;編程風(fēng)格;高質(zhì)量代碼
中圖分類(lèi)號(hào):G642? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2019)22-0126-02
開(kāi)放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID):
1 引言
C++作為一門(mén)優(yōu)秀的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,是絕大多數(shù)高校計(jì)算機(jī)專(zhuān)業(yè)開(kāi)設(shè)的一門(mén)必修課。然而在這門(mén)課的教學(xué)中,教師往往只重視學(xué)生語(yǔ)法學(xué)習(xí)和算法能力的培養(yǎng),認(rèn)為只要學(xué)生所編寫(xiě)的程序可以通過(guò)調(diào)試并能得到正確結(jié)果就可以了,卻忽視了最基本的編程習(xí)慣的培養(yǎng)。實(shí)際上,良好的編程習(xí)慣在增加程序的可讀性、可維護(hù)性和可重用性,提高程序的質(zhì)量等方面,具有非常重要的作用。因此,幫助學(xué)生認(rèn)識(shí)到編程習(xí)慣的重要性并注意培養(yǎng)他們這方面的能力,使學(xué)生在學(xué)習(xí)高級(jí)語(yǔ)言程序設(shè)計(jì)初期就接受規(guī)范編程的教育非常重要,這樣可以使得我們的大學(xué)生在走出校園前就已經(jīng)具備了良好的編程素養(yǎng),為以后進(jìn)一步的學(xué)習(xí)和應(yīng)用打下良好的基礎(chǔ)。本文從標(biāo)識(shí)符的命名、注釋、代碼布局、類(lèi)的聲明和函數(shù)設(shè)計(jì)規(guī)則5個(gè)方面介紹了一些好的編程規(guī)范,并提出具體可行的實(shí)踐方法,希望能夠幫助學(xué)生培養(yǎng)良好的編程習(xí)慣, 寫(xiě)出高質(zhì)量的代碼。
2編程習(xí)慣
養(yǎng)成良好的編程習(xí)慣,就是在程序設(shè)計(jì)過(guò)程中要遵循好的程序設(shè)計(jì)規(guī)范,也就是編程風(fēng)格。包括標(biāo)識(shí)符的命名、注釋、代碼布局、類(lèi)的聲明和函數(shù)設(shè)計(jì)規(guī)則等。
2.1標(biāo)識(shí)符命名
標(biāo)識(shí)符包括常量名、變量名、函數(shù)名以及對(duì)象名等。標(biāo)識(shí)符的命名應(yīng)做到既簡(jiǎn)單直觀又能見(jiàn)名知意。名字太簡(jiǎn)單不宜于閱讀者理解程序,因此建議除了循環(huán)變量可以使用“i,j”等簡(jiǎn)單的名字外,其他盡量使用精煉且有意義的名字,可以采用英文單詞或其組合,便于記憶和理解,切忌采用漢語(yǔ)拼音命名。如比較著名的匈牙利命名法,每個(gè)標(biāo)識(shí)符的開(kāi)頭以其數(shù)據(jù)類(lèi)型的縮寫(xiě)命名,然后再加上代表該標(biāo)識(shí)符含義或作用的英文單詞簡(jiǎn)寫(xiě)共同組成。如定義用于計(jì)數(shù)的整型變量為iCount,定義用于表示性別的字符型變量為cSex等。另外,建議對(duì)局部變量小寫(xiě),符號(hào)常量、宏大寫(xiě)[1]。
2.2 注釋
注釋是指程序設(shè)計(jì)者在編寫(xiě)代碼時(shí)所添加的一些說(shuō)明性語(yǔ)句,只是起到一個(gè)解釋說(shuō)明的作用,對(duì)程序本身的執(zhí)行并沒(méi)有影響。它是提高程序可讀性的必要手段,不僅可以幫助閱讀者很快地了解程序的功能和結(jié)構(gòu),對(duì)程序設(shè)計(jì)者本人也是很重要的,有時(shí)候我們閱讀自己編寫(xiě)沒(méi)有注釋的代碼,如果間隔時(shí)間比較久,理解起來(lái)也會(huì)很費(fèi)勁甚至難以讀懂,更不用說(shuō)去閱讀他人編寫(xiě)的代碼了。因此,養(yǎng)成良好的編程習(xí)慣,注釋必不可少。
程序的注釋可分為序言性注釋和功能性注釋[2]。序言性注釋是對(duì)程序整體性的介紹,通常放在程序開(kāi)頭,內(nèi)容一般包括:介紹各模塊的用途和功能;對(duì)函數(shù)參數(shù)及調(diào)用形式進(jìn)行描述;有關(guān)數(shù)據(jù)相關(guān)屬性的描述,如名稱(chēng)、用途、約束等;有關(guān)開(kāi)發(fā)信息簡(jiǎn)介,如模塊設(shè)計(jì)者、修改者、修改說(shuō)明及日期等。功能性注釋位于源程序中,通常使用縮進(jìn)、空行或括號(hào),來(lái)區(qū)分源程序和注釋?zhuān)瑢?duì)程序段的功能進(jìn)行描述。這里需要注意的是功能性注釋描述的是程序要“做什么”,而不是“怎么做”;描述的對(duì)象是一段程序, 而非每一條語(yǔ)句。
2.3 代碼布局
程序中代碼的布局對(duì)于程序的可讀性和可維護(hù)性也有很大影響,適當(dāng)?shù)睦每s進(jìn)、空格、空行等能使程序更整潔美觀,層次結(jié)構(gòu)更清晰,方便閱讀和維護(hù)[3-4]。對(duì)比圖1(良好的代碼布局)和圖2(不良的代碼布局),前者的優(yōu)勢(shì)顯而易見(jiàn)。
[#include
using namespace std;
int main( )
{
int i;
int sum = 0;
cin >> i;
while (i <= 10)
{
sum = sum + i;
i++;
}
cout << “sum=” << sum << endl;
return 0;
} #include
using namespace std;
int main( )
{int i, sum=0;
cin>>i;
while (i<=10)
{sum=sum+i;
i++;}
cout << “sum=”sum << endl;
return 0;
}
圖1? 良好的代碼布局 圖2? 不良的代碼布局 ]
(1)代碼行的書(shū)寫(xiě):每條語(yǔ)句最好單獨(dú)占用一行,不在一行上書(shū)寫(xiě)多個(gè)語(yǔ)句,也不將一條語(yǔ)句分成幾行來(lái)寫(xiě)。這樣既方便對(duì)相關(guān)內(nèi)容進(jìn)行注釋?zhuān)衷黾恿顺绦虻目勺x性。
(2)縮進(jìn)和對(duì)齊:對(duì)于嵌套的層次結(jié)構(gòu)采用鋸齒形的書(shū)寫(xiě)方式,根據(jù)語(yǔ)句間的邏輯關(guān)系進(jìn)行語(yǔ)句的對(duì)齊和縮進(jìn)。邏輯上屬于順序結(jié)構(gòu)的語(yǔ)句要對(duì)齊,邏輯上屬于嵌套的語(yǔ)句要往里縮進(jìn),可以利用tab鍵進(jìn)行縮進(jìn)和對(duì)齊。這樣的程序,層次分明,邏輯結(jié)構(gòu)一目了然,可讀性強(qiáng)。
(3)空格和空行:過(guò)于擁擠的程序,可讀性自然大大降低??崭窈涂招惺浅绦蛑兄饕姆指舴?,合理地使用它們,會(huì)使程序看起來(lái)整潔美觀,從而增進(jìn)程序的可讀性。
(4) 大括號(hào)的位置
對(duì)于大括號(hào)的位置一般有兩種風(fēng)格:一種風(fēng)格是“{”獨(dú)占一行,如圖3所示。另一種風(fēng)格是將“{”放在一行的最后。如圖4所示。
[if (condition )
{
…/ / programe code
} if (condition){
…/ / programe code
} 圖3? ?大括號(hào)的位置 圖4? 大括號(hào)的位置 ]
推薦使用圖3的風(fēng)格,很顯然,這種風(fēng)格更直觀,更易區(qū)分出程序塊的位置,且便于檢查配對(duì)情況。
2.4 類(lèi)的聲明
在類(lèi)的聲明中,具有不同訪問(wèn)屬性(private、public、protected)的成員的出現(xiàn)順序可以任意,但一個(gè)成員只能具有一種訪問(wèn)屬性[5]。但在實(shí)際應(yīng)用時(shí),習(xí)慣將public類(lèi)型成員放在其他類(lèi)型成員的前面,這樣方便閱讀,因?yàn)橛脩舾P(guān)心類(lèi)提供的接口或服務(wù)。
在規(guī)模較大的項(xiàng)目中,通常把類(lèi)的聲明放在頭文件中(*.h),類(lèi)的實(shí)現(xiàn)放在*.cpp文件中,類(lèi)的使用放在主函數(shù)文件中,在*.cpp文件和主函數(shù)文件中使用#include包含*.h文件。
2.5 函數(shù)
在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,函數(shù)是對(duì)功能的抽象,通常將相對(duì)獨(dú)立的、經(jīng)常使用的功能抽象為函數(shù)。由于函數(shù)可被重復(fù)使用,而且使用時(shí)只需了解函數(shù)的功能和調(diào)用方法,無(wú)須關(guān)注函數(shù)的實(shí)現(xiàn)細(xì)節(jié),因而提高了代碼的重用率和程序開(kāi)發(fā)的效率,同時(shí)也便于多人的分工協(xié)作和維護(hù)。
函數(shù)設(shè)計(jì)總的原則是應(yīng)該功能單一、規(guī)模小。下面重點(diǎn)論述函數(shù)的參數(shù)、返回值和內(nèi)部實(shí)現(xiàn)的一些規(guī)則。
2.5.1函數(shù)參數(shù)的規(guī)則
(1)完整定義參數(shù)。不要省略參數(shù)類(lèi)型和參數(shù)名,沒(méi)有參數(shù)時(shí),使用void填充。
(2)參數(shù)個(gè)數(shù)不要太多。
(3)參數(shù)名要恰當(dāng),順序要合理。例如:對(duì)于字符串復(fù)制函數(shù)strcpy的兩個(gè)參數(shù),如果僅命名為str1、str2,很難區(qū)分出拷貝順序,而采用dstStr、srcStr這種能夠區(qū)分目的參數(shù)和源參數(shù)的命名方式,拷貝順序一目了然。
void strcat(char *str1, char *str2)? ?//不良的代碼習(xí)慣
void strcat(char *dstStr, char *srcStr)? ?//良好的代碼習(xí)慣
2.5.2函數(shù)返回值的規(guī)則
(1)不要省略函數(shù)返回值的類(lèi)型。沒(méi)有返回值時(shí),聲明為void。
(2)確保返回值類(lèi)型與聲明的函數(shù)類(lèi)型一致。
2.5.3函數(shù)實(shí)現(xiàn)規(guī)則
(1)盡量少用全局變量,確保函數(shù)的單入口和單出口。
(2)盡量少用靜態(tài)局部變量。相同的輸入產(chǎn)生相同的輸出。
(3)主函數(shù)盡量簡(jiǎn)短。通常只有幾個(gè)函數(shù)調(diào)用語(yǔ)句,只是實(shí)現(xiàn)對(duì)其他功能函數(shù)的調(diào)用,而這些函數(shù)的定義全在主函數(shù)外實(shí)現(xiàn)。
3 實(shí)踐方法
針對(duì)以上介紹的良好的編程風(fēng)格,如何融匯到日常的C++的教學(xué)中,使學(xué)生在學(xué)習(xí)編程之初就養(yǎng)成良好的編程習(xí)慣,筆者提出了自己的一些建議和看法,并付諸了教學(xué)實(shí)踐,效果顯著。
3.1 提高對(duì)編程習(xí)慣重要性的認(rèn)識(shí)
要想讓學(xué)生認(rèn)識(shí)到好的編程習(xí)慣的重要性,首先要在思想上引起學(xué)生的重視,才有可能付諸實(shí)踐。
(1)把編程習(xí)慣體現(xiàn)在課堂上。教師的課件、教案都嚴(yán)格遵循好的編程風(fēng)格;并且教師在講課的過(guò)程中,要把編程習(xí)慣融入每個(gè)具體的實(shí)例中,讓學(xué)生時(shí)刻都能感受到編程習(xí)慣的優(yōu)勢(shì)和重要性。
(2)把用人單位尤其是一些大型軟件公司對(duì)編程的要求告訴學(xué)生,并找一些實(shí)例給學(xué)生看,讓學(xué)生感受什么是好的代碼風(fēng)格。
(3)設(shè)計(jì)一定數(shù)量的綜合性實(shí)驗(yàn),讓學(xué)生分工合作完成。因?yàn)楹献鞯倪^(guò)程中要讀其他同學(xué)的代碼,在這個(gè)過(guò)程中學(xué)生能親身感受到不好的代碼風(fēng)格給自己帶來(lái)的種種困難,從而認(rèn)識(shí)到養(yǎng)成良好編程習(xí)慣的重要性。
3.2 納入考核標(biāo)準(zhǔn)
在實(shí)驗(yàn)成績(jī)計(jì)算辦法中增加編程習(xí)慣所占的比重。無(wú)論是平時(shí)布置的電子作業(yè),還是最終的考試答題中,都要求學(xué)生必須遵守這些編程習(xí)慣,并且占一定的分值。
4 結(jié)束語(yǔ)
以上所述,只是筆者在多年的C++教學(xué)中總結(jié)出來(lái)的一些心得和體會(huì),實(shí)際上在編程習(xí)慣方面還有很多其他約定俗成的風(fēng)格,還有很多值得我們挖掘和探討的問(wèn)題,編程習(xí)慣的培養(yǎng)任重而道遠(yuǎn)。
參考文獻(xiàn):
[1]何靈敏,許翔,等.C++教學(xué)中編程習(xí)慣的養(yǎng)成[J].計(jì)算機(jī)教育,2011.
[2]嚴(yán)軼群,劉濤.淺論C語(yǔ)言學(xué)習(xí)方法和編程風(fēng)格[J].蘭州工業(yè)高等專(zhuān)科學(xué)校學(xué)報(bào),2009.
[3]王志超.大學(xué)生編程習(xí)慣的培養(yǎng)[J].吉林教育,2009.
[4]李寧.論C語(yǔ)言中高質(zhì)量代碼編寫(xiě)的規(guī)范問(wèn)題[J].電腦知識(shí)與技術(shù),2015.
[5]鄭莉,董淵,等.C++語(yǔ)言程序設(shè)計(jì)[M].清華大學(xué)出版社,2006.
【通聯(lián)編輯:王力】