版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 軟件開發(fā)流程規(guī)范V1.0德聯(lián)軟件有限責(zé)任公司編制人: 侯秀美 審核人: 2015 年 8 月 19 日 目錄目錄0一、概述2二、開發(fā)流程規(guī)范32.1 系統(tǒng)軟硬件開發(fā)環(huán)境32.2 系統(tǒng)架構(gòu)(系統(tǒng)組成)52.3 系統(tǒng)功能模塊設(shè)計(jì)62.4 系統(tǒng)功能開發(fā)流程圖62.5 開發(fā)修改記錄7三、開發(fā)代碼規(guī)范83.1 文件結(jié)構(gòu)83.1.1 文件信息聲明83.1.2 頭文件的結(jié)構(gòu)103.1.3 定義文件的結(jié)構(gòu)113.1.4 頭文件的作用123.1.5 目錄結(jié)構(gòu)133.2 命名規(guī)則133.2.1 共性原則133.2.2 Windows變量命名規(guī)則143.3 程序風(fēng)格163.3.1 空行173.3.2 代碼行183
2、.3.3 代碼行內(nèi)的空格193.3.4 對(duì)齊203.3.5 長(zhǎng)行拆分223.3.6 修飾符的位置233.3.7 注釋233.4 函數(shù)設(shè)計(jì)263.4.1 參數(shù)的規(guī)則263.4.2 返回值的規(guī)則273.4.3 函數(shù)內(nèi)部實(shí)現(xiàn)的規(guī)則303.4.4 其它建議323.4.5 使用斷言323.4.6 引用與指針的比較333.5 變量類型定義35四、軟件測(cè)試規(guī)范364.1 單元測(cè)試364.2 系統(tǒng)測(cè)試374.6 業(yè)務(wù)測(cè)試384.7 驗(yàn)收測(cè)試384.8 用戶現(xiàn)場(chǎng)測(cè)試38五、軟件版本管理394.1版本管理的必要性39一、概述本文制定煙臺(tái)開發(fā)區(qū)德聯(lián)軟件有限責(zé)任公司計(jì)算機(jī)軟件開發(fā)規(guī)范文檔。本規(guī)范的目的是使公司軟件開發(fā)
3、項(xiàng)目階段清晰、要求明確、任務(wù)具體、編寫的代碼規(guī)范,使之規(guī)范化、系統(tǒng)化和工程化,向公司內(nèi)從事軟件開發(fā)的工程師和管理人員提出一系列規(guī)范和要求,從而有利于開發(fā)過程的控制和管理,提高所開發(fā)軟件系統(tǒng)的質(zhì)量,縮短開發(fā)時(shí)間,減少開發(fā)和維護(hù)費(fèi)用,以保證項(xiàng)目高質(zhì)量、順利進(jìn)行。本規(guī)范包含:開發(fā)流程規(guī)范和開發(fā)代碼規(guī)范等,開發(fā)流程規(guī)范需要技術(shù)開發(fā)人員編寫相關(guān)內(nèi)容,希望每個(gè)技術(shù)人員形成習(xí)慣,如有新的內(nèi)容更新會(huì)及時(shí)通知大家,如有好的規(guī)范要求也可通知編制人員及時(shí)更新。本規(guī)范為煙臺(tái)開發(fā)區(qū)德聯(lián)軟件有限責(zé)任公司內(nèi)部材料,嚴(yán)禁其他商業(yè)應(yīng)用。二、開發(fā)流程規(guī)范接受開發(fā)任務(wù),詳細(xì)閱讀軟件技術(shù)規(guī)范或技術(shù)文檔,如對(duì)技術(shù)文檔有疑義或者不清楚的
4、地方及時(shí)與項(xiàng)目總工或用戶溝通,根據(jù)文檔和溝通內(nèi)容編寫項(xiàng)目開發(fā)計(jì)劃,必須包括但不限于系統(tǒng)軟硬件開發(fā)環(huán)境、系統(tǒng)架構(gòu)、系統(tǒng)功能模塊設(shè)計(jì)、系統(tǒng)功能開發(fā)流程圖、開發(fā)修改記錄。2.1 系統(tǒng)軟硬件開發(fā)環(huán)境開發(fā)環(huán)境的搭建,最好形成文檔,便于以后同樣工作的使用。開發(fā)人員要明確系統(tǒng)開發(fā)擬采用的數(shù)據(jù)庫(kù)、操作系統(tǒng)、開發(fā)語言、開發(fā)工具、服務(wù)器等(具體到版本)。明確整個(gè)系統(tǒng)開發(fā)工作流程,至少應(yīng)該包括以下流程。2.2 系統(tǒng)架構(gòu)(系統(tǒng)組成)確定系統(tǒng)整體體系架構(gòu),各層次之間的數(shù)據(jù)流的連接,確定軟件服務(wù)器的硬件配置及用戶硬件資源配置, 確定與用戶軟件平臺(tái)的統(tǒng)一協(xié)調(diào)。 開發(fā)人員在繪制架構(gòu)圖時(shí)給出基本框架,能反映出基本意義即可,可以
5、直接用文字代替例子中的圖片。圖1 系統(tǒng)邏輯架構(gòu)圖舉例圖2 物理架構(gòu)圖舉例2.3 系統(tǒng)功能模塊設(shè)計(jì)給出系統(tǒng)的主要功能模塊,每個(gè)模塊所包含的功能。圖3 圖書管理系統(tǒng)模塊規(guī)劃圖舉例2.4 系統(tǒng)功能開發(fā)流程圖給出系統(tǒng)主要功能的業(yè)務(wù)流程圖。圖4 系統(tǒng)功能業(yè)務(wù)流程圖舉例2.5 開發(fā)修改記錄1. 開發(fā)代碼做好備份(可以在完成一個(gè)重大功能之后,或者按時(shí)間周期性進(jìn)行備份),以免由于不可抗力導(dǎo)致代碼不可修復(fù)。2.在每次重大修改之后要做好記錄(改動(dòng)的具體細(xì)節(jié)),修改前的版本要及時(shí)備份,可以方面隨時(shí)還原系統(tǒng)。修改日期修改內(nèi)容是否備份備注三、開發(fā)代碼規(guī)范在研究項(xiàng)目團(tuán)隊(duì)協(xié)作開發(fā)的情況下(這里的團(tuán)隊(duì)協(xié)作也適合于應(yīng)用項(xiàng)目的開
6、發(fā)),編程時(shí)應(yīng)該強(qiáng)調(diào)的一個(gè)重要方面是程序的易讀性,在保證軟件速度等性能指標(biāo)能滿足用戶需求的情況下,能讓其他程序員容易讀懂你所編寫的程序。若研究項(xiàng)目小組的所有開發(fā)人員都遵循統(tǒng)一的、鮮明的一套編程風(fēng)格,可以讓協(xié)作者、后繼者和自己一目了然,在很短的時(shí)間內(nèi)看清楚程序結(jié)構(gòu),理解設(shè)計(jì)的思路,大大提高代碼的可讀性、可重用性、程序健壯性、可移植性、可維護(hù)性。制定本編程規(guī)范的目的是為了提高軟件開發(fā)效率及所開發(fā)軟件的可維護(hù)性,提高軟件的質(zhì)量。本規(guī)范由程序風(fēng)格、命名規(guī)范、注釋規(guī)范、程序健壯性、可移植性、錯(cuò)誤處理以及軟件的模塊化規(guī)范等部分組成。此規(guī)范以C/C+程序設(shè)計(jì)討論。3.1 文件結(jié)構(gòu)每個(gè)C+/C程序通常分為兩個(gè)
7、文件。一個(gè)文件用于保存程序的聲明(declaration),稱為頭文件。另一個(gè)文件用于保存程序的實(shí)現(xiàn)(implementation),稱為定義(definition)文件。C+/C程序的頭文件以“.h”為后綴,C程序的定義文件以“.c”為后綴,C+程序的定義文件通常以“.cpp”為后綴(也有一些系統(tǒng)以“.cc”或“.cxx”為后綴)。3.1.1 文件信息聲明文件信息聲明位于頭文件和定義文件的開頭(參見示例3-1),主要內(nèi)容有:(1) 版權(quán)信息;(2)
8、文件名稱,項(xiàng)目代碼,摘要,參考文獻(xiàn);(3) 當(dāng)前版本號(hào),作者/修改者,完成日期;(4) 版本歷史信息;(5) 主要函數(shù)描述。 / Copyright (c) 2015, DeLianSoftCompany YanTai/ All rights reserved./ Filename :filename.h/ Project Code :The project code a
9、bout this file/ Abstract :Describe the content of this file summarily/ Reference :./ Version :1.1/ Author :the name of author(mender)/ Accomplished date : September 2, 2004/ Replaced version : 1.0 / Original Author : the name of original author(mender)/ Accomplished date : September 10, 2003/ Main f
10、unctions :/Function 1 Return code Function name(Parameter Explain)/Function 2 Return code Function name(Parameter Explain)/./Function n Return code Function name(Parameter Explain)/示例3-1 文件信息聲明 【規(guī)則3.1-1】文件信息聲明以兩行斜杠開始,以兩行斜杠結(jié)束,每一行都以兩個(gè)斜杠開始;
11、60; 【規(guī)則3.1-2】文件信息聲明包含五個(gè)部分,各部分之間以一空行間隔; 【規(guī)則3.1-3】在主要函數(shù)部分描述了文件所包含的主要函數(shù)的聲明信息,如果是頭文件,這一部分是可以省略的。3.1.2 頭文件的結(jié)構(gòu)頭文件由三部分內(nèi)容組成: (1) 頭文件開頭處的文件信息聲明(參見示例3-1);(2) 預(yù)處理塊;(3) 函數(shù)和類結(jié)構(gòu)聲明等。假設(shè)頭文件名稱為 filesystem.h,頭文件的結(jié)構(gòu)參見示
12、例3-2。 【規(guī)則3.2-1】為了防止頭文件被重復(fù)引用,應(yīng)當(dāng)用ifndef/define/endif結(jié)構(gòu)產(chǎn)生預(yù)處理塊;“#ifndef”或者“#define”后以TAB鍵代替SPACE鍵做空格;如果頭文件名稱是由多個(gè)單詞組成,則各單詞間以下劃線“_”連接,例如有頭文件名稱為“filesystem.h”,則定義如下:“#ifndef_FILE_SYSTEM_H_”; 【規(guī)則3.2-2】用 #include< filename.h> 格式來引用
13、標(biāo)準(zhǔn)庫(kù)的頭文件(編譯器將從標(biāo)準(zhǔn)庫(kù)目錄開始搜索); 【規(guī)則3.2-3】用 #include “filename.h” 格式來引用非標(biāo)準(zhǔn)庫(kù)的頭文件(編譯器將從用戶的工作目錄開始搜索); 【建議3.2-1】頭文件中只存放“聲明”而不存放“定義”; 【建議3.2-1】頭文件中應(yīng)包含所有定義文件所定義的函數(shù)聲明,如果一個(gè)頭文件對(duì)應(yīng)多個(gè)定義文件,則不同定義文件內(nèi)實(shí)現(xiàn)的函數(shù)要分開聲明,并作注釋以
14、解釋所聲明的函數(shù)從屬于那一個(gè)定義文件; 【建議3.2-3】宏定義和函數(shù)聲明分離,在兩個(gè)頭文件中定義,如果沒有類成員函數(shù),可以將類和結(jié)構(gòu)的定義與函數(shù)聲明分離,也就是說一個(gè)頭文件專用于宏定義,一個(gè)頭文件專用于類和結(jié)構(gòu)的定義,一個(gè)頭文件專用于函數(shù)聲明; 【建議3.2-4】在C+ 語法中,類的成員函數(shù)可以在聲明的同時(shí)被定義,并且自動(dòng)成為內(nèi)聯(lián)函數(shù)。這雖然會(huì)帶來書寫上的方便,但卻造成了風(fēng)格不一致,弊大于利。建議將成員函數(shù)的定義與聲明分開,不論該函數(shù)體有多么小。頭文
15、件的結(jié)構(gòu)如下:/文件信息聲明見示例3-1,此處省略。 #ifndef_FILE_SYSTEM_H_/avoid referencing the file filesystem.h repeat#define_FILE_SYSTEM_H_#include <math.h>/reference standard head file#include “myheader.h” /reference non-standard head filevoid Function1();/global function declareclass CBox /class structure d
16、ecalre;#endif示例3-2 C+/C頭文件的結(jié)構(gòu) 3.1.3 定義文件的結(jié)構(gòu)定義文件有三部分內(nèi)容:(1) 定義文件開頭處的文件信息聲明(參見示例3-1);(2) 對(duì)一些頭文件的引用;(3) 程序的實(shí)現(xiàn)體(包括數(shù)據(jù)和代碼)。假設(shè)定義文件的名稱為 filesystem.c,定義文件的結(jié)構(gòu)參見示例3-3。/文件信息聲明見示例3-1,此處省略。 #include “filesystem.h”/reference a head file/global function
17、 realizationvoid Function1() /class member function realizationvoid CBox:Draw()示例3-3 C+/C定義文件的結(jié)構(gòu)3.1.4 頭文件的作用早期的編程語言如Basic、Fortran沒有頭文件的概念,C+/C語言的初學(xué)者雖然會(huì)用使用頭文件,但常常不明其理。這里對(duì)頭文件的作用略作解釋:(1) 通過頭文件來調(diào)用庫(kù)功能。在很多場(chǎng)合,源代碼不便(或不準(zhǔn))向用戶公布,只要向用戶提供頭文件和二進(jìn)制的庫(kù)即可。用戶只需要按照頭文件中的接口聲明來調(diào)用庫(kù)功能,而不必關(guān)心接口怎么實(shí)現(xiàn)的。編譯器會(huì)從庫(kù)中提取相應(yīng)的代碼;(2) 頭文件
18、能加強(qiáng)類型安全檢查。如果某個(gè)接口被實(shí)現(xiàn)或被使用時(shí),其方式與頭文件中的聲明不一致,編譯器就會(huì)指出錯(cuò)誤,這一簡(jiǎn)單的規(guī)則能大大減輕程序員調(diào)試、改錯(cuò)的負(fù)擔(dān)。3.1.5 目錄結(jié)構(gòu)如果一個(gè)軟件的頭文件數(shù)目比較多(如超過十個(gè)),通常應(yīng)將頭文件和定義文件分別保存于不同的目錄,以便于維護(hù)。例如可將頭文件保存于include目錄,將定義文件保存于source目錄(可以是多級(jí)目錄)。如果某些頭文件是私有的,它不會(huì)被用戶的程序直接引用,則沒有必要公開其“聲明”。為了加強(qiáng)信息隱藏,這些私有的頭文件可以和定義文件存放于同一個(gè)目錄。3.2 命名規(guī)則比較著名的命名規(guī)則當(dāng)推“匈牙利” 命名法,該命名規(guī)則的主要思想是“在變量和函
19、數(shù)名中加入前綴以增進(jìn)人們對(duì)程序的理解”。例如所有的字符變量均以ch為前綴,若是指針變量則追加前綴p。如果一個(gè)變量由ppch開頭,則表明它是指向字符指針的指針。“匈牙利”法最大的缺點(diǎn)是煩瑣,例如int i, j, k; float x, y, z;倘若采用“匈牙利”命名規(guī)則,則應(yīng)當(dāng)寫成int iI, iJ, ik; / 前綴 i表示int類型float fX, fY, fZ; / 前綴 f表示float類型如此煩瑣的程序會(huì)讓絕大多數(shù)程序員無法忍受??偟恼f來,沒有一種命名規(guī)則可以讓所有的程序員贊同,且命名規(guī)則對(duì)軟件產(chǎn)品而言并不是“成敗悠關(guān)”的事,而且在不同的平臺(tái)和不同的環(huán)境下編寫的程序所應(yīng)遵循的規(guī)
20、則也不盡相同,所以我們只是追求制定一種令大多數(shù)項(xiàng)目成員滿意的命名規(guī)則,并在項(xiàng)目中貫徹實(shí)施。3.2.1 共性原則本節(jié)論述的共性規(guī)則是被大多數(shù)程序員采納的,我們應(yīng)當(dāng)在遵循這些共性規(guī)則的前提下,再擴(kuò)充特定的規(guī)則,如3.2.2節(jié) 【規(guī)則3.2.1-1】標(biāo)識(shí)符應(yīng)當(dāng)直觀且可以拼讀,可望文知意,不必進(jìn)行“解碼”; 【規(guī)則3.2.1-2】標(biāo)識(shí)符的長(zhǎng)度應(yīng)當(dāng)符合“min-length && max-information”原則;
21、160; 【規(guī)則3.2.1-3】命名規(guī)則盡量與所采用的操作系統(tǒng)或開發(fā)工具的風(fēng)格保持一致; 【規(guī)則3.2.1-4】程序中不要出現(xiàn)僅靠大小寫區(qū)分的相似的標(biāo)識(shí)符。 【規(guī)則3.2.1-5】程序中不要出現(xiàn)標(biāo)識(shí)符完全相同的局部變量和全局變量,盡管兩者的作用域不同而不會(huì)發(fā)生語法錯(cuò)誤,但會(huì)使人誤解; 【規(guī)則3.2.1-6】變量的名字應(yīng)當(dāng)使用“名詞”或者“形容詞名
22、詞”; 【規(guī)則3.2.1-7】全局函數(shù)的名字應(yīng)當(dāng)使用“動(dòng)詞”或者“動(dòng)詞名詞”(動(dòng)賓詞組); 【規(guī)則3.2.1-8】用正確的反義詞組命名具有互斥意義的變量或相反動(dòng)作的函數(shù)等; 【建議3.2.1-9】盡量避免名字中出現(xiàn)數(shù)字編號(hào),如Value1,Value2等,除非邏輯上的確需要編號(hào);注:3.2.1
23、60; 標(biāo)識(shí)符最好采用英文單詞或其組合,便于記憶和閱讀,切忌使用漢語拼音來命名,程序中的英文單詞一般不要太復(fù)雜,用詞應(yīng)當(dāng)準(zhǔn)確,例如不要把CurrentValue寫成NowValue;3.2.2 標(biāo)示符的長(zhǎng)度應(yīng)當(dāng)以最小的長(zhǎng)度實(shí)現(xiàn)最多信息,一般來說,長(zhǎng)名字能更好地表達(dá)含義,但并非長(zhǎng)的變量名就一定要比短的變量名要好,此外單字符的名字也是有用的,常見的如i,j,k,m,n,x,y,z等,它
24、們通??捎米骱瘮?shù)內(nèi)的局部變量;3.2.3 不同的操作系統(tǒng)的程序設(shè)計(jì)風(fēng)格是不一樣的,例如Windows應(yīng)用程序的標(biāo)識(shí)符通常采用“大小寫”混排的方式,如AddChild,而Unix應(yīng)用程序的標(biāo)識(shí)符通常采用“小寫加下劃線”的方式,如add_child,別把這兩類風(fēng)格混在一起使用;3.2.2 Windows變量命名規(guī)則 【規(guī)則3.2.2-1】變量的命名規(guī)則要求采用“匈牙利法則”
25、,即開頭字母用變量的類型,其余部分用變量的英文意思或其英文意思的縮寫,盡量避免采用中文拼音,要求單詞的第一個(gè)字母大寫;即:變量名變量類型變量英文意思(或縮寫)變量類型請(qǐng)參見附表1變量類型表; 【規(guī)則3.2.2-2】類名和函數(shù)名用大寫字母開頭的單詞組合而成;對(duì)struct、union、class變量的命名要求定義的類型用大寫,結(jié)構(gòu)采用S開頭,聯(lián)合體采用U開頭,類采用C開頭;例如:struct SPointintm_nX;intm_nY;union URecordLenBYTEm_byRecordNum;BYTEm_byRec
26、ordLen;class CNode/類成員變量或成員函數(shù); 【規(guī)則3.2.2-3】指針變量命名的基本原則為:一重指針變量的基本原則為:變量名 “p”變量類型前綴命名對(duì)多重指針變量的基本原則為:二重指針:變量名“pp”變量類型前綴命名三重指針:變量名“ppp”變量類型前綴命名.例如一個(gè)short*型的變量應(yīng)該表示為pnStart; 【規(guī)則3.2.2-4】全局變量用g_開頭;例如一個(gè)全局的長(zhǎng)型變量定義為g_lFileNum,即:變量名g_變量類型變量的英文意思(或縮寫);
27、60; 【規(guī)則3.2.2-5】靜態(tài)變量采用s_開頭;例如一個(gè)靜態(tài)的指針變量定義為s_plPrevInst,即:變量名s_變量類型變量的英文意思(或縮寫); 【規(guī)則3.2.2-6】類成員變量采用m_開頭;例如一個(gè)長(zhǎng)型成員變量定義為m_lCount,即:變量名m_變量類型變量的英文意思(或縮寫); 【規(guī)則3.2.2-7】對(duì)const的變量要求在變量的命名規(guī)則前加入c_(若作為函數(shù)的輸入?yún)?shù),可以不加),即:變量名c_變量命名規(guī)則,例如:const char* c_sz
28、FileName; 【規(guī)則3.2.2-8】對(duì)枚舉類型(enum)中的變量,要求用枚舉變量或其縮寫做前綴,且用下劃線隔離變量名,所有枚舉類型都要用大寫,例如:enumEMDAYSEMDAYS_MONDAY;EMDAYS_TUESDAY;.; 【規(guī)則3.2.2-9】對(duì)常量(包括錯(cuò)誤的編碼)命名,要求常量名用大寫,常量名用英文意思表示其意思,用下劃線分割單詞,例如:#defineCM_7816_OK0x9000;
29、; 【規(guī)則3.2.2-10】為了防止某一軟件庫(kù)中的一些標(biāo)識(shí)符和其它軟件庫(kù)中的沖突,可以為各種標(biāo)識(shí)符加上能反映軟件性質(zhì)的前綴。例如三維圖形標(biāo)準(zhǔn)OpenGL的所有庫(kù)函數(shù)均以gl開頭,所有常量(或宏定義)均以GL開頭。3.3 程序風(fēng)格程序風(fēng)格雖然不會(huì)影響程序的功能,但會(huì)影響程序的可讀性,追求清晰、美觀,是程序風(fēng)格的重要構(gòu)成因素。3.3.1 空行空行起著分隔程序段落的作用??招械皿w(不過多也不過少)將使程序的布局更加清晰??招胁粫?huì)浪費(fèi)內(nèi)存,雖然打印含有空行的程序是會(huì)多消耗一些紙張,但是值得。 【規(guī)則3.3.
30、1-1】在每個(gè)類聲明之后、每個(gè)函數(shù)定義結(jié)束之后都要加空行。參見示例3.3.1(a); 【規(guī)則3.3.1-2】在一個(gè)函數(shù)體內(nèi),邏揖上密切相關(guān)的語句之間不加空行,其它地方應(yīng)加空行分隔。參見示例3.3.1(b); / blank linevoid Function1() / blank linevoid Function2() / blank linevoid Function3() / blank linewhile (condition)statement1;/ blank lineif (condit
31、ion) statement2;elsestatement3;/ blank linestatement4; 示例3.3.1(a) 函數(shù)之間的空行 示例3.3.1(b) 函數(shù)內(nèi)部的空行 3.3.2 代碼行 【規(guī)則3.3.2-1】一行代碼只做一件事情,如只定義一個(gè)變量,或只寫一條語句,這樣的代碼容易閱讀,并且方便于寫注釋; 【規(guī)則3.3.2-2】if、for、while、do等語句自占一行,執(zhí)行語句不得緊跟其后,不論執(zhí)行語句有多少都要加,這樣可
32、以防止書寫失誤; 【規(guī)則3.3.2-3】if、for、while、do等語句的“”要單獨(dú)占用一行; 【建議3.3.2-1】所有函數(shù)內(nèi)的變量都在函數(shù)開始處定義; 【建議3.3.2-2】盡可能在定義變量的同時(shí)初始化該變量(就近原則),如果變量的引用處和其定義處相隔比較遠(yuǎn),變量的初始化很容易被忘記。如果引用了未被初始化的變量,可能會(huì)導(dǎo)致程序錯(cuò)誤,本建議可以減少隱患。示例3.3.2(a)為
33、風(fēng)格良好的代碼行,示例3.3.2(b)為風(fēng)格不良的代碼行。 int nWidth;/ widthint nHeight;/ heightint nDepth;/ depth int nWidth,nHight,nDepth;/width,height,depth x = a + b;y = c + d;z = e + f;X a + b; y = c + d; z = e + f; if (nWidth < nHight) DoSomething();if (nWidth < nHight) DoSomething();for (
34、initialization; condition; update)DoSomething();/ blank lineOther(); for (initialization; condition; update) DoSomething();Other(); 示例3.3.2(a) 風(fēng)格良好的代碼行 示例3.3.2(b) 風(fēng)格不良的代碼行3.3.3 代碼行內(nèi)的空格 【規(guī)則3.3.3-1】關(guān)鍵字之后要留空格,象const、virtual、inline、case 等關(guān)鍵字之后至少要留一個(gè)空格,
35、否則無法辨析關(guān)鍵字,象if、for、while等關(guān)鍵字之后應(yīng)留一個(gè)空格再跟左括號(hào)(,以突出關(guān)鍵字; 【規(guī)則3.3.3-2】函數(shù)名之后不要留空格,緊跟左括號(hào)(,以與關(guān)鍵字區(qū)別; 【規(guī)則3.3.3-3】(向后緊跟,)、,、;向前緊跟,緊跟處不留空格; 【規(guī)則3.3.3-4】,之后要留空格,如Function(x, y, z),如果;不是一行的結(jié)束符號(hào),其后要留空格,如for (init
36、ialization; condition; update); 【規(guī)則3.3.3-5】賦值操作符、比較操作符、算術(shù)操作符、邏輯操作符、位域操作符,如“=”、“+=” “>=”、“<=”、“+”、“*”、“%”、“&&”、“|”、“<<”,“”等二元操作符的前后應(yīng)當(dāng)加空格; 【規(guī)則3.3.3-6】一元操作符如“!”、“”、“+”、“-”、“&”(地址運(yùn)算符)等前后不加空格;
37、; 【規(guī)則3.3.3-7】象“”、“.”、“->”這類操作符前后不加空格; 【建議3.3.3-1】對(duì)于表達(dá)式比較長(zhǎng)的for語句和if語句,為了緊湊起見可以適當(dāng)?shù)厝サ粢恍┛崭?,如for (i=0; i<10; i+)和if (a<=b) && (c<=d) void Func1(int x, int y, int z); / favorable stylevoid Func1 (int x,int y,int z); / ill style
38、if (year >= 2000) / favorable styleif(year>=2000) / ill styleif (a>=b) && (c<=d) / favorable styleif(a>=b&&c<=d) / ill stylefor (i=0; i<10; i+) / favorable stylefor(i=0;i<10;i+) / ill stylefor (i = 0; I < 10; i +) / favorable stylex = a < b ? a : b; / fa
39、vorable stylex=a<b?a:b; / ill styleint *x = &y; / favorable style int * x = & y; / ill style array5 = 0; / Do not use array 5 = 0;a.Function(); / Do not use a . Function();b->Function(); / Do not use b -> Function(); 示例3.3.3 代碼行內(nèi)的空格 3.3.4 對(duì)齊
40、160; 【規(guī)則3.3.4-1】程序的分界符和應(yīng)獨(dú)占一行并且位于同一列,同時(shí)與引用它們的語句左對(duì)齊; 【規(guī)則3.3.4-2】 之內(nèi)的代碼塊在右邊數(shù)格處左對(duì)齊; 【規(guī)則3.3.4.3】代碼的的對(duì)齊采用TAB鍵而不采用空格鍵對(duì)齊,一般TAB鍵設(shè)置為向后空4個(gè)空格。 示例3.3.4(a)為風(fēng)格良好的對(duì)齊,示例3.3.4(b)為風(fēng)格不良的對(duì)齊。 void Function(int x) / program code v
41、oid Function(int x) / program code if (condition) / program codeelse / program codeif (condition) / program codeelse / program codefor (initialization; condition; update) / program codefor (initialization; condition; update) / program codeWhile (condition) / program codewhile (condition) / prog
42、ram code如果出現(xiàn)嵌套的,則使用縮進(jìn)對(duì)齊,如: 示例3.3.4(a) 風(fēng)格良好的對(duì)齊 示例3.3.4(b) 風(fēng)格不良的對(duì)齊3.3.5 長(zhǎng)行拆分 【規(guī)則3.3.5-1】代碼行最大長(zhǎng)度宜控制在70至80個(gè)字符以內(nèi); 【規(guī)則3.3.5-2】長(zhǎng)表達(dá)式要在低優(yōu)先級(jí)操作符處拆分成新行,操作符放在新行之首(以便突出操作符),拆分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語句可讀。 if (very_longer_variable1 >=
43、 very_longer_variable12)&& (very_longer_variable3 <= very_longer_variable14)&& (very_longer_variable5 <= very_longer_variable16) DoSomething();virtual CMatrix CMultiplyMatrix (CMatrix leftMatrix, CMatrix rightMatrix); for (very_longer_initialization; very_longer_condition;
44、 very_longer_update)DoSomething();示例3.3.5 長(zhǎng)行的拆分3.3.6 修飾符的位置修飾符 * 和 應(yīng)該靠近數(shù)據(jù)類型還是該靠近變量名,是個(gè)有爭(zhēng)議的活題,若將修飾符 * 靠近數(shù)據(jù)類型,例如:int* x; 從語義上講此寫法比較直觀,即x是int 類型的指針,上述寫法的弊端是容易引起誤解,例如:int* x, y; 此處y容易被誤解為指針變量。雖然將x和y分行定義可以避免誤解,但并不是人人都愿意這樣做。 【規(guī)則3.3.6-1】應(yīng)當(dāng)將修飾符 * 和 緊靠變量名;3.3.7 注釋C語言的注釋符為“
45、/*/”。C+語言中,程序塊的注釋常采用“/*/”,行注釋一般采用“/”。注釋通常用于:(1)版本、版權(quán)聲明;(2)函數(shù)接口說明;(3)重要的代碼行或段落提示。雖然注釋有助于理解代碼,但注意不可過多地使用注釋。參見示例3.3.7。 【規(guī)則3.3.7-1】注釋是對(duì)代碼的“提示”,而不是文檔,程序中的注釋不可喧賓奪主,注釋太多了會(huì)讓人眼花繚亂,注釋的花樣要少; 【規(guī)則3.3.7-2】如果代碼本來就是清楚的,則不必加注釋;例如 i+; / i 加
46、 1,多余的注釋 【規(guī)則3.3.7-3】邊寫代碼邊注釋,修改代碼同時(shí)修改相應(yīng)的注釋,以保證注釋與代碼的一致性,不再有用的注釋要?jiǎng)h除; 【規(guī)則3.3.7-4】注釋應(yīng)當(dāng)準(zhǔn)確、易懂,防止注釋有二義性,錯(cuò)誤的注釋不但無益反而有害; 【規(guī)則3.3.7-5】盡量避免在注釋中使用縮寫,特別是不常用縮寫; 【規(guī)則3.3.7-6
47、】注釋的位置應(yīng)與被描述的代碼相鄰,可以放在代碼的上方或右方,不可放在下方; 【規(guī)則3.3.7-8】當(dāng)代碼比較長(zhǎng),特別是有多重嵌套時(shí),應(yīng)當(dāng)在一些段落的結(jié)束處加注釋,便于閱讀; 【建議3.3.7-9】對(duì)于多行代碼的注釋,盡量不采用“/*.*/”,而采用多行“/”注釋,這樣雖然麻煩,但是在做屏蔽調(diào)試時(shí)不用查找配對(duì)的“/*.*/”。 / Function capacity:/ Parameter declare:/ Return value :/vo
48、id Function(float x, float y, float z) if () while () / end of while / end of if示例3.3.7 程序的注釋3.7.1 文件頭的注釋文件頭的注釋請(qǐng)參見3.1,文件頭的注釋是以兩行斜杠開始,以兩行斜杠結(jié)束(以區(qū)別于函數(shù)的注釋)。3.7.2 函數(shù)頭的注釋一般說來每個(gè)函數(shù)都應(yīng)該做詳細(xì)的注釋,函數(shù)頭的注釋是以一行斜杠開始,以一行斜杠結(jié)束,注釋的內(nèi)容包括“功能”,“參數(shù)”,“返回值”,“設(shè)計(jì)思想”,“調(diào)用函數(shù)”,“日期”,“修改記錄”等幾個(gè)方面,函數(shù)頭的注釋格式如下:/ Function capacity :Des
49、cribe the function capacity/ Parameter declare :/ parameter 1: Describe the function of parameter ( input/output parameter )/ parameter 2: Describe the function of parameter ( input/output parameter )/./ Return value : Describe the possible return value/ Designed idea : Describe designed idea about
50、the function/ Author :/ Creation date : Creation date(YY-MM-DD)/ Transferred function:List the sub-function in the function/ Modification record:/ (一)Mender 1:Modified date:modified content/3.4 函數(shù)設(shè)計(jì)函數(shù)是C+/C程序的基本功能單元,其重要性不言而喻。函數(shù)設(shè)計(jì)的細(xì)微缺點(diǎn)很容易導(dǎo)致該函數(shù)被錯(cuò)用,所以光使函數(shù)的功能正確是不夠的。本章重點(diǎn)論述函數(shù)的接口設(shè)計(jì)和內(nèi)部實(shí)現(xiàn)的一些規(guī)則。函數(shù)接口的兩個(gè)要素是參數(shù)和返回
51、值。C語言中,函數(shù)的參數(shù)和返回值的傳遞方式有兩種:值傳遞(pass by value)和指針傳遞(pass by pointer)。C+ 語言中多了引用傳遞(pass by reference)。由于引用傳遞的性質(zhì)象指針傳遞,而使用方式卻象值傳遞,初學(xué)者常常迷惑不解,容易引起混亂,請(qǐng)先閱讀3.4.6節(jié)“引用與指針的比較”。3.4.1 參數(shù)的規(guī)則 【規(guī)則3.4.1-1】參數(shù)的書寫要完整,不要貪圖省事只寫參數(shù)的類型而省略參數(shù)名字,如果函數(shù)沒有參數(shù),則用void填充;例如:void SetValue(int nWidth, in
52、t nHeight);/ 良好的風(fēng)格void SetValue(int, int);/ 不良的風(fēng)格float GetValue(void);/ 良好的風(fēng)格float GetValue();/ 不良的風(fēng)格 【規(guī)則3.4.1-2】參數(shù)命名要恰當(dāng),順序要合理;例如編寫字符串拷貝函數(shù)StringCopy,它有兩個(gè)參數(shù),如果把參數(shù)名字起為str1和str2,例如:void StringCopy(char *str1, char *str2);那么我們很難搞清楚究竟是把str1拷貝到str2中,還是剛好倒過來,可以把參數(shù)名字起得更有意
53、義,如叫strSource和strDestination。這樣從名字上就可以看出應(yīng)該把strSource拷貝到strDestination。還有一個(gè)問題,這兩個(gè)參數(shù)那一個(gè)該在前那一個(gè)該在后?參數(shù)的順序要遵循程序員的習(xí)慣。一般地,應(yīng)將目的參數(shù)放在前面,源參數(shù)放在后面。如果將函數(shù)聲明為:void StringCopy(char *strSource, char *strDestination);別人在使用時(shí)可能會(huì)不假思索地寫成如下形式:char str20;StringCopy(str, “Hello World”);/ 參數(shù)順序顛倒
54、160; 【規(guī)則3.4.1-3】如果參數(shù)是指針,且僅作輸入用,則應(yīng)在類型前加const,以防止該指針在函數(shù)體內(nèi)被意外修改。例如:void StringCopy(char *strDestination,const char *strSource); 【規(guī)則3.4.1-4】如果輸入?yún)?shù)以值傳遞的方式傳遞對(duì)象,則宜改用“const &”方式來傳遞,這樣可以省去臨時(shí)對(duì)象的構(gòu)造和析構(gòu)過程,從而提高效率; 【建議3.4.1-1】避免函數(shù)有太多
55、的參數(shù),參數(shù)個(gè)數(shù)盡量控制在5個(gè)以內(nèi)。如果參數(shù)太多,在使用時(shí)容易將參數(shù)類型或順序搞錯(cuò); 【建議3.4.1-2】盡量不要使用類型和數(shù)目不確定的參數(shù);C標(biāo)準(zhǔn)庫(kù)函數(shù)printf是采用不確定參數(shù)的典型代表,其原型為:int printf(const chat *format, argument);這種風(fēng)格的函數(shù)在編譯時(shí)喪失了嚴(yán)格的類型安全檢查。3.4.2 返回值的規(guī)則 【規(guī)則3.4.2-1】不要省略返回值的類型;C語言中,凡不加類型說明的函數(shù),一律自動(dòng)按整型處理
56、,這樣做不會(huì)有什么好處,卻容易被誤解為void類型;C+語言有很嚴(yán)格的類型安全檢查,不允許上述情況發(fā)生。由于C+程序可以調(diào)用C函數(shù),為了避免混亂,規(guī)定任何C+/ C函數(shù)都必須有類型。如果函數(shù)沒有返回值,那么應(yīng)聲明為void類型 【規(guī)則3.4.2-2】函數(shù)名字與返回值類型在語義上不可沖突;違反這條規(guī)則的典型代表是C標(biāo)準(zhǔn)庫(kù)函數(shù)getchar。例如:char c;c = getchar();if (c = EOF)按照getchar名字的意思,將變量c聲明為char類型是很自然的事情。但不幸的是getchar的確不是char類型
57、,而是int類型,其原型如下:int getchar(void);由于c是char類型,取值范圍是-128,127,如果宏EOF的值在char的取值范圍之外,那么if語句將總是失敗,這種“危險(xiǎn)”人們一般哪里料得到!導(dǎo)致本例錯(cuò)誤的責(zé)任并不在用戶,是函數(shù)getchar誤導(dǎo)了使用者 【規(guī)則3.4.2-3】不要將正常值和錯(cuò)誤標(biāo)志混在一起返回。正常值用輸出參數(shù)獲得,而錯(cuò)誤標(biāo)志用return語句返回; 【建議3.4.2-1】有時(shí)候函數(shù)原本不需要返回值,但為了增加靈
58、活性如支持鏈?zhǔn)奖磉_(dá),可以附加返回值;例如字符串拷貝函數(shù)strcpy的原型:char *strcpy(char *strDest,const char *strSrc);strcpy函數(shù)將strSrc拷貝至輸出參數(shù)strDest中,同時(shí)函數(shù)的返回值又是strDest。這樣做并非多此一舉,可以獲得如下靈活性:char str20;int nLength = strlen( strcpy(str, “Hello World”) ); 【建議3.4.2-2】如果函數(shù)的返回值是一個(gè)對(duì)象,有些場(chǎng)合用“引用傳遞”替換“值傳遞”可以提高效
59、率。而有些場(chǎng)合只能用“值傳遞”而不能用“引用傳遞”,否則會(huì)出錯(cuò);對(duì)于建議3.4.2-2,如果函數(shù)的返回值是一個(gè)對(duì)象,有些場(chǎng)合用“引用傳遞”替換“值傳遞”可以提高效率,而有些場(chǎng)合只能用“值傳遞”而不能用“引用傳遞”,否則會(huì)出錯(cuò),例如:class String/ 賦值函數(shù)String& operate=(const String &other);/ 相加函數(shù),如果沒有friend修飾則只許有一個(gè)右側(cè)參數(shù)friendString operate+( const String &s1, const String &s2); private:char *m_data; ;String的賦值函數(shù)operate = 的實(shí)現(xiàn)如下:String & String:operate=(const String &other)if (this =
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年粵教新版九年級(jí)歷史上冊(cè)月考試卷含答案
- 2025年華師大新版八年級(jí)物理下冊(cè)月考試卷含答案
- 2025年滬科新版九年級(jí)地理下冊(cè)月考試卷含答案
- 2025年華東師大版九年級(jí)科學(xué)上冊(cè)階段測(cè)試試卷含答案
- 2025年北師大版選修2地理上冊(cè)月考試卷含答案
- 2025年度智慧農(nóng)業(yè)承包田地合同協(xié)議書范本4篇
- 二零二五年度“2024版內(nèi)通辦”一方案企業(yè)內(nèi)部知識(shí)管理合同4篇
- 美容院技術(shù)專利引進(jìn)與2025年度股份合作合同樣本3篇
- 影視制作成本控制與管理合同(2025年度)3篇
- 二零二五版現(xiàn)代農(nóng)業(yè)產(chǎn)業(yè)園施工承包合同4篇
- 2024年高純氮化鋁粉體項(xiàng)目可行性分析報(bào)告
- 公司發(fā)展能力提升方案
- 電梯安全守則及乘客須知
- IT硬件系統(tǒng)集成項(xiàng)目質(zhì)量管理方案
- 《容幼穎悟》2020年江蘇泰州中考文言文閱讀真題(含答案與翻譯)
- 水上水下作業(yè)應(yīng)急預(yù)案
- API520-安全閥計(jì)算PART1(中文版)
- 2023年廣東省廣州地鐵城際鐵路崗位招聘筆試參考題庫(kù)附帶答案詳解
- 商務(wù)提成辦法
- 直流電機(jī)電樞繞組簡(jiǎn)介
- GB/T 19889.5-2006聲學(xué)建筑和建筑構(gòu)件隔聲測(cè)量第5部分:外墻構(gòu)件和外墻空氣聲隔聲的現(xiàn)場(chǎng)測(cè)量
評(píng)論
0/150
提交評(píng)論