下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、實用標準文案軟 件 開 發(fā) 流 程 規(guī) 范V1.0德聯(lián)軟件有限責任公司編制人:侯秀美審核人: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 程序風格163.3.1 空行17
2、3.3.2 代碼行183.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)軟件有限責任
3、公司計算機軟件開發(fā)規(guī)范文檔。本規(guī)范的目的是使公司軟件開發(fā)項目階段清晰、要求明確、任務(wù)具體、編寫的代碼規(guī)范,使之規(guī)范化、系統(tǒng)化和工程化,向公司內(nèi)從事軟件開發(fā)的工程師和管理人員提出一系列規(guī)范和要求,從而有利于開發(fā)過程的控制和管理,提高所開發(fā)軟件系統(tǒng)的質(zhì)量,縮短開發(fā)時間,減少開發(fā)和維護費用,以保證項目高質(zhì)量、順利進行。本規(guī)范包含:開發(fā)流程規(guī)范和開發(fā)代碼規(guī)范等,開發(fā)流程規(guī)范需要技術(shù)開發(fā)人員編寫相關(guān)內(nèi)容,希望每個技術(shù)人員形成習慣, 如有新的內(nèi)容更新會及時通知大家,如有好的規(guī)范要求也可通知編制人員及時更新。本規(guī)范為煙臺開發(fā)區(qū)德聯(lián)軟件有限責任公司內(nèi)部材料,嚴禁其他商業(yè)應(yīng)用。:、開發(fā)流程規(guī)范接受開發(fā)任務(wù),詳細
4、閱讀軟件技術(shù)規(guī)范或技術(shù)文檔,如對技術(shù)文檔有疑義或者不清楚的地方及時與項目總工或用戶溝通,根據(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)該包括以下流程。項目啟動由中中+用戶需求文檔一項目前期系統(tǒng)結(jié)構(gòu)建立rw , 9 ! n a ! k n n "" B "" B &qu
5、ot; n" B需要變更功能模塊設(shè)計* M W M * 4* * 4 - Ji * B * *». 4 _* * 工! N-4 _* W *.*- 4 J 0編碼實現(xiàn),系統(tǒng)實現(xiàn)是否需要變更!十無需變更1技術(shù)調(diào)試未通過系統(tǒng)調(diào)試測試集成調(diào)試未通過通過試用1上線驗收項目后期結(jié)束2.2 系統(tǒng)架構(gòu)(系統(tǒng)組成)確定系統(tǒng)整體體系架構(gòu), 各層次之間的數(shù)據(jù)流的連接, 確定軟件服務(wù)器的硬件配置及用 戶硬件資源配置, 確定與用戶軟件平臺的統(tǒng)一協(xié)調(diào)。 開發(fā)人員在繪制架構(gòu)圖時給出基本 框架,能反映出基本意義即可,可以直接用文字代替例子中的圖片。味含應(yīng)用層四分法哲;負荷.量、電流質(zhì)蕾fif寸費善理I指
6、建監(jiān)測產(chǎn)配翼施測 低壓集抄/i呼入”.采晶盜5570S酒國荷管理業(yè)務(wù)熟據(jù) 給含數(shù)據(jù)立器處理喀_ZZ±XZK觸播交地居圖1系統(tǒng)邏輯架構(gòu)圖舉例調(diào)度模擬屏一 1, ahM I數(shù)據(jù)服務(wù)器保護工作站主前置機備前置機維護工作站電能計量工作前置通訊柜圖2物理架構(gòu)圖舉例2.3 系統(tǒng)功能模塊設(shè)計給出系統(tǒng)的主要功能模塊,每個模塊所包含的功能。北校區(qū)書循管理基統(tǒng)添加境塊管理®央(_>用戶像改用戶查詢曾惠員登錄用戶登錄書 »WWW圖書歸5E圖書管理系統(tǒng)模塊規(guī)劃圖舉例2.4 系統(tǒng)功能開發(fā)流程圖給出系統(tǒng)主要功能的業(yè)務(wù)流程圖。停止電池充源電圖4系統(tǒng)功能業(yè)務(wù)流程圖舉例模糊控制算法鍵盤掃描液
7、晶顯示2.5 開發(fā)修改記錄1.開發(fā)代碼做好備份(可以在完成一個重大功能之后,或者按時間周期性進行備份) 以免由于不可抗力導(dǎo)致代碼不可修復(fù)。2.在每次重大修改之后要做好記錄(改動的具體細節(jié)),修改前的版本要及時備份,可以方面隨時還原系統(tǒng)。修改日期修改內(nèi)容是否備份備注:、開發(fā)代碼規(guī)范在研究項目團隊協(xié)作開發(fā)的情況下(這里的團隊協(xié)作也適合于應(yīng)用項目的開發(fā)),編程時應(yīng)該強調(diào)的一個重要方面是程序的易讀性,在保證軟件速度等性能指標能滿足用戶需求的情況下,能讓其他程序員容易讀懂你所編寫的程序。若研究項目小組的所有開發(fā)人員都遵循統(tǒng)一的、鮮明的一套編程風格,可以讓協(xié)作者、后繼者和自己一目了然,在很短的時間內(nèi)看清楚
8、程序結(jié)構(gòu),理解設(shè)計的思路,大大提高代碼的可讀性、可重用性、程序健壯性、可移植 性、可維護性。制定本編程規(guī)范的目的是為了提高軟件開發(fā)效率及所開發(fā)軟件的可維護性,提高軟件的質(zhì)量。本規(guī)范由程序風格、命名規(guī)范、注釋規(guī)范、程序健壯性、可移植性、錯誤處理以及軟 件的模塊化規(guī)范等部分組成。此規(guī)范以C/C+程序設(shè)計討論。3.1 文件結(jié)構(gòu)每個C+/C程序通常分為兩個文件。一個文件用于保存程序的聲明(declaration),稱為頭文件。另一個文件用于保存程序的實現(xiàn)( implementation ),稱為定義(definition )文件。C+/C程序的頭文件以“ .h”為后綴,C程序的定義文件以“ .c”為后
9、綴,C+程序的定 義文件通常以“ .cpp”為后綴(也有一些系統(tǒng)以“.cc”或“ .cxx”為后綴)。3.1.1 文件信息聲明文件信息聲明位于頭文件和定義文件的開頭(參見示例 3-1),主要內(nèi)容有:(1) 版權(quán)信息;(2) 文件名稱,項目代碼,摘要,參考文獻;(3) 當前版本號,作者/修改者,完成日期;(4) 版本歷史信息;(5) 主要函數(shù)描述。/ Copyright (c) 2015, DeLianSoftCompany YanTai/ All rights reserved./ Filename:filename.h/ Project Code:The project code about
10、 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 version1.0/ Original Author : the name of original author(mender)/ Accomplished date : September 10, 2003/ Main functions/Funct
11、ion 1 Return codeFunction name(Parameter Explain)/Function 2 Return codeFunction name(Parameter Explain)/Function n Return codeFunction name(Parameter Explain)/示例3-1文件信息聲明 【規(guī)則3.1-1】文件信息聲明以兩行斜杠開始,以兩行斜杠結(jié)束,每一行都以兩個斜杠開始; 【規(guī)則3.1-2】文件信息聲明包含五個部分,各部分之間以一空行間隔;【規(guī)貝U 3.1-3】在主要函數(shù)部分描述了文件所包含的主要函數(shù)的聲明信息,如果是 頭文件,這一部分是
12、可以省略的。3.1.2頭文件的結(jié)構(gòu)頭文件由三部分內(nèi)容組成:(1)頭文件開頭處的文件信息聲明(參見示例3-1);(2)預(yù)處理塊;(3)函數(shù)和類結(jié)構(gòu)聲明等。假設(shè)頭文件名稱為filesystem.h ,頭文件的結(jié)構(gòu)參見示例3-2。 【規(guī)則3.2-1 為了防止頭文件被重復(fù)引用,應(yīng)當用 ifndef/define/endif結(jié)構(gòu)產(chǎn)生預(yù)處理塊;“#ifndef”或者“#define”后以TAB鍵代替SPAC遜做空格; 如果頭文件名稱是由多個單詞組成,則各單詞間以下劃線 “_”連接,例如有頭文件名稱為"filesystem.h ",則定義如下:"#ifndef _FILE_SY
13、STEM_Hj 【規(guī)則3.2-2 用#include< filename.h>格式來引用標準庫的頭文件(編譯器將從標準庫目錄開始搜索); 【規(guī)則3.2-31用#include "filename.h格式來引用非標準庫的頭文件(編譯器將從用戶的工作目錄開始搜索); 【建議3.2-1】頭文件中只存放“聲明”而不存放“定義”; 【建議3.2-1】頭文件中應(yīng)包含所有定義文件所定義的函數(shù)聲明,如果一個頭文件對應(yīng)多個定義文件,則不同定義文件內(nèi)實現(xiàn)的函數(shù)要分開聲明,并 作注釋以解釋所聲明的函數(shù)從屬于那一個定義文件; 【建議3.2-3宏定義和函數(shù)聲明分離,在兩個頭文件中定義,如果沒有類成
14、員函數(shù),可以將類和結(jié)構(gòu)的定義與函數(shù)聲明分離,也就是說一個頭文件 專用于宏定義,一個頭文件專用于類和結(jié)構(gòu)的定義,一個頭文件專 用于函數(shù)聲明; 【建議3.2-41在C+語法中,類的成員函數(shù)可以在聲明的同時被定義,并且自動成為內(nèi)聯(lián)函數(shù)。這雖然會帶來書寫上的方便,但卻造成了風格不一致,弊大于利。建議將成員函數(shù)的定義與聲明分開,不論該函數(shù)體 有多么小。頭文件的結(jié)構(gòu)如下:文件信息聲明見示例3-1,此處省略。#ifndef _FILE_SYSTEM_H_/avoid referencing the file filesystem.h repeat#define _FILE_SYSTEM_H_#include
15、 <math.h> /reference standard head file#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è)定義文件的名稱為filesyst
16、em.c,定義文件的結(jié)構(gòu)參見示例3-3。文件信息聲明見示例3-1,此處省略。#include “ filesystem.h /reference a head file /global function realizationvoid Function1()/class member function realizationvoid CBox:Draw()示例3-3 C+/C定義文件的結(jié)構(gòu)3.1.4 頭文件的作用早期的編程語言如Basis Fortran沒有頭文件的概念,C+/C語言的初學(xué)者雖然會用使用頭文件,但常常不明其理。這里對頭文件的作用略作解釋:(1)通過頭文件來調(diào)用庫功能。在很多場合
17、,源代碼不便(或不準)向用戶公布,只 要向用戶提供頭文件和二進制的庫即可。用戶只需要按照頭文件中的接口聲明來調(diào)用庫功 能,而不必關(guān)心接口怎么實現(xiàn)的。編譯器會從庫中提取相應(yīng)的代碼;(2)頭文件能加強類型安全檢查。如果某個接口被實現(xiàn)或被使用時,其方式與頭文件中的聲明不一致,編譯器就會指出錯誤,這一簡單的規(guī)則能大大減輕程序員調(diào)試、改錯的負擔。3.1.5目錄結(jié)構(gòu)如果一個軟件的頭文件數(shù)目比較多(如超過十個),通常應(yīng)將頭文件和定義文件分別保存于不同的目錄,以便于維護。例如可將頭文件保存于 include目錄,將定義文件保存于 source目錄(可以是多級目錄)。 如果某些頭文件是私有的,它不會被用戶的程序
18、直接引用,則沒有必要公開其“聲明”。為了加強信息隱藏,這些私有的頭文件可以和定義文件存放于同一個目錄。3.2命名規(guī)則比較著名的命名規(guī)則當推“匈牙利”命名法,該命名規(guī)則的主要思想是“在變量和函數(shù)名中加入前綴以增進人們對程序的理解”。例如所有的字符變量均以 ch為前綴,若是指針變量則追加前綴p。如果一個變量由ppch開頭,則表明它是指向字符指針的指針。“匈牙利”法最大的缺點是煩瑣,例如int i, j, k;float x, y, z;倘若采用“匈牙利”命名規(guī)則,則應(yīng)當寫成int iI, iJ, ik; /前綴i表示int類型float fX, fY,億;前綴f表示float類型如此煩瑣的程序會讓
19、絕大多數(shù)程序員無法忍受??偟恼f來,沒有一種命名規(guī)則可以讓所有的程序員贊同,且命名規(guī)則對軟件產(chǎn)品而言并 不是“成敗悠關(guān)”的事,而且在不同的平臺和不同的環(huán)境下編寫的程序所應(yīng)遵循的規(guī)則也不 盡相同,所以我們只是追求制定一種令大多數(shù)項目成員滿意的命名規(guī)則,并在項目中貫徹實施。3.2.1 共性原則本節(jié)論述的共性規(guī)則是被大多數(shù)程序員采納的,我們應(yīng)當在遵循這些共性規(guī)則的前提 下,再擴充特定的規(guī)則,如 3.2.2節(jié)【規(guī)則3.2.1-1】 標識符應(yīng)當直觀且可以拼讀,可望文知意,不必進行“解碼”【規(guī)則3.2.1-2】標識符的長度應(yīng)當符合" min-length && max-inform
20、ation "原則;【規(guī)則3.2.1-3】命名規(guī)則盡量與所采用的操作系統(tǒng)或開發(fā)工具的風格保持一致;【規(guī)則3.2.1-41程序中不要出現(xiàn)僅靠大小寫區(qū)分的相似的標識符?!疽?guī)則3.2.1-5】程序中不要出現(xiàn)標識符完全相同的局部變量和全局變量,盡管兩者 的作用域不同而不會發(fā)生語法錯誤,但會使人誤解;【規(guī)則3.2.1-6】變量的名字應(yīng)當使用“名詞”或者“形容詞+名詞”【規(guī)則3.2.1-7】全局函數(shù)的名字應(yīng)當使用“動詞”或者“動詞+名詞”(動賓詞組);【規(guī)則3.2.1-8】用正確的反義詞組命名具有互斥意義的變量或相反動作的函數(shù)等;【建議3.2.1-9】盡量避免名字中出現(xiàn)數(shù)字編號,如Value1,
21、Value2等,除非邏輯上的確需要編號;3.2.1 標識符最好采用英文單詞或其組合,便于記憶和閱讀,切忌使用漢語拼音來命名,程序中的英文單詞一般不要太復(fù)雜,用詞應(yīng)當準確,例如不要把Currentvalue寫成NowValue;3.2.2 標示符的長度應(yīng)當以最小的長度實現(xiàn)最多信息,一般來說,長名字能更好地表達含義,但并非長的變量名就一定要比短的變量名要好,此外單字符的名字也是有用的,常見的如ij,k,m,n,x,y,z等,它們通常可用作函數(shù)內(nèi)的局部變量;3.2.3 不同的操作系統(tǒng)的程序設(shè)計風格是不一樣的,例如Windows應(yīng)用程序的標識符通常采用“大小寫”混排的方式,如 AddChild,而Un
22、ix應(yīng)用程序的標識符通常采用“小寫加下劃線”的方式,如add_child,別把這兩類風格混在一起使用;3.2.2 Windows變量命名規(guī)則 【規(guī)則3.2.2-1變量的命名規(guī)則要求采用“匈牙利法則”,即開頭字母用變量的類型,其余部分用變量的英文意思或其英文意思的縮寫,盡量避免采用中 文拼音,要求單詞的第一個字母大寫;即:變量名=變量類型+變量英文意思(或縮寫)變量類型請參見附表 1 -變量類型表; 【規(guī)則3.2.2-21類名和函數(shù)名用大寫字母開頭的單詞組合而成;對 struct、union、class變量的命名要求定義的類型用大寫,結(jié)構(gòu)采用S開頭,聯(lián)合體采用U開頭,類采用 C開頭;例如:str
23、uct SPointint m_nX;int m_nY;;union URecordLenBYTEn_byRecordNum;BYTEm _byRecordLen;class CNode類成員變量或成員函數(shù); 【規(guī)則3.2.2-3指針變量命名的基本原則為:一重指針變量的基本原則為:變量名="p" +變量類型前綴+命名對多重指針變量的基本原則為:二重指針:變量名=" pp” +變量類型前綴+命名三重指針:變量名=" ppp” +變量類型前綴+命名g_lFileNum ,例如一個short*型的變量應(yīng)該表示為pnStart; 【規(guī)則3.2.2-4全局變量用g
24、_開頭;例如一個全局的長型變量定義為即:變量名=g_+變量類型+變量的英文意思 (或縮寫); 【規(guī)則3.2.2-5靜態(tài)變量采用s_開頭;例如一個靜態(tài)的指針變量定義為s_plPrevInst,即:變量名=s_+變量類型+變量的英文意思(或縮寫); 【規(guī)則322-6】類成員變量采用 m_開頭;例如一個長型成員變量定義為 m_lCount,即:變量名=m_ +變量類型+變量的英文意思(或縮寫); 【規(guī)則3.2.2-71對const的變量要求在變量的命名規(guī)則前加入c_(若作為函數(shù)的輸入?yún)?shù),可以不加),即:變量名=c_+變量命名規(guī)則,例如:const char* c_szFileName ; 【規(guī)則3
25、22-8】對枚舉類型(enum)中的變量,要求用枚舉變量或其縮寫做前綴,且用下劃線隔離變量名,所有枚舉類型都要用大寫,例如:enum EMDAYSEMDAYS_MONDAY;EMDAYS_TUESDAY;; 【規(guī)則3.2.2-91 對常量(包括錯誤的編碼)命名,要求常量名用大寫,常量名用英文意 思表示其意思,用下劃線分割單詞,例如:#define CM_7816_OK 0x9000; 【規(guī)則3.2.2-10】為了防止某一軟件庫中的一些標識符和其它軟件庫中的沖突,可以 為各種標識符加上能反映軟件性質(zhì)的前綴。例如三維圖形標準OpenGL的所有庫函數(shù)均以 gl開頭,所有常量(或宏定義)均以 GL 開
26、頭。3.3程序風格程序風格雖然不會影響程序的功能,但會影響程序的可讀性, 追求清晰、美觀,是程序風格的重要構(gòu)成因素。3.3.1 空行空行起著分隔程序段落的作用。空行得體(不過多也不過少)將使程序的布局更加清晰。 空行不會浪費內(nèi)存,雖然打印含有空行的程序是會多消耗一些紙張,但是值得。 【規(guī)則3.3.1-11在每個類聲明之后、每個函數(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 Fun
27、ction2()/ blank linevoid Function3()/ blank linewhile (condition)statementl;/ blank lineif (condition)statement2;elsestatement3;/ blank line statement4;3.3.2代碼行 【規(guī)則3.3.2-11一行代碼只做一件事情,如只定義一個變量,或只寫一條語句 的代碼容易閱讀,并且方便于寫注釋;,這樣 【規(guī)則3.3.2-21if、for、while、do等語句自占一行,執(zhí)行語句不得緊跟其后,不論 執(zhí)行語句有多少都要加,這樣可以防止書寫失誤;【規(guī)則3.3.2-
28、3】if、for、while、do等語句的“"要單獨占用一行;【建議3.3.2-1】所有函數(shù)內(nèi)的變量都在函數(shù)開始處定義;【建議3.3.2-21盡可能在定義變量的同時初始化該變量(就近原則),如果變量的引用處和其定義處相隔比較遠,變量的初始化很容易被忘記。如果引用 了未被初始化的變量,可能會導(dǎo)致程序錯誤,本建議可以減少隱患。示例3.3.2(a)為風格良好的代碼行,示例3.3.2(b)為風格不良的代碼行。int nWidth; / widthint nHeight;/ heightint nDepth; / depthint nWidth,nHight,nDepth;/width,hei
29、ght,depthx = a + b;X= a + b; y = c + d; z = e + f;y = c + d;z = e + f;if (nWidth < nHight)if (nWidth < nHight) DoSomething();DoSomething();for (initialization; condition; update)DoSomething();/ blank lineOther();for (initialization; condition; update)DoSomething();Other();示例3.3.2(a)風格良好的代碼行示例3
30、.3.2(b)風格不良的代碼行【規(guī)則3.3.3-113.3.3代碼行內(nèi)的空格關(guān)鍵字之后要留空格,象 const、virtual、inline、case等關(guān)鍵字之后至少要留一個空格,否則無法辨析關(guān)鍵字,象 if、for、while等關(guān)鍵字之后應(yīng)留一個空格再跟左括號【規(guī)則3.3.3-21函數(shù)名之后不要留空格,緊跟左括號(',以與關(guān)鍵字區(qū)別;【規(guī)則3.3.3-31'('向后緊跟,)';'向前緊跟,緊跟處不留空格;【規(guī)則3.3.3-41'之后要留空格,如 符號,其后要留空格,如Function(x, y, z),如果;不是一行的結(jié)束for (initia
31、lization; condition; update);【規(guī)則3.3.3-51賦值操作符、比較操作符、算術(shù)操作符、邏輯操作符、位域操作符,【規(guī)則3.3.3-61如“ ="、"+=”">="、“<="、"+”、“*”、“”、“&&”、“| "、“<<”“人”等二元操作符的前后應(yīng)當加空格;一元操作符如“!”、“”、“+”、“-"、“&”(地址運算符)等前后不 加空格;【規(guī)則3.3.3-71象“口”、".”、“->”這類操作符前后不加空格;【建議3.3.3
32、-11對于表達式比較長的for語句和if語句,為了緊湊起見可以適當?shù)厝サ粢恍┛崭?,?for (i=0; i<10; i+)和 if (a<=b) && (c<=d)void Func1(int x, int y, int z);/ favorable stylevoid Funci (int x,int y,int z);/ ill styleif (year >= 2000)/ favorable styleif(year>=2000)/ ill styleif (a>=b) && (c<=d)/ favorable
33、 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;/ favorable stylex=a<b?a:b;/ ill styleint *x = &y;/ favorable styleint * x = & y;/ ill stylearray5 = 0;/ Do no
34、t use array 5 = 0;a.Function();/ Do not use a . Function。;b->Function();/ Do not use b -> Function。;示例3.3.3代碼行內(nèi)的空格 【規(guī)則3.3.4-113.3.4對齊程序的分界符和''應(yīng)獨占一行并且位于同一列,同時與引用它們的語句左對齊; 【規(guī)則3.3.4-2之內(nèi)的代碼塊在'右邊數(shù)格處左對齊; 【規(guī)則】代碼的的對齊采用 TAB鍵而不采用空格鍵對齊,一般TAB鍵設(shè)置為向后空4個空格。示例3.3.4(a)為風格良好的對齊,示例3.3.4(b)為風格不
35、良的對齊。void Function(int x)void Function(int x) / program code / program codeif (condition)if (condition) / program code / program codeelse else / program code / program codefor (initialization; condition; update)for (initialization; condition; update) / program code / program codeWhile (condition)whi
36、le (condition) / program code / program code如果出現(xiàn)嵌套的,則使用縮進對齊,如:)示例3.3.4(a)風格良好的對齊示例3.3.4(b)風格不良的對齊3.3.5長行拆分 【規(guī)則3.3.5-1】代碼行最大長度宜控制在70至80個字符以內(nèi); 【規(guī)則3.3.5-2長表達式要在低優(yōu)先級操作符處拆分成新行,操作符放在新行之首(以便突出操作符),拆分出的新行要進行適當?shù)目s進,使排版整齊,語句可讀。if (very_longer_variable1 >= very_longer_variable12)&& (very_longer_varia
37、ble3 <= very_longer_variable14)&& (very_longer_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修飾符的位置修飾符*和&
38、amp;應(yīng)該靠近數(shù)據(jù)類型還是該靠近變量名,是個有爭議的活題,若將修飾 符*靠近數(shù)據(jù)類型,例如:int* x;從語義上講此寫法比較直觀,即 x是int類型的指針, 上述寫法的弊端是容易引起誤解,例如:int* x, y;此處y容易被誤解為指針變量。雖然將x和y分行定義可以避免誤解,但并不是人人都愿意這樣做。 【規(guī)則3.3.6-1】應(yīng)當將修飾符 *和&緊靠變量名;3.3.7注釋c語言的注釋符為“ /* 1。C+詡言中,程序塊的注釋常采用“/*/,行注釋一般采用“ o注釋通常用于:(1)版本、版權(quán)聲明;(2)函數(shù)接口說明;(3)重要的代碼行或段落提示。雖然注釋有助于理解代碼,但注意不可過多地
39、使用注釋。參見示例3.3.7。【規(guī)則3.3.7-11注釋是對代碼的“提示”,而不是文檔,程序中的注釋不可喧賓奪主,注釋太多了會讓人眼花繚亂,注釋的花樣要少;【規(guī)則3.3.7-21如果代碼本來就是清楚的,則不必加注釋;例如i+;/ i力口 1,多余的注釋 【規(guī)則3.3.7-3】邊寫代碼邊注釋,修改代碼同時修改相應(yīng)的注釋,以保證注釋與代碼的一致性,不再有用的注釋要刪除;【規(guī)則3.3.7-41注釋應(yīng)當準確、易懂,防止注釋有二義性,錯誤的注釋不但無益反 而有害;【規(guī)則3.3.7-51盡量避免在注釋中使用縮寫,特別是不常用縮寫;【規(guī)則3.3.7-61注釋的位置應(yīng)與被描述的代碼相鄰,可以放在代碼的上方或右
40、方, 不可放在下方;【規(guī)則3.3.7-81當代碼比較長,特別是有多重嵌套時,應(yīng)當在一些段落的結(jié)束處加 注釋,便于閱讀;【建議3.3.7-91對于多行代碼的注釋,盡量不采用“/*.*/ ”,而采用多行“ /”注釋,這樣雖然麻煩,但是在做屏蔽調(diào)試時不用查找配對的"/*.*/ Function capacity :/ Parameter declare :/ Return value :/void Functionfloat x, float y, float z) if () while () / end of while / end of if示例3.3.7程序的注釋3.7.1 文件頭
41、的注釋文件頭的注釋請參見 3.1,文件頭的注釋是以兩行斜杠開始,以兩行斜杠結(jié)束(以區(qū)別于函數(shù)的注釋)。3.7.2 函數(shù)頭的注釋一般說來每個函數(shù)都應(yīng)該做詳細的注釋,函數(shù)頭的注釋是以一行斜杠開始,以一行斜杠結(jié)束,注釋的內(nèi)容包括“功能”,“參數(shù)”,“返回值”,“設(shè)計思想”,“調(diào)用函數(shù)”,“日期”, “修改記錄”等幾個方面,函數(shù)頭的注釋格式如下:Describe the function capacity/ Function capacity/parameter 1 :/parameter 2 :/ Parameter declareDescribe the function of parameter
42、 ( input/output parameter )Describe the function 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 func
43、tion/ Modification record :/()Mender 1 :Modified date : modified content/3.4函數(shù)設(shè)計函數(shù)是C+/C程序的基本功能單元,其重要性不言而喻。函數(shù)設(shè)計的細微缺點很容易導(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ì)象指針傳遞,而使用方式卻
44、象值傳遞,初學(xué)者常常迷惑 不解,容易引起混亂,請先閱讀3.4.6節(jié)“引用與指針的比較”。3.4.1 參數(shù)的規(guī)則 【規(guī)則3.4.1-11參數(shù)的書寫要完整,不要貪圖省事只寫參數(shù)的類型而省略參數(shù)名字,如果函數(shù)沒有參數(shù),則用 void填充;例如:void SetValue(int nWidth, int nHeight);/良好的風格void SetValue(int, int);/ 不良的風格float GetValue(void);/良好的風格float GetValue();/不良的風格 【規(guī)則3.4.1-2】參數(shù)命名要恰當,順序要合理;例如編寫字符串拷貝函數(shù)StringCopy,它有兩個參數(shù),
45、如果把參數(shù)名字起為str1和str2 ,例如:void StringCopy(char *str1, char *str2);那么我們很難搞清楚究竟是把stn拷貝到str2中,還是剛好倒過來,可以把參數(shù)名字起得更有意義,如叫strSource和strDestination。這樣從名字上就可以看出應(yīng)該把strSource拷貝到strDestination。還有一個問題,這兩個參數(shù)那一個該在前那一個該在后?參數(shù)的順序要 遵循程序員的習慣。一般地,應(yīng)將目的參數(shù)放在前面,源參數(shù)放在 后面。如果將函數(shù)聲明為:void StringCopy(char *strSource, char *strDestin
46、ation);別人在使用時可能會不假思索地寫成如下形式:char str20;const,以防止該StringCopy(str, " Hello World "力 / 參數(shù)順序顛倒 【規(guī)則3.4.1-3如果參數(shù)是指針,且僅作輸入用,則應(yīng)在類型前加指針在函數(shù)體內(nèi)被意外修改。例如:void StringCopy(char *strDestination , const char *strSource); 【規(guī)則3.4.1-41如果輸入?yún)?shù)以值傳遞的方式傳遞對象,則宜改用“ const &”方式來傳遞,這樣可以省去臨時對象的構(gòu)造和析構(gòu)過程,從而提高效率; 【建議3.4.1
47、-11避免函數(shù)有太多的參數(shù),參數(shù)個數(shù)盡量控制在5個以內(nèi)。如果參數(shù)太多,在使用時容易將參數(shù)類型或順序搞錯; 【建議3.4.1-2盡量不要使用類型和數(shù)目不確定的參數(shù);C標準庫函數(shù)printf是采用不確定參數(shù)的典型代表,其原型為:int printf(const chat *format, argument );這種風格的函數(shù)在編譯時喪失了嚴格的類型安全檢查。3.4.2 返回值的規(guī)則 【規(guī)則3.4.2-1不要省略返回值的類型;C語言中,凡不加類型說明的函數(shù),一律自動按整型處理,這樣做 不會有什么好處,卻容易被誤解為void類型;C+語言有很嚴格的類型安全檢查,不允許上述情況發(fā)生。由于 C+ 程序可以
48、調(diào)用 C函數(shù),為了避免混亂,規(guī)定任何C+/ C函數(shù)都必須有類型。如果函數(shù)沒有返回值,那么應(yīng)聲明為void類型 【規(guī)則3.4.2-2】函數(shù)名字與返回值類型在語義上不可沖突;違反這條規(guī)則的典型代表是C標準庫函數(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語句將總是失
49、敗,這種“危險”人們一般哪里料得到!導(dǎo)致本例錯誤的責任并不在用戶,是函數(shù)getchar誤導(dǎo)了使用者 【規(guī)則3.4.2-31不要將正常值和錯誤標志混在一起返回。正常值用輸出參數(shù)獲得,而錯誤標志用return語句返回; 【建議3.4.2-11有時候函數(shù)原本不需要返回值,但為了增加靈活性如支持鏈式表達,可以附加返回值;例如字符串拷貝函數(shù)strcpy的原型:char *strcpy(char *strDest , const char *strSrc);strcpy函數(shù)將strSrc拷貝至輸出參數(shù) strDest中,同時函數(shù)的返回值又 是strDest。這樣做并非多此一舉,可以獲得如下靈活性:char
50、 str20;int nLength = strlen( strcpy(str, " Hello World "); 【建議3.4.2-2如果函數(shù)的返回值是一個對象,有些場合用“引用傳遞”替換“值傳遞”可以提高效率。而有些場合只能用“值傳遞”而不能用“引 用傳遞”,否則會出錯;對于建議342-2,如果函數(shù)的返回值是一個對象,有些場合用“引用傳遞”替換“值 傳遞”可以提高效率,而有些場合只能用“值傳遞”而不能用“引用傳遞”,否則會出錯,例如:class String/賦值函數(shù)String& operate=(const String &other);/相加函數(shù)
51、,如果沒有 friend修飾則只許有一個右側(cè)參數(shù)friend String operate+( const String &s1, const String &s2);private: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)當用“引用傳遞”的方式返回String對象。如果用“值傳遞”的方式, 雖然功能仍然正確,但由于 return語句要把*this拷貝到保存返回值的外部存儲單元之中, 增加了不必要的開銷,降低了賦值函數(shù)的效率。例如:String a,b,c;a = b; /如果用“值傳遞”,將產(chǎn)生一次*this拷貝a = b = c; /如果用“值傳遞”,將產(chǎn)生兩次 *this拷貝String的相加函數(shù)operate +的實現(xiàn)如下:String operat
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 采油地質(zhì)工操作技能測試考核試卷含答案
- 船舶過閘及升船機調(diào)度員安全理論競賽考核試卷含答案
- 傘制作工安全知識模擬考核試卷含答案
- 金屬版印刷員安全生產(chǎn)能力測試考核試卷含答案
- 大班思維邏輯訓(xùn)練
- 路面維護合同范本
- 車輛協(xié)議取消合同
- 分包合同作廢協(xié)議
- 車輛解抵合同范本
- 合同取消退款協(xié)議
- 縣級醫(yī)院下轉(zhuǎn)一般鄉(xiāng)鎮(zhèn)衛(wèi)生院疾病病種參考目錄(僅供參考)
- 俄歇電子能譜課件
- 學(xué)習情境5:流量計的制作課件
- DBJ51-T 188-2022 預(yù)拌流態(tài)固化土工程應(yīng)用技術(shù)標準
- edgecam產(chǎn)品技術(shù)應(yīng)用培訓(xùn)教程
- 施工用電系統(tǒng)移交確認單
- 公園改造安全文明施工方案
- 正方形性質(zhì)和判定
- 企業(yè)標準化管理手冊(完整版)
- 初三物理電學(xué)基本計算復(fù)習教案
- 可拆卸式保溫套項目建議書范文
評論
0/150
提交評論