軟件開發(fā)流程規(guī)范_第1頁
軟件開發(fā)流程規(guī)范_第2頁
軟件開發(fā)流程規(guī)范_第3頁
軟件開發(fā)流程規(guī)范_第4頁
軟件開發(fā)流程規(guī)范_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

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è)計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 對齊203.3.5 長行拆分223.3.6 修飾符的位置233.3.7 注釋233.4 函數(shù)設(shè)計263.4.1 參數(shù)的規(guī)則263.4.2 返回值的規(guī)則273.4.3 函數(shù)內(nèi)部實現(xiàn)的規(guī)則303.4.4 其它建議323.4.5 使用斷言323.4.6 引用與指針的比較333.5 變量類型定義35四、軟件測試規(guī)范364.1 單元測試364.2 系統(tǒng)測試374.6 業(yè)務(wù)測試384.7 驗收測試384.8 用戶現(xiàn)場測試38五、軟件版本管理394.1版本管理的必要性39一、概述本文制定煙臺開發(fā)區(qū)德聯(lián)軟件有限責(zé)任公司計算機(jī)軟件開發(fā)規(guī)范文檔。本規(guī)范的目的是使公司軟件開發(fā)

3、項目階段清晰、要求明確、任務(wù)具體、編寫的代碼規(guī)范,使之規(guī)范化、系統(tǒng)化和工程化,向公司內(nèi)從事軟件開發(fā)的工程師和管理人員提出一系列規(guī)范和要求,從而有利于開發(fā)過程的控制和管理,提高所開發(fā)軟件系統(tǒng)的質(zhì)量,縮短開發(fā)時間,減少開發(fā)和維護(hù)費用,以保證項目高質(zhì)量、順利進(jìn)行。本規(guī)范包含:開發(fā)流程規(guī)范和開發(fā)代碼規(guī)范等,開發(fā)流程規(guī)范需要技術(shù)開發(fā)人員編寫相關(guān)內(nèi)容,希望每個技術(shù)人員形成習(xí)慣,如有新的內(nèi)容更新會及時通知大家,如有好的規(guī)范要求也可通知編制人員及時更新。本規(guī)范為煙臺開發(fā)區(qū)德聯(lián)軟件有限責(zé)任公司內(nèi)部材料,嚴(yán)禁其他商業(yè)應(yīng)用。二、開發(fā)流程規(guī)范接受開發(fā)任務(wù),詳細(xì)閱讀軟件技術(shù)規(guī)范或技術(shù)文檔,如對技術(shù)文檔有疑義或者不清楚的

4、地方及時與項目總工或用戶溝通,根據(jù)文檔和溝通內(nèi)容編寫項目開發(fā)計劃,必須包括但不限于系統(tǒng)軟硬件開發(fā)環(huán)境、系統(tǒng)架構(gòu)、系統(tǒng)功能模塊設(shè)計、系統(tǒng)功能開發(fā)流程圖、開發(fā)修改記錄。2.1 系統(tǒng)軟硬件開發(fā)環(huán)境開發(fā)環(huán)境的搭建,最好形成文檔,便于以后同樣工作的使用。開發(fā)人員要明確系統(tǒng)開發(fā)擬采用的數(shù)據(jù)庫、操作系統(tǒng)、開發(fā)語言、開發(fā)工具、服務(wù)器等(具體到版本)。明確整個系統(tǒng)開發(fā)工作流程,至少應(yīng)該包括以下流程。2.2 系統(tǒng)架構(gòu)(系統(tǒng)組成)確定系統(tǒng)整體體系架構(gòu),各層次之間的數(shù)據(jù)流的連接,確定軟件服務(wù)器的硬件配置及用戶硬件資源配置, 確定與用戶軟件平臺的統(tǒng)一協(xié)調(diào)。 開發(fā)人員在繪制架構(gòu)圖時給出基本框架,能反映出基本意義即可,可以

5、直接用文字代替例子中的圖片。圖1 系統(tǒng)邏輯架構(gòu)圖舉例圖2 物理架構(gòu)圖舉例2.3 系統(tǒng)功能模塊設(shè)計給出系統(tǒng)的主要功能模塊,每個模塊所包含的功能。圖3 圖書管理系統(tǒng)模塊規(guī)劃圖舉例2.4 系統(tǒng)功能開發(fā)流程圖給出系統(tǒng)主要功能的業(yè)務(wù)流程圖。圖4 系統(tǒng)功能業(yè)務(wù)流程圖舉例2.5 開發(fā)修改記錄1. 開發(fā)代碼做好備份(可以在完成一個重大功能之后,或者按時間周期性進(jìn)行備份),以免由于不可抗力導(dǎo)致代碼不可修復(fù)。2.在每次重大修改之后要做好記錄(改動的具體細(xì)節(jié)),修改前的版本要及時備份,可以方面隨時還原系統(tǒng)。修改日期修改內(nèi)容是否備份備注三、開發(fā)代碼規(guī)范在研究項目團(tuán)隊協(xié)作開發(fā)的情況下(這里的團(tuán)隊協(xié)作也適合于應(yīng)用項目的開

6、發(fā)),編程時應(yīng)該強(qiáng)調(diào)的一個重要方面是程序的易讀性,在保證軟件速度等性能指標(biāo)能滿足用戶需求的情況下,能讓其他程序員容易讀懂你所編寫的程序。若研究項目小組的所有開發(fā)人員都遵循統(tǒng)一的、鮮明的一套編程風(fēng)格,可以讓協(xié)作者、后繼者和自己一目了然,在很短的時間內(nèi)看清楚程序結(jié)構(gòu),理解設(shè)計的思路,大大提高代碼的可讀性、可重用性、程序健壯性、可移植性、可維護(hù)性。制定本編程規(guī)范的目的是為了提高軟件開發(fā)效率及所開發(fā)軟件的可維護(hù)性,提高軟件的質(zhì)量。本規(guī)范由程序風(fēng)格、命名規(guī)范、注釋規(guī)范、程序健壯性、可移植性、錯誤處理以及軟件的模塊化規(guī)范等部分組成。此規(guī)范以C/C+程序設(shè)計討論。3.1 文件結(jié)構(gòu)每個C+/C程序通常分為兩個

7、文件。一個文件用于保存程序的聲明(declaration),稱為頭文件。另一個文件用于保存程序的實現(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) 文件名稱,項目代碼,摘要,參考文獻(xiàn);(3) 當(dāng)前版本號,作者/修改者,完成日期;(4) 版本歷史信息;(5) 主要函數(shù)描述。/ Copyrigh

8、t (c) 2015, DeLianSoftCompany YanTai/ All rights reserved./ :/ Project Code :The project code about this Abstract :Describe the content of this / Reference :./ Version :1.1/ Author :the name of author(mender)/ Accomplished date : September 2, 2004/ Replaced version : 1.0 / Original Author : the name

9、 of original author(mender)/ Accomplished date : September 10, 2003/ Main functions :/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é)束,

10、每一行都以兩個斜杠開始; 【規(guī)則3.1-2】文件信息聲明包含五個部分,各部分之間以一空行間隔; 【規(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è)頭文件名稱為 ,頭文件的結(jié)構(gòu)參見示例3-2。 【規(guī)則3.2-1】為了防止頭文件被重復(fù)引用,應(yīng)當(dāng)用ifndef/define/endif結(jié)構(gòu)產(chǎn)生預(yù)處理塊;“#ifndef”或者“#define”后以TAB鍵代替SPACE鍵做空格;如果頭文件名稱是

11、由多個單詞組成,則各單詞間以下劃線“_”連接,例如有頭文件名稱為“”,則定義如下:“#ifndef_”; 【規(guī)則3.2-2】用 #include 格式來引用標(biāo)準(zhǔn)庫的頭文件(編譯器將從標(biāo)準(zhǔn)庫目錄開始搜索); 【規(guī)則3.2-3】用 #include “” 格式來引用非標(biāo)準(zhǔn)庫的頭文件(編譯器將從用戶的工作目錄開始搜索); 【建議3.2-1】頭文件中只存放“聲明”而不存放“定義”; 【建議3.2-1】頭文件中應(yīng)包含所有定義文件所定義的函數(shù)聲明,如果一個頭文件對應(yīng)多個定義文件,則不同定義文件內(nèi)實現(xiàn)的函數(shù)要分開聲明,并作注釋以解釋所聲明的函數(shù)從屬于那一個定義文件; 【建議3.2-3】宏定義和函數(shù)聲明分離,

12、在兩個頭文件中定義,如果沒有類成員函數(shù),可以將類和結(jié)構(gòu)的定義與函數(shù)聲明分離,也就是說一個頭文件專用于宏定義,一個頭文件專用于類和結(jié)構(gòu)的定義,一個頭文件專用于函數(shù)聲明; 【建議3.2-4】在C+ 語法中,類的成員函數(shù)可以在聲明的同時被定義,并且自動成為內(nèi)聯(lián)函數(shù)。這雖然會帶來書寫上的方便,但卻造成了風(fēng)格不一致,弊大于利。建議將成員函數(shù)的定義與聲明分開,不論該函數(shù)體有多么小。頭文件的結(jié)構(gòu)如下:/文件信息聲明見示例3-1,此處省略。#ifndef_/avoid referencing the file repeat#define_#include /reference standard head fi

13、le#include “myheader.h” /reference non-standard head filevoid Function1();/global function declareclass CBox /class structure decalre;#endif示例3-2 C+/C頭文件的結(jié)構(gòu)3.1.3 定義文件的結(jié)構(gòu)定義文件有三部分內(nèi)容:(1) 定義文件開頭處的文件信息聲明(參見示例3-1);(2) 對一些頭文件的引用;(3) 程序的實現(xiàn)體(包括數(shù)據(jù)和代碼)。假設(shè)定義文件的名稱為 ,定義文件的結(jié)構(gòu)參見示例3-3。/文件信息聲明見示例3-1,此處省略。#include “”/

14、reference a head file/global function realizationvoid Function1()/class member function realizationvoid CBox:Draw()示例3-3 C+/C定義文件的結(jié)構(gòu)3.1.4 頭文件的作用早期的編程語言如Basic、Fortran沒有頭文件的概念,C+/C語言的初學(xué)者雖然會用使用頭文件,但常常不明其理。這里對頭文件的作用略作解釋:(1) 通過頭文件來調(diào)用庫功能。在很多場合,源代碼不便(或不準(zhǔn))向用戶公布,只要向用戶提供頭文件和二進(jìn)制的庫即可。用戶只需要按照頭文件中的接口聲明來調(diào)用庫功能,而不必關(guān)

15、心接口怎么實現(xiàn)的。編譯器會從庫中提取相應(yīng)的代碼;(2) 頭文件能加強(qiáng)類型安全檢查。如果某個接口被實現(xiàn)或被使用時,其方式與頭文件中的聲明不一致,編譯器就會指出錯誤,這一簡單的規(guī)則能大大減輕程序員調(diào)試、改錯的負(fù)擔(dān)。3.1.5 目錄結(jié)構(gòu)如果一個軟件的頭文件數(shù)目比較多(如超過十個),通常應(yīng)將頭文件和定義文件分別保存于不同的目錄,以便于維護(hù)。例如可將頭文件保存于include目錄,將定義文件保存于source目錄(可以是多級目錄)。如果某些頭文件是私有的,它不會被用戶的程序直接引用,則沒有必要公開其“聲明”。為了加強(qiáng)信息隱藏,這些私有的頭文件可以和定義文件存放于同一個目錄。3.2 命名規(guī)則比較著名的命名

16、規(guī)則當(dāng)推“匈牙利” 命名法,該命名規(guī)則的主要思想是“在變量和函數(shù)名中加入前綴以增進(jìn)人們對程序的理解”。例如所有的字符變量均以ch為前綴,若是指針變量則追加前綴p。如果一個變量由ppch開頭,則表明它是指向字符指針的指針?!靶傺览狈ㄗ畲蟮娜秉c是煩瑣,例如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類型如此煩瑣的程序會讓絕大多數(shù)程序員無法忍受??偟恼f來,沒有一種命名規(guī)則可以讓所有的程序員贊同,且命名規(guī)則對軟件產(chǎn)品而言并不是“成敗悠

17、關(guān)”的事,而且在不同的平臺和不同的環(huán)境下編寫的程序所應(yīng)遵循的規(guī)則也不盡相同,所以我們只是追求制定一種令大多數(shù)項目成員滿意的命名規(guī)則,并在項目中貫徹實施。3.2.1 共性原則本節(jié)論述的共性規(guī)則是被大多數(shù)程序員采納的,我們應(yīng)當(dāng)在遵循這些共性規(guī)則的前提下,再擴(kuò)充特定的規(guī)則,如3.2.2節(jié) 【規(guī)則3.2.1-1】標(biāo)識符應(yīng)當(dāng)直觀且可以拼讀,可望文知意,不必進(jìn)行“解碼”; 【規(guī)則3.2.1-2】標(biāo)識符的長度應(yīng)當(dāng)符合“min-length & max-information”原則; 【規(guī)則3.2.1-3】命名規(guī)則盡量與所采用的操作系統(tǒng)或開發(fā)工具的風(fēng)格保持一致; 【規(guī)則3.2.1-4】程序中不要出現(xiàn)僅靠大小寫

18、區(qū)分的相似的標(biāo)識符。 【規(guī)則3.2.1-5】程序中不要出現(xiàn)標(biāo)識符完全相同的局部變量和全局變量,盡管兩者的作用域不同而不會發(fā)生語法錯誤,但會使人誤解; 【規(guī)則3.2.1-6】變量的名字應(yīng)當(dāng)使用“名詞”或者“形容詞名詞”; 【規(guī)則3.2.1-7】全局函數(shù)的名字應(yīng)當(dāng)使用“動詞”或者“動詞名詞”(動賓詞組); 【規(guī)則3.2.1-8】用正確的反義詞組命名具有互斥意義的變量或相反動作的函數(shù)等; 【建議3.2.1-9】盡量避免名字中出現(xiàn)數(shù)字編號,如Value1,Value2等,除非邏輯上的確需要編號;注:3.2.1 標(biāo)識符最好采用英文單詞或其組合,便于記憶和閱讀,切忌使用漢語拼音來命名,程序中的英文單詞一般

19、不要太復(fù)雜,用詞應(yīng)當(dāng)準(zhǔn)確,例如不要把CurrentValue寫成NowValue;3.2.2 標(biāo)示符的長度應(yīng)當(dāng)以最小的長度實現(xiàn)最多信息,一般來說,長名字能更好地表達(dá)含義,但并非長的變量名就一定要比短的變量名要好,此外單字符的名字也是有用的,常見的如i,j,k,m,n,x,y,z等,它們通常可用作函數(shù)內(nèi)的局部變量;3.2.3 不同的操作系統(tǒng)的程序設(shè)計風(fēng)格是不一樣的,例如Windows應(yīng)用程序的標(biāo)識符通常采用“大小寫”混排的方式,如AddChild,而Unix應(yīng)用程序的標(biāo)識符通常采用“小寫加下劃線”的方式,如add_child,別把這兩類風(fēng)格混在一起使用;3.2.2 Windows變量命名規(guī)則 【

20、規(guī)則3.2.2-1】變量的命名規(guī)則要求采用“匈牙利法則”,即開頭字母用變量的類型,其余部分用變量的英文意思或其英文意思的縮寫,盡量避免采用中文拼音,要求單詞的第一個字母大寫;即:變量名變量類型變量英文意思(或縮寫)變量類型請參見附表1變量類型表; 【規(guī)則3.2.2-2】類名和函數(shù)名用大寫字母開頭的單詞組合而成;對struct、union、class變量的命名要求定義的類型用大寫,結(jié)構(gòu)采用S開頭,聯(lián)合體采用U開頭,類采用C開頭;例如:struct SPointintm_nX;intm_nY;union URecordLenBYTEm_byRecordNum;BYTEm_byRecordLen;c

21、lass CNode/類成員變量或成員函數(shù); 【規(guī)則3.2.2-3】指針變量命名的基本原則為:一重指針變量的基本原則為:變量名 “p”變量類型前綴命名對多重指針變量的基本原則為:二重指針:變量名“pp”變量類型前綴命名三重指針:變量名“ppp”變量類型前綴命名.例如一個short*型的變量應(yīng)該表示為pnStart; 【規(guī)則3.2.2-4】全局變量用g_開頭;例如一個全局的長型變量定義為g_l,即:變量名g_變量類型變量的英文意思(或縮寫); 【規(guī)則3.2.2-5】靜態(tài)變量采用s_開頭;例如一個靜態(tài)的指針變量定義為s_plPrevInst,即:變量名s_變量類型變量的英文意思(或縮寫); 【規(guī)則

22、3.2.2-6】類成員變量采用m_開頭;例如一個長型成員變量定義為m_lCount,即:變量名m_變量類型變量的英文意思(或縮寫); 【規(guī)則3.2.2-7】對const的變量要求在變量的命名規(guī)則前加入c_(若作為函數(shù)的輸入?yún)?shù),可以不加),即:變量名c_變量命名規(guī)則,例如:const char* c_sz; 【規(guī)則3.2.2-8】對枚舉類型(enum)中的變量,要求用枚舉變量或其縮寫做前綴,且用下劃線隔離變量名,所有枚舉類型都要用大寫,例如:enumEMDAYSEMDAYS_MONDAY;EMDAYS_TUESDAY;.; 【規(guī)則3.2.2-9】對常量(包括錯誤的編碼)命名,要求常量名用大寫,

23、常量名用英文意思表示其意思,用下劃線分割單詞,例如:#defineCM_7816_OK0x9000; 【規(guī)則3.2.2-10】為了防止某一軟件庫中的一些標(biāo)識符和其它軟件庫中的沖突,可以為各種標(biāo)識符加上能反映軟件性質(zhì)的前綴。例如三維圖形標(biāo)準(zhǔn)OpenGL的所有庫函數(shù)均以gl開頭,所有常量(或宏定義)均以GL開頭。3.3 程序風(fēng)格程序風(fēng)格雖然不會影響程序的功能,但會影響程序的可讀性,追求清晰、美觀,是程序風(fēng)格的重要構(gòu)成因素。3.3.1 空行空行起著分隔程序段落的作用??招械皿w(不過多也不過少)將使程序的布局更加清晰??招胁粫速M內(nèi)存,雖然打印含有空行的程序是會多消耗一些紙張,但是值得。 【規(guī)則3.3

24、.1-1】在每個類聲明之后、每個函數(shù)定義結(jié)束之后都要加空行。參見示例3.3.1(a); 【規(guī)則3.3.1-2】在一個函數(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 (condition) statement2;elsestatement3;/ blank linestat

25、ement4; 示例3.3.1(a) 函數(shù)之間的空行 示例3.3.1(b) 函數(shù)內(nèi)部的空行3.3.2 代碼行 【規(guī)則3.3.2-1】一行代碼只做一件事情,如只定義一個變量,或只寫一條語句,這樣的代碼容易閱讀,并且方便于寫注釋; 【規(guī)則3.3.2-2】if、for、while、do等語句自占一行,執(zhí)行語句不得緊跟其后,不論執(zhí)行語句有多少都要加,這樣可以防止書寫失誤; 【規(guī)則3.3.2-3】if、for、while、do等語句的“”要單獨占用一行; 【建議3.3.2-1】所有函數(shù)內(nèi)的變量都在函數(shù)開始處定義; 【建議3.3.2-2】盡可能在定義變量的同時初始化該變量(就近原則),如果變量的引用處和其

26、定義處相隔比較遠(yuǎn),變量的初始化很容易被忘記。如果引用了未被初始化的變量,可能會導(dǎo)致程序錯誤,本建議可以減少隱患。示例3.3.2(a)為風(fēng)格良好的代碼行,示例3.3.2(b)為風(fēng)格不良的代碼行。int nWidth;/ widthint nHeight;/ heightint nDepth;/ depthint nWidth,nHight,nDepth;/width,height,depthx = a + b;y = c + d;z = e + f;X a + b; y = c + d; z = e + f;if (nWidth nHight) DoSomething();if (nWidth

27、=”、“=”、“+”、“*”、“%”、“&”、“|”、“”這類操作符前后不加空格; 【建議3.3.3-1】對于表達(dá)式比較長的for語句和if語句,為了緊湊起見可以適當(dāng)?shù)厝サ粢恍┛崭?,如for (i=0; i10; i+)和if (a=b) & (c= 2000) / favorable styleif(year=2000) / ill styleif (a=b) & (c=b&c=d) / ill stylefor (i=0; i10; i+) / favorable stylefor(i=0;i10;i+) / ill stylefor (i = 0; I 10; i +) / favora

28、ble stylex = a b ? a : b; / favorable stylex=aFunction(); / Do not use b - Function();示例3.3.3 代碼行內(nèi)的空格3.3.4 對齊 【規(guī)則3.3.4-1】程序的分界符和應(yīng)獨占一行并且位于同一列,同時與引用它們的語句左對齊; 【規(guī)則3.3.4-2】 之內(nèi)的代碼塊在右邊數(shù)格處左對齊; 【規(guī)則3.3.4.3】代碼的的對齊采用TAB鍵而不采用空格鍵對齊,一般TAB鍵設(shè)置為向后空4個空格。示例3.3.4(a)為風(fēng)格良好的對齊,示例3.3.4(b)為風(fēng)格不良的對齊。void Function(int x) / prog

29、ram codevoid Function(int x) / program codeif (condition) / program codeelse / program codeif (condition) / program codeelse / program codefor (initialization; condition; update) / program codefor (initialization; condition; update) / program codeWhile (condition) / program codewhile (condition) / p

30、rogram code如果出現(xiàn)嵌套的,則使用縮進(jìn)對齊,如: 示例3.3.4(a) 風(fēng)格良好的對齊 示例3.3.4(b) 風(fēng)格不良的對齊3.3.5 長行拆分 【規(guī)則3.3.5-1】代碼行最大長度宜控制在70至80個字符以內(nèi); 【規(guī)則3.3.5-2】長表達(dá)式要在低優(yōu)先級操作符處拆分成新行,操作符放在新行之首(以便突出操作符),拆分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語句可讀。if (very_longer_variable1 = very_longer_variable12)& (very_longer_variable3 = very_longer_variable14)& (very_lon

31、ger_variable5 = very_longer_variable16) DoSomething();virtual CMatrix CMultiplyMatrix (CMatrix leftMatrix, CMatrix rightMatrix);for (very_longer_initialization; very_longer_condition; very_longer_update)DoSomething();示例3.3.5 長行的拆分3.3.6 修飾符的位置修飾符 * 和 應(yīng)該靠近數(shù)據(jù)類型還是該靠近變量名,是個有爭議的活題,若將修飾符 * 靠近數(shù)據(jù)類型,例如:int* x

32、; 從語義上講此寫法比較直觀,即x是int 類型的指針,上述寫法的弊端是容易引起誤解,例如:int* x, y; 此處y容易被誤解為指針變量。雖然將x和y分行定義可以避免誤解,但并不是人人都愿意這樣做。 【規(guī)則3.3.6-1】應(yīng)當(dāng)將修飾符 * 和 緊靠變量名;3.3.7 注釋C語言的注釋符為“/*/”。C+語言中,程序塊的注釋常采用“/*/”,行注釋一般采用“/”。注釋通常用于:(1)版本、版權(quán)聲明;(2)函數(shù)接口說明;(3)重要的代碼行或段落提示。雖然注釋有助于理解代碼,但注意不可過多地使用注釋。參見示例3.3.7。 【規(guī)則3.3.7-1】注釋是對代碼的“提示”,而不是文檔,程序中的注釋不可

33、喧賓奪主,注釋太多了會讓人眼花繚亂,注釋的花樣要少; 【規(guī)則3.3.7-2】如果代碼本來就是清楚的,則不必加注釋;例如 i+; / i 加 1,多余的注釋 【規(guī)則3.3.7-3】邊寫代碼邊注釋,修改代碼同時修改相應(yīng)的注釋,以保證注釋與代碼的一致性,不再有用的注釋要刪除; 【規(guī)則3.3.7-4】注釋應(yīng)當(dāng)準(zhǔn)確、易懂,防止注釋有二義性,錯誤的注釋不但無益反而有害; 【規(guī)則3.3.7-5】盡量避免在注釋中使用縮寫,特別是不常用縮寫; 【規(guī)則3.3.7-6】注釋的位置應(yīng)與被描述的代碼相鄰,可以放在代碼的上方或右方,不可放在下方; 【規(guī)則3.3.7-8】當(dāng)代碼比較長,特別是有多重嵌套時,應(yīng)當(dāng)在一些段落的結(jié)

34、束處加注釋,便于閱讀; 【建議3.3.7-9】對于多行代碼的注釋,盡量不采用“/*.*/”,而采用多行“/”注釋,這樣雖然麻煩,但是在做屏蔽調(diào)試時不用查找配對的“/*.*/”。/ Function capacity:/ Parameter declare:/ Return value :/void Function(float x, float y, float z) if () while () / end of while / end of if示例3.3.7 程序的注釋3.7.1 文件頭的注釋文件頭的注釋請參見3.1,文件頭的注釋是以兩行斜杠開始,以兩行斜杠結(jié)束(以區(qū)別于函數(shù)的注釋)。3

35、.7.2 函數(shù)頭的注釋一般說來每個函數(shù)都應(yīng)該做詳細(xì)的注釋,函數(shù)頭的注釋是以一行斜杠開始,以一行斜杠結(jié)束,注釋的內(nèi)容包括“功能”,“參數(shù)”,“返回值”,“設(shè)計思想”,“調(diào)用函數(shù)”,“日期”,“修改記錄”等幾個方面,函數(shù)頭的注釋格式如下:/ Function capacity :Describe the function capacity/ Parameter declare :/ parameter 1: Describe the function of parameter ( input/output parameter )/ parameter 2: Describe the functio

36、n of parameter ( input/output parameter )/./ Return value : Describe the possible return value/ Designed idea : Describe designed idea about the function/ Author :/ Creation date : Creation date(YY-MM-DD)/ Transferred function:List the sub-function in the function/ Modification record:/ (一)Mender 1:

37、Modified date:modified content/3.4 函數(shù)設(shè)計函數(shù)是C+/C程序的基本功能單元,其重要性不言而喻。函數(shù)設(shè)計的細(xì)微缺點很容易導(dǎo)致該函數(shù)被錯用,所以光使函數(shù)的功能正確是不夠的。本章重點論述函數(shù)的接口設(shè)計和內(nèi)部實現(xiàn)的一些規(guī)則。函數(shù)接口的兩個要素是參數(shù)和返回值。C語言中,函數(shù)的參數(shù)和返回值的傳遞方式有兩種:值傳遞(pass by value)和指針傳遞(pass by pointer)。C+ 語言中多了引用傳遞(pass by reference)。由于引用傳遞的性質(zhì)象指針傳遞,而使用方式卻象值傳遞,初學(xué)者常常迷惑不解,容易引起混亂,請先閱讀3.4.6節(jié)“引用與指針的比

38、較”。3.4.1 參數(shù)的規(guī)則 【規(guī)則3.4.1-1】參數(shù)的書寫要完整,不要貪圖省事只寫參數(shù)的類型而省略參數(shù)名字,如果函數(shù)沒有參數(shù),則用void填充;例如:void SetValue(int nWidth, int 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,它有兩個參數(shù),如果把參數(shù)名字起為str1和str2,例如:void StringCopy(c

39、har *str1, char *str2);那么我們很難搞清楚究竟是把str1拷貝到str2中,還是剛好倒過來,可以把參數(shù)名字起得更有意義,如叫strSource和strDestination。這樣從名字上就可以看出應(yīng)該把strSource拷貝到strDestination。還有一個問題,這兩個參數(shù)那一個該在前那一個該在后?參數(shù)的順序要遵循程序員的習(xí)慣。一般地,應(yīng)將目的參數(shù)放在前面,源參數(shù)放在后面。如果將函數(shù)聲明為:void StringCopy(char *strSource, char *strDestination);別人在使用時可能會不假思索地寫成如下形式:char str20;St

40、ringCopy(str, “Hello World”);/ 參數(shù)順序顛倒 【規(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ù)以值傳遞的方式傳遞對象,則宜改用“const &”方式來傳遞,這樣可以省去臨時對象的構(gòu)造和析構(gòu)過程,從而提高效率; 【建議3.4.1-1】避免函數(shù)有太多的參數(shù),參數(shù)個數(shù)盡量控制在5個以內(nèi)。如果參數(shù)太多,在使用時容易將參數(shù)類型或順序搞錯; 【建議3.4

41、.1-2】盡量不要使用類型和數(shù)目不確定的參數(shù);C標(biāo)準(zhǔn)庫函數(shù)printf是采用不確定參數(shù)的典型代表,其原型為:int printf(const chat *format, argument);這種風(fēng)格的函數(shù)在編譯時喪失了嚴(yán)格的類型安全檢查。3.4.2 返回值的規(guī)則 【規(guī)則3.4.2-1】不要省略返回值的類型;C語言中,凡不加類型說明的函數(shù),一律自動按整型處理,這樣做不會有什么好處,卻容易被誤解為void類型;C+語言有很嚴(yán)格的類型安全檢查,不允許上述情況發(fā)生。由于C+程序可以調(diào)用C函數(shù),為了避免混亂,規(guī)定任何C+/ C函數(shù)都必須有類型。如果函數(shù)沒有返回值,那么應(yīng)聲明為void類型 【規(guī)則3.4.

42、2-2】函數(shù)名字與返回值類型在語義上不可沖突;違反這條規(guī)則的典型代表是C標(biāo)準(zhǔn)庫函數(shù)getchar。例如:char c;c = getchar();if (c = EOF)按照getchar名字的意思,將變量c聲明為char類型是很自然的事情。但不幸的是getchar的確不是char類型,而是int類型,其原型如下:int getchar(void);由于c是char類型,取值范圍是-128,127,如果宏EOF的值在char的取值范圍之外,那么if語句將總是失敗,這種“危險”人們一般哪里料得到!導(dǎo)致本例錯誤的責(zé)任并不在用戶,是函數(shù)getchar誤導(dǎo)了使用者 【規(guī)則3.4.2-3】不要將正常值和

43、錯誤標(biāo)志混在一起返回。正常值用輸出參數(shù)獲得,而錯誤標(biāo)志用return語句返回; 【建議3.4.2-1】有時候函數(shù)原本不需要返回值,但為了增加靈活性如支持鏈?zhǔn)奖磉_(dá),可以附加返回值;例如字符串拷貝函數(shù)strcpy的原型:char *strcpy(char *strDest,const char *strSrc);strcpy函數(shù)將strSrc拷貝至輸出參數(shù)strDest中,同時函數(shù)的返回值又是strDest。這樣做并非多此一舉,可以獲得如下靈活性:char str20;int nLength = strlen( strcpy(str, “Hello World”) ); 【建議3.4.2-2】如果

44、函數(shù)的返回值是一個對象,有些場合用“引用傳遞”替換“值傳遞”可以提高效率。而有些場合只能用“值傳遞”而不能用“引用傳遞”,否則會出錯;對于建議3.4.2-2,如果函數(shù)的返回值是一個對象,有些場合用“引用傳遞”替換“值傳遞”可以提高效率,而有些場合只能用“值傳遞”而不能用“引用傳遞”,否則會出錯,例如:class String/ 賦值函數(shù)String& operate=(const String &other);/ 相加函數(shù),如果沒有friend修飾則只許有一個右側(cè)參數(shù)friendString operate+( const String &s1, const String &s2); priv

45、ate:char *m_data; ;String的賦值函數(shù)operate = 的實現(xiàn)如下:String & String:operate=(const String &other)if (this = &other)return *this;delete m_data;m_data = new charstrlen(other.data)+1;strcpy(m_data, other.data);return *this;/ 返回的是 *this的引用,無需拷貝過程對于賦值函數(shù),應(yīng)當(dāng)用“引用傳遞”的方式返回String對象。如果用“值傳遞”的方式,雖然功能仍然正確,但由于return語句要把 *this拷貝到保存返回值的外部存儲單元之中,增加了不必要的開銷,降低了賦值函數(shù)的效率。例如:String a,b,c;a = b; / 如果用“值傳遞”,將產(chǎn)生一次 *this 拷貝a = b = c; / 如果用“值傳遞”,將產(chǎn)生兩次 *this 拷貝Str

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論