10 軟件設(shè)計(jì)規(guī)范_第1頁(yè)
10 軟件設(shè)計(jì)規(guī)范_第2頁(yè)
10 軟件設(shè)計(jì)規(guī)范_第3頁(yè)
10 軟件設(shè)計(jì)規(guī)范_第4頁(yè)
10 軟件設(shè)計(jì)規(guī)范_第5頁(yè)
已閱讀5頁(yè),還剩64頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

廣州九頂軟件股份有限公司工作文件文件編號(hào):JD-GZ-10-2016軟件設(shè)計(jì)規(guī)范版號(hào)/修改狀態(tài):A/0第頁(yè)共66頁(yè)工作文件文件名稱:軟件設(shè)計(jì)規(guī)范文件編號(hào):版號(hào):A編制:日期:審核:日期:批準(zhǔn):日期:受控狀態(tài):生效日期:分發(fā)號(hào):工作文件文件編號(hào):軟件設(shè)計(jì)規(guī)范版號(hào)/修改狀態(tài):A/0目的本規(guī)范是對(duì)項(xiàng)目軟件設(shè)計(jì)的一份規(guī)范性文件,對(duì)軟件設(shè)計(jì)過程中的活動(dòng)進(jìn)行總體規(guī)范,以有效保證軟件產(chǎn)品的質(zhì)量。范圍本規(guī)范適用于公司研制的全部軟件產(chǎn)品。設(shè)計(jì)流程軟件設(shè)計(jì)流程按照《軟件設(shè)計(jì)和開發(fā)控制程序》中規(guī)定執(zhí)行,軟件開發(fā)過程可包括以下活動(dòng):需求分析;軟件開發(fā);軟件測(cè)試;項(xiàng)目驗(yàn)收;客服支持。前期準(zhǔn)備軟件開發(fā)人員對(duì)系統(tǒng)開發(fā)前期進(jìn)行充分的用戶調(diào)研、需求分析和系統(tǒng)體系結(jié)構(gòu)的設(shè)計(jì)準(zhǔn)備工作。軟件開發(fā)人員以及業(yè)務(wù)需求人員共同組建項(xiàng)目組,一名或兩名項(xiàng)目經(jīng)理負(fù)責(zé)監(jiān)控項(xiàng)目的整體實(shí)施,共同參與系統(tǒng)的全面設(shè)計(jì)、開發(fā),并針對(duì)業(yè)務(wù)提出進(jìn)一步開發(fā)需求,開展軟件用戶化工作,制定二次開發(fā)方案,參與設(shè)計(jì)業(yè)務(wù)系統(tǒng)與其它軟件的接口。實(shí)施過程整個(gè)開發(fā)過程將經(jīng)歷獲取需求、需求分析、系統(tǒng)設(shè)計(jì)、編碼、測(cè)試等階段。獲取需求軟件在進(jìn)入正式開發(fā)之前,提供準(zhǔn)確的書面《需求規(guī)格說(shuō)明書》其中包括:對(duì)現(xiàn)有系統(tǒng)的分析。待開發(fā)系統(tǒng)的詳細(xì)需求。功能需求,使用范圍,業(yè)務(wù)流程,用戶界面,輸出要求,故障處理。網(wǎng)絡(luò)環(huán)境,硬件環(huán)境,軟件環(huán)境,與其他系統(tǒng)的關(guān)系,安全與保密。技術(shù)可行性分析,經(jīng)濟(jì)可行性分析,人員可行性分析,影響待開發(fā)系統(tǒng)的主要因素。軟件項(xiàng)目分為專用軟件和通用軟件兩大類。對(duì)于專用軟件,在進(jìn)入開發(fā)之前必須與用戶進(jìn)行比較具體的交流和討論,了解清楚用戶理想的產(chǎn)品究竟是什么樣子,這里最好就采用原型化的方法作出一個(gè)簡(jiǎn)單的框架給用戶看。對(duì)于通用軟件,在開發(fā)之前必須做一定的市場(chǎng)調(diào)查工作,一方面是從經(jīng)濟(jì)效益考慮,調(diào)查產(chǎn)品的潛在市場(chǎng)有多大,一方面是從技術(shù)的角度,了解清楚潛在用戶對(duì)軟件的各種技術(shù)上的要求,另一方面是確定軟件的定位,即我們軟件具體是為哪一些用戶群體服務(wù)的。然后對(duì)該群體用戶現(xiàn)有硬件配置,軟件配置,網(wǎng)絡(luò)使用情況,數(shù)據(jù)庫(kù)使用情況,計(jì)算機(jī)熟悉程度做一定的調(diào)研,根據(jù)調(diào)查的統(tǒng)計(jì)結(jié)果決定即將開發(fā)的軟件的一些技術(shù)指標(biāo)。需求分析開發(fā)人員構(gòu)思、確立系統(tǒng)目標(biāo)、劃分業(yè)務(wù)領(lǐng)域、現(xiàn)行業(yè)務(wù)分析、建立業(yè)務(wù)模型、信息需求分析、用戶視圖規(guī)范化、數(shù)據(jù)元素標(biāo)準(zhǔn)化與一致性控制等。在項(xiàng)目組和用戶充分交互、理解的基礎(chǔ)上,提出系統(tǒng)的技術(shù)構(gòu)架,對(duì)系統(tǒng)功能、性能等主要指標(biāo)作描述,對(duì)實(shí)現(xiàn)方法項(xiàng)目實(shí)施人員應(yīng)有一個(gè)比較清晰的輪廓及整體設(shè)計(jì)思路,對(duì)有疑問的地方及時(shí)與業(yè)務(wù)需求人員進(jìn)行溝通交流,最終達(dá)成共識(shí)。綜合對(duì)該用戶群體現(xiàn)有硬件配置,軟件配置,網(wǎng)絡(luò)使用情況,數(shù)據(jù)庫(kù)使用情況,計(jì)算機(jī)熟悉程度做一定的調(diào)研,根據(jù)調(diào)查的統(tǒng)計(jì)結(jié)果決定即將開發(fā)的一些軟件適用指標(biāo)。這個(gè)階段需要出三樣?xùn)|西,用戶視圖,數(shù)據(jù)詞典和用戶操作手冊(cè)。用戶視圖是該軟件用戶(包括終端用戶和管理用戶)所能看到的頁(yè)面樣式,這里面包含了很多操作方面的流程和條件。數(shù)據(jù)詞典是指明數(shù)據(jù)邏輯關(guān)系并加以整理,完成了數(shù)據(jù)詞典,數(shù)據(jù)庫(kù)的設(shè)計(jì)就完成了一半多。用戶操作手冊(cè)是指明了操作流程的說(shuō)明書。軟件開發(fā)系統(tǒng)結(jié)構(gòu)建立確定軟件服務(wù)器的硬件配置及用戶硬件資源配置。確定用戶軟件平臺(tái)的統(tǒng)一協(xié)調(diào)。軟件設(shè)計(jì)軟件設(shè)計(jì)階段的工作包括對(duì)模塊進(jìn)行必要的修改,同時(shí)可能需要對(duì)某些結(jié)構(gòu)做一些修改,確定界面定義、用戶服務(wù)層、業(yè)務(wù)邏輯層、數(shù)據(jù)庫(kù)服務(wù)層和具體數(shù)據(jù)庫(kù),確定軟件開發(fā)工具。這一階段還將完成更詳細(xì)的功能和業(yè)務(wù)需求調(diào)研,制作系統(tǒng)中最符合用戶需要的文檔。根據(jù)應(yīng)用系統(tǒng)對(duì)安全的要求,同步進(jìn)行安全保密設(shè)計(jì)。軟件編碼確定軟件的界面風(fēng)格、使用功能、編程語(yǔ)言、數(shù)據(jù)庫(kù)結(jié)構(gòu)和具體數(shù)據(jù)等工作,并開始進(jìn)入程序編寫階段。開發(fā)人員進(jìn)入設(shè)置和編碼工作之后,應(yīng)先確定編碼的風(fēng)格在開發(fā)過程中保持一致,工作過程中如發(fā)現(xiàn)前面分析或設(shè)計(jì)階段的某些錯(cuò)誤,應(yīng)返回到前面的階段進(jìn)行必要的修改,同時(shí)主要開發(fā)人員之間應(yīng)相互緊密配合。編碼語(yǔ)言除用戶特別要求外應(yīng)盡量使用常用語(yǔ)言,詳細(xì)語(yǔ)言編碼規(guī)范參考《C++編碼規(guī)范》(附件A)和《C#編碼規(guī)范》(附件B)。代碼規(guī)范有些不易理解的變量或函數(shù)應(yīng)作注釋,難懂的代碼要有注解,在文件的開始處有該文件的用途描述。一定要保持注釋的一致性。代碼組織要清晰,{,},(,),if,else,do,while,for,case等要對(duì)應(yīng)整齊,少用空格,縮進(jìn)全部用Tab鍵。變量的定義要集中,函數(shù)間要有空行分開,一個(gè)程序中的空行數(shù)目最好占8%-16%。多態(tài)函數(shù)和功能相近的函數(shù)集中放在一起。代碼應(yīng)該簡(jiǎn)潔、清楚并講述了所發(fā)生的一切。某些公用代碼要注意多平臺(tái)易移植,最好使用標(biāo)準(zhǔn)C。代碼的重用要仔細(xì),要將相關(guān)的代碼也拷貝過來(lái),注意那段代碼是否適合需求的應(yīng)用場(chǎng)合。刪掉從來(lái)沒有用過的函數(shù)或變量,大篇幅注釋掉的代碼行也應(yīng)刪除,以免使程序混亂難讀。工程文件組織規(guī)范一個(gè)工程往往包含很多很多文件(*.h,*.cpp,*.inc,*.lib,資源文件等),向工程中加入文件或刪除工程中的文件要慎重,避免把工程損壞。工程中不起作用的文件或類應(yīng)刪除,工程目錄下的非工程文件也應(yīng)該移走,保持工程的清潔,避免混淆難于管理。工程文件如果很多,應(yīng)歸類。在VC環(huán)境下,建議將常用的頭文件全部放入stdafx.h中,而在每個(gè)cpp開始處嵌入stdafx.h。避免頭文件的交叉引用,如果有嚴(yán)重的交叉引用,適當(dāng)使用類的聲明。將獨(dú)立性比較強(qiáng)的模塊抽出來(lái),做成DLL,控件或COM組件,該模塊可單獨(dú)編寫和測(cè)試,也增強(qiáng)了其可重用性。一個(gè)比較大的工程應(yīng)留有一定的消息接口或插件接口等。工程的版本控制要嚴(yán)格,版本格式為xx.xx.xx,必要時(shí)使用Build次數(shù)或日期。高版本盡量兼容低版本的用法、數(shù)據(jù)或協(xié)議。工程的編譯宏定義和工程參數(shù)設(shè)置應(yīng)正確,每作一個(gè)新工程時(shí)應(yīng)檢查工程參數(shù)是否正確。建議字節(jié)對(duì)齊方式為1字節(jié)對(duì)齊。工程文件應(yīng)經(jīng)常備份,備份時(shí)注明備份日期和主要增加的功能。類組織規(guī)范類一般有兩個(gè)文件,一個(gè)頭文件,一個(gè)實(shí)現(xiàn)體CPP。類力求封裝好,嚴(yán)格區(qū)分public,private,protect等作用域,如果一個(gè)函數(shù)與本類有莫大的關(guān)系,可以作為該類的靜態(tài)成員函數(shù),不用或少用友元函數(shù)等破壞類封裝性的方法和技巧。如果一些結(jié)構(gòu)或宏僅與本類有關(guān),可在類頭文件中定義。類的成員變量在構(gòu)造函數(shù)或初始化函數(shù)中應(yīng)賦初值。指針在構(gòu)造函數(shù)中賦NULL,析構(gòu)時(shí)DEL_EMPTY它,以免內(nèi)存泄露。用戶界面規(guī)范有四大類型的用戶界面:對(duì)話框、單文檔界面、多文檔界面、其它界面。對(duì)話框要易用且簡(jiǎn)潔,字體和控件的組織搭配要得體,能簡(jiǎn)單不復(fù)雜,各控件的焦點(diǎn)、Tab順序等要講究,視應(yīng)用場(chǎng)合要適當(dāng)支持鍵盤。在簡(jiǎn)潔易用的前提下,力求個(gè)性化,設(shè)計(jì)得更加友好。程序各對(duì)話框的風(fēng)格要保持一致。單文檔和多文檔界面的程序功能強(qiáng),也便于擴(kuò)充和管理。其中菜單、工具欄、狀態(tài)欄等設(shè)計(jì)要有特色。菜單按一定的分類彈出,必要時(shí)設(shè)計(jì)成多套菜單,在重要的窗口或區(qū)域應(yīng)能彈出右鍵,實(shí)現(xiàn)常見操作。工具欄上放最常用的操作按鈕,必要時(shí)動(dòng)態(tài)更換按鈕。狀態(tài)欄顯示足夠多的有用信息。消息主控在Mainframe中,單文檔的主控也可在View中,所有的對(duì)話框的彈出或非模態(tài)對(duì)話框的控制都在主控窗口中完成,具體的數(shù)據(jù)處理放在單獨(dú)的文件中或設(shè)計(jì)成類。在App類中實(shí)現(xiàn)Ini讀寫,各數(shù)據(jù)對(duì)象的定義和析構(gòu),全局變量的賦值和初始計(jì)算,存盤退出等。各視圖的OnDraw和GDI畫圖盡量使用內(nèi)存位圖的方式,以免閃爍。其它還有ATL,控制臺(tái),嵌入式程序界面等,也有作為其它容器如IE中的插件等,此類程序可能不用MFC,而采用COM組件等方法實(shí)現(xiàn)。軟件測(cè)試測(cè)試時(shí)系統(tǒng)投入使用前最關(guān)鍵的一個(gè)步驟,由開發(fā)人員之間、業(yè)務(wù)需求人員交叉測(cè)試或由軟件測(cè)試工程師測(cè)試。開發(fā)人員將對(duì)在測(cè)試過程中發(fā)現(xiàn)的問題提出可行建議進(jìn)行改進(jìn)。測(cè)試方法、測(cè)試類型及測(cè)試結(jié)果判斷規(guī)范參考《軟件測(cè)試規(guī)范》。項(xiàng)目驗(yàn)收建設(shè)工程包括多個(gè)方面的工作和任務(wù),每一項(xiàng)任務(wù)的完成、每一個(gè)文檔的提交、每一個(gè)設(shè)備、軟件或應(yīng)用系統(tǒng)的交付,都有相應(yīng)的完成標(biāo)志和測(cè)試、評(píng)估和驗(yàn)收標(biāo)準(zhǔn)。對(duì)于系統(tǒng)、網(wǎng)絡(luò)和應(yīng)用這種重大的工作里程碑事件,測(cè)試驗(yàn)收工作更為嚴(yán)謹(jǐn)和充分,計(jì)劃更為周密。按照系統(tǒng)集成服務(wù)的程序和行業(yè)慣例,整個(gè)項(xiàng)目實(shí)施過程中要對(duì)不同的交付項(xiàng)目進(jìn)行如下各類測(cè)試和驗(yàn)收中的一種或幾種,具體進(jìn)行哪種或哪些測(cè)試驗(yàn)收工作依交付項(xiàng)目的性質(zhì)不同而不同。審議確認(rèn)這是一種采用對(duì)交付件內(nèi)容進(jìn)行閱讀、講解、評(píng)議、問題與回答的形式進(jìn)行評(píng)審,并作出接受或拒絕決定的方法。對(duì)于交付的項(xiàng)目管理文檔、設(shè)計(jì)文檔、測(cè)試報(bào)告、技術(shù)資料等交付項(xiàng)目,通常采用這種方法。安裝測(cè)試采用標(biāo)準(zhǔn)的測(cè)試程序(如硬件設(shè)備開機(jī)自檢)和操作方法,對(duì)交付件進(jìn)行測(cè)試的方法。通常用于對(duì)硬件設(shè)備和系統(tǒng)軟件的驗(yàn)收。初始安裝測(cè)試類似于安裝測(cè)試,通常用于對(duì)最終提交結(jié)果進(jìn)行安裝測(cè)試。典型的情況是系統(tǒng)軟件的初始安裝測(cè)試,此時(shí)安裝的是用于進(jìn)行設(shè)計(jì)開發(fā)的平臺(tái)或工具,而不是直接提交客戶作生產(chǎn)目的。用戶驗(yàn)收測(cè)試用戶驗(yàn)收測(cè)試是用戶根據(jù)自己的業(yè)務(wù)處理要求,在實(shí)際系統(tǒng)上進(jìn)行的類似于系統(tǒng)集成測(cè)試的過程。這種測(cè)試的目的是檢驗(yàn)交付系統(tǒng)是否達(dá)到設(shè)計(jì)要求,是否可以投入業(yè)務(wù)運(yùn)行。與系統(tǒng)集成測(cè)試的不同在于,用戶驗(yàn)收測(cè)試更加著重從業(yè)務(wù)功能方面的測(cè)試,時(shí)間也相對(duì)短。驗(yàn)收測(cè)試計(jì)劃確立了對(duì)系統(tǒng)進(jìn)行測(cè)試驗(yàn)收的方式和標(biāo)準(zhǔn)。公司將指導(dǎo)用戶制訂驗(yàn)收測(cè)試計(jì)劃(在驗(yàn)收測(cè)試開始前兩周)。測(cè)試計(jì)劃將包括:測(cè)試目標(biāo)角色和職責(zé)測(cè)試環(huán)境要測(cè)試的功能和外觀特征測(cè)試手段測(cè)試案例及預(yù)期結(jié)果當(dāng)所有功能和外觀特征經(jīng)測(cè)試達(dá)到驗(yàn)收測(cè)試計(jì)劃所說(shuō)明的完成標(biāo)志,客戶將接收該系統(tǒng)。在測(cè)試過程中,任一項(xiàng)沒有達(dá)到完成標(biāo)志,開發(fā)商將負(fù)責(zé)修正然后再進(jìn)行測(cè)試。某些測(cè)試失敗可能由于對(duì)項(xiàng)目實(shí)施目標(biāo)的誤解而導(dǎo)致,對(duì)這些誤解進(jìn)行分析。如果是開發(fā)商的責(zé)任,將做必要的修正并再進(jìn)行測(cè)試。人員培訓(xùn)對(duì)用戶人員進(jìn)行技術(shù)培訓(xùn)是工程成功的重要因素,是整個(gè)項(xiàng)目能否順利實(shí)施的重要保證。針對(duì)設(shè)備或軟件系統(tǒng)的業(yè)務(wù)和技術(shù)特點(diǎn)及要求,我們將提供必要的技術(shù)培訓(xùn),并可就客戶的其它具體要求提供其它方面的培訓(xùn)。資料文檔為保證系統(tǒng)的建設(shè)和正常運(yùn)行,我們可以提供如下設(shè)計(jì)類、計(jì)劃類、測(cè)試類資料和文檔,各項(xiàng)目根據(jù)自身情況進(jìn)行剪切。軟件需求規(guī)格說(shuō)明系統(tǒng)設(shè)計(jì)文檔數(shù)據(jù)庫(kù)設(shè)計(jì)文檔軟件開發(fā)計(jì)劃開發(fā)計(jì)劃軟件配置項(xiàng)測(cè)試計(jì)劃測(cè)試大綱測(cè)試報(bào)告驗(yàn)收?qǐng)?bào)告用戶手冊(cè)客服支持培訓(xùn)目標(biāo)在實(shí)施項(xiàng)目的過程中,使相關(guān)操作人員理解軟件的基本原理和實(shí)際運(yùn)用,使他們對(duì)整套業(yè)務(wù)軟件的具體性能,操作步驟以及具體要求,有一個(gè)更深層次的認(rèn)識(shí),并能在計(jì)算機(jī)管理下對(duì)其業(yè)務(wù)軟件流程熟練操作使用。再開發(fā)人員共同接受軟件開發(fā)方全面、系統(tǒng)的培訓(xùn),保證能夠在后期推廣中獨(dú)擋一面完成推廣及軟件升級(jí)任務(wù)。培訓(xùn)計(jì)劃項(xiàng)目組有義務(wù)對(duì)用戶提供及時(shí)、有效、全面的培訓(xùn),并在項(xiàng)目實(shí)施過程中充分重視對(duì)用戶方的技術(shù)轉(zhuǎn)移,并提前制訂有效可行的培訓(xùn)計(jì)劃。考核標(biāo)準(zhǔn)以實(shí)際操作方式測(cè)試用戶對(duì)軟件系統(tǒng)流程的操作使用能力。

附錄AC++編碼規(guī)范1文件結(jié)構(gòu)1.1文件頭注釋所有C++的源文件均必須包含一個(gè)規(guī)范的文件頭,文件頭包含了該文件的名稱、功能概述、作者、版權(quán)和版本歷史信息等內(nèi)容。標(biāo)準(zhǔn)文件頭的格式為:/*!@file

********************************************************************************

<PRE>

模塊名

:<文件所屬的模塊名稱>

文件名

:<文件名>

相關(guān)文件

:<與此文件相關(guān)的其它文件>

文件實(shí)現(xiàn)功能:<描述該文件實(shí)現(xiàn)的主要功能>

作者

:<作者部門和姓名>

版本

:<當(dāng)前版本號(hào)>

多線程安全性:<是/否>[,說(shuō)明]

異常時(shí)安全性:<是/否>[,說(shuō)明]

備注

:<其它說(shuō)明>

修改記錄:

日期

版本

修改人

修改內(nèi)容

YYYY/MM/DD

X.Y

<作者或修改者名>

<修改內(nèi)容>

</PRE>

*******************************************************************************/如果該文件有其它需要說(shuō)明的地方,還可以專門為此擴(kuò)展一節(jié),節(jié)與節(jié)之間用長(zhǎng)度為80的“=”帶分割:/*!@file

********************************************************************************

<PRE>

模塊名

:<文件所屬的模塊名稱>

文件名

:<文件名>

相關(guān)文件

:<與此文件相關(guān)的其它文件>

文件實(shí)現(xiàn)功能:<描述該文件實(shí)現(xiàn)的主要功能>

作者

:<作者部門和姓名>

版本

:<當(dāng)前版本號(hào)>

多線程安全性:<是/否>[,說(shuō)明]

異常時(shí)安全性:<是/否>[,說(shuō)明]

備注

:<其它說(shuō)明>

修改記錄:

日期

版本

修改人

修改內(nèi)容

YYYY/MM/DD

X.Y

<作者或修改者名>

<修改內(nèi)容>

</PRE>

********************************************************************************

*項(xiàng)目1

-項(xiàng)目1.1

-項(xiàng)目1.2

================================================================================

*項(xiàng)目2

-項(xiàng)目2.1

-項(xiàng)目2.2

*******************************************************************************/每行注釋的長(zhǎng)度都不應(yīng)該超過80個(gè)半角字符。還要注意縮進(jìn)和對(duì)齊,以利閱讀。注意:將多線程和異常時(shí)安全性描述放在文件頭,而不是類或者函數(shù)注釋中,是為了體現(xiàn)以下設(shè)計(jì)思想:同一個(gè)模塊中的界面,其各方面的操作方式和使用風(fēng)格應(yīng)該盡量保持一致。1.2頭文件

頭文件通常由以下幾部分組成:文件頭注釋每個(gè)頭文件,無(wú)論是內(nèi)部的還是外部的,都應(yīng)該由一個(gè)規(guī)范的文件頭注釋作為開始。預(yù)處理塊為了防止頭文件被重復(fù)引用,應(yīng)當(dāng)用ifndef/define/endif結(jié)構(gòu)產(chǎn)生預(yù)處理塊。函數(shù)和類/結(jié)構(gòu)的聲明等聲明模塊的接口。需要包含的內(nèi)聯(lián)函數(shù)定義文件(如果有的話)如果類中的內(nèi)聯(lián)函數(shù)較多,或者一個(gè)頭文件中包含多個(gè)類的定義(不推薦),可以將所有內(nèi)聯(lián)函數(shù)定義放入一個(gè)單獨(dú)的內(nèi)聯(lián)函數(shù)定義文件中,并在類聲明之后用“#include”指令把它包含進(jìn)來(lái)。頭文件的編碼規(guī)則:引用文件的格式用#include<filename.h>格式來(lái)引用標(biāo)準(zhǔn)庫(kù)和系統(tǒng)庫(kù)的頭文件(編譯器將從標(biāo)準(zhǔn)庫(kù)目錄開始搜索)。用#include"filename.h"格式來(lái)引用當(dāng)前工程中的頭文件(編譯器將從該文件所在目錄開始搜索)。分割多組接口(如果有的話)如果在一個(gè)頭件中定義了多個(gè)類或者多組接口(不推薦),為了便于瀏覽,應(yīng)該在每個(gè)類/每組接口間使用分割帶把它們相互分開。關(guān)于頭文件的完整例子,請(qǐng)參見:頭文件例子1.3內(nèi)聯(lián)函數(shù)定義文件如上所述,在內(nèi)聯(lián)函數(shù)較多的情況下,為了避免頭文件過長(zhǎng)、版面混亂,可以將所有的內(nèi)聯(lián)函數(shù)定義移到一個(gè)單獨(dú)的文件中去,然后再用#include指令將它包含到類聲明的后面。這樣的文件稱為一個(gè)內(nèi)聯(lián)函數(shù)定義文件。按照慣例,應(yīng)該將這個(gè)文件命名為“filename.inl”,其中“filename”與相應(yīng)的頭文件和實(shí)現(xiàn)文件相同。內(nèi)聯(lián)函數(shù)定義文件由以下幾部分組成:文件頭注釋每?jī)?nèi)聯(lián)函數(shù)定義文件都應(yīng)該由一個(gè)規(guī)范的文件頭注釋作為開始。內(nèi)聯(lián)函數(shù)定義內(nèi)聯(lián)函數(shù)的實(shí)現(xiàn)體。內(nèi)聯(lián)函數(shù)定義文件的編碼規(guī)則:分割多組接口(如果有的話)如果在一個(gè)內(nèi)聯(lián)函數(shù)定義文件中定義了多個(gè)類或者多組接口的內(nèi)聯(lián)函數(shù)(不推薦),必須在每個(gè)類/每組接口間使用分割帶把它們相互分開。文件組成中為什么沒有預(yù)處理塊?與頭文件不同,內(nèi)聯(lián)函數(shù)定義文件通常不需要定義預(yù)處理塊,這是因?yàn)樗麄兛偸潜话谂c其相應(yīng)的頭文件預(yù)處理塊內(nèi)。1.4實(shí)現(xiàn)文件實(shí)現(xiàn)文件包含所有數(shù)據(jù)和代碼的實(shí)現(xiàn)體。實(shí)現(xiàn)文件的格式為:文件頭注釋每個(gè)實(shí)現(xiàn)文件都應(yīng)該由一個(gè)規(guī)范的文件頭注釋作為開始對(duì)配套頭文件的引用引用聲明了此文件實(shí)現(xiàn)的類、函數(shù)及數(shù)據(jù)的頭文件對(duì)一些僅用于實(shí)現(xiàn)的頭文件的引用(如果有的話)將僅與實(shí)現(xiàn)相關(guān)的接口包含在實(shí)現(xiàn)文件里(而不是頭文件中)是一個(gè)非常好的編程習(xí)慣。這樣可以有效地屏蔽不應(yīng)該暴露的實(shí)現(xiàn)細(xì)節(jié),將實(shí)現(xiàn)改變對(duì)其它模塊的影響降低到最少。程序的實(shí)現(xiàn)體數(shù)據(jù)和函數(shù)的定義實(shí)現(xiàn)文件的編碼規(guī)則:分割每個(gè)部分:在本地(靜態(tài))定義和外部定義間,以及不同接口或不同類的實(shí)現(xiàn)之間,應(yīng)使用分割帶相互分開。1.5文件的組織結(jié)構(gòu)由于項(xiàng)目性質(zhì)、規(guī)模上存在著差異,不同項(xiàng)目間的文件組織形式差別很大。但文件、目錄組織的基本原則應(yīng)當(dāng)是一致的:使外部接口與內(nèi)部實(shí)現(xiàn)盡量分離;盡可能清晰地表達(dá)軟件的層次結(jié)構(gòu)。為此提供兩組典型項(xiàng)目的文件組織結(jié)構(gòu)范例作為參考:1.5.1功能模塊/庫(kù)的文件組織形式顯而易見,編寫功能模塊和庫(kù)的主要目的是為其它模塊提供一套完成特定功能的API,這類項(xiàng)目的文件組織結(jié)構(gòu)通常如下圖所示:其中:Contrib:當(dāng)前項(xiàng)目所依賴的所有第三方軟件,可以按類別分設(shè)子目錄。Doc:項(xiàng)目文檔Include:聲明外部接口的所有頭文件和內(nèi)聯(lián)定義文件。Lib:編譯好的二進(jìn)制庫(kù)文件,可以按編譯器、平臺(tái)分設(shè)子目錄。Makefile:用于編譯項(xiàng)目的makefile文件和project文件等??梢园淳幾g器、平臺(tái)分設(shè)子目錄。Src:所有實(shí)現(xiàn)文件和聲明內(nèi)部接口的頭文件、內(nèi)聯(lián)定義文件??砂垂δ軇澐?;支持編譯器、平臺(tái)等類別分設(shè)子目錄。Test:存放測(cè)試用代碼的目錄。1.5.2應(yīng)用程序的文件組織形式與功能模塊不同,應(yīng)用程序是一個(gè)交付給最終用于使用的、可以獨(dú)立運(yùn)行并提供完整功能的軟件產(chǎn)品,它通常不提供編程接口,應(yīng)用程序的典型文件組織形式如下圖所示:Contrib:當(dāng)前項(xiàng)目所依賴的所有第三方軟件,可以按類別分設(shè)子目錄。Doc:項(xiàng)目文檔Makefile:用于編譯項(xiàng)目的makefile文件和project文件等。可以按編譯器、平臺(tái)分設(shè)子目錄。Setup:安裝程序,以及制作安裝程序所需要的項(xiàng)目文件和角本。Src:所有源文件??砂垂δ軇澐郑恢С志幾g器、平臺(tái)等類別分設(shè)子目錄。Test:存放測(cè)試用代碼的目錄。2命名規(guī)則如果想要有效的管理一個(gè)稍微復(fù)雜一點(diǎn)的體系,針對(duì)其中事物的一套統(tǒng)一、帶層次結(jié)構(gòu)、清晰明了的命名準(zhǔn)則就是必不可少而且非常好用的工具。活躍在生物學(xué)、化學(xué)、軍隊(duì)、監(jiān)獄、黑社會(huì)、恐怖組織等各個(gè)領(lǐng)域內(nèi)的大量有識(shí)先輩們都曾經(jīng)無(wú)數(shù)次地以實(shí)際行動(dòng)證明了以上公理的正確性。除了上帝(設(shè)它可以改變世間萬(wàn)物的秩序)以外,相信沒人有實(shí)力對(duì)它不屑一顧。在軟件開發(fā)這一高度抽象而且十分復(fù)雜的活動(dòng)中,命名規(guī)則的重要性更顯得尤為突出。一套定義良好并且完整的、在整個(gè)項(xiàng)目中統(tǒng)一使用的命名規(guī)范將大大提升源代碼的可讀性和軟件的可維護(hù)性。在引入細(xì)節(jié)之前,先說(shuō)明一下命名規(guī)范的整體原則:同一性在編寫一個(gè)子模塊或派生類的時(shí)候,要遵循其基類或整體模塊的命名風(fēng)格,保持命名風(fēng)格在整個(gè)模塊中的同一性。標(biāo)識(shí)符組成標(biāo)識(shí)符采用英文單詞或其組合,應(yīng)當(dāng)直觀且可以拼讀,可望文知意,用詞應(yīng)當(dāng)準(zhǔn)確。最小化長(zhǎng)度&&最大化信息量原則在保持一個(gè)標(biāo)識(shí)符意思明確的同時(shí),應(yīng)當(dāng)盡量縮短其長(zhǎng)度。避免過于相似不要出現(xiàn)僅靠大小寫區(qū)分的相似的標(biāo)識(shí)符,例如“i”與“I”,“function”與“Function”等等。避免在不同級(jí)別的作用域中重名程序中不要出現(xiàn)名字完全相同的局部變量和全局變量,盡管兩者的作用域不同而不會(huì)發(fā)生語(yǔ)法錯(cuò)誤,但容易使人誤解。正確命名具有互斥意義的標(biāo)識(shí)符用正確的反義詞組命名具有互斥意義的標(biāo)識(shí)符,如:"nMinValue"和"nMaxValue","GetName()"和"SetName()"避免名字中出現(xiàn)數(shù)字編號(hào)盡量避免名字中出現(xiàn)數(shù)字編號(hào),如Value1,Value2等,除非邏輯上的確需要編號(hào)。這是為了防止程序員偷懶,不肯為命名動(dòng)腦筋而導(dǎo)致產(chǎn)生無(wú)意義的名字(因?yàn)橛脭?shù)字編號(hào)最省事)。2.1類/結(jié)構(gòu)除了異常類等個(gè)別情況(不希望被用戶看作一個(gè)普通的、正常的類之情況)外,C++類/結(jié)構(gòu)的命名應(yīng)該遵循以下準(zhǔn)則:C++類/結(jié)構(gòu)的命名類的名稱都要以大寫字母“C”開頭,后跟一個(gè)或多個(gè)單詞。為便于界定,每個(gè)單詞的首字母要大寫。特別地,由于界面與其它類概念上的巨大差別,規(guī)定界面類要以大寫字母“I”開頭。界面類描述一個(gè)服務(wù)(一組被命名的操作集合),在C++中,界面與其它類間的最大區(qū)別在于,界面類中不包含任何數(shù)據(jù)結(jié)構(gòu)(屬性),也不包括任何具體的操作和實(shí)現(xiàn),界面類通常僅包含一組純虛函數(shù)的聲明而不包含任何實(shí)現(xiàn)和數(shù)據(jù)。在一些其它語(yǔ)言中,一個(gè)界面也被稱作一個(gè)接口及其實(shí)現(xiàn)契約。另一個(gè)與接口相似的概念是類型,類型與接口的不同點(diǎn)在于,類型可以包含部分接口的實(shí)現(xiàn)或包含一些接口默認(rèn)的或不完整的實(shí)現(xiàn),一個(gè)類型也可以包含一些屬性。規(guī)定類型類要以大寫字母“T”開頭。例如:轎車類型"TCar"、線程類型"TThread"等等。在C++種,類型類也叫做結(jié)點(diǎn)類。在現(xiàn)實(shí)世界中,類型和界面的區(qū)別往往比較微妙。在真實(shí)代碼中,有些類除了包含純虛函數(shù)以外,也可能同時(shí)包含幾個(gè)帶簡(jiǎn)單默認(rèn)實(shí)現(xiàn)的普通虛函數(shù)。例如:某個(gè)類中可能包含一個(gè)(非純虛)虛方法IsLoadable,并定義了該方法的默認(rèn)實(shí)現(xiàn):returnfalse;。我們不難找出很多類似的例子。以下是一些類型和界面的界定策略:如果一個(gè)類中包含靜態(tài)成員,則一定不是界面如果一個(gè)類中包含屬性,則一定不是界面如果一個(gè)類中包含非虛方法,則一定不是界面如果一個(gè)類中包含非公有成員,則一定不是界面如果一個(gè)類中包含模板方法,則一定不是界面。這里的模板方法是指那些調(diào)用了該類中其它虛函數(shù)的成員,這樣的方法通常用于實(shí)現(xiàn)針對(duì)某種應(yīng)用的算法框架,這顯然超出了界面的范疇。在C++中,模板方法的另一個(gè)意思通常指使用函數(shù)模板的成員,由于C++函數(shù)模板只能是非虛的,所以包含這種方法的類也一定不是界面。通常定義那些不十分明確的接口時(shí),先將其指定為一個(gè)界面,必要時(shí)再把它提升為一個(gè)類型。模板類的命名規(guī)范與實(shí)體類相同。為了更好地表示代碼段之間的相關(guān)性和增加程序的可讀性。我們經(jīng)常會(huì)把一段僅在某個(gè)函數(shù)內(nèi)反復(fù)使用的代碼片段封裝為一個(gè)函數(shù)對(duì)象,并定義在這個(gè)函數(shù)體內(nèi)。對(duì)于這類實(shí)現(xiàn)功能簡(jiǎn)單,并且主要通過operator()來(lái)使用的類/結(jié)構(gòu),其名稱應(yīng)當(dāng)以大寫字母“FO”開頭,如:"FONameChecker"等。推薦的組成形式類的命名推薦用"名詞"或"形容詞+名詞"的形式,例如:"CAnalyzer","CFastVector","IUnknown","IDBWriter",

"TTimer","TThread"不同于C++類的概念,傳統(tǒng)的C結(jié)構(gòu)體只是一種將一組數(shù)據(jù)捆綁在一起的方式。傳統(tǒng)C結(jié)構(gòu)體的命名規(guī)則為:傳統(tǒng)C結(jié)構(gòu)體的命名傳統(tǒng)C結(jié)構(gòu)體的名稱全部由大寫字母組成,單詞間使用下劃線界定,例如:"SERVICE_STATUS","DRIVER_INFO"2.2函數(shù)2.2.1函數(shù)的命名函數(shù)的名稱由一個(gè)或多個(gè)單詞組成。為便于界定,每個(gè)單詞的首字母要大寫。2.2.2推薦的組成形式函數(shù)名應(yīng)當(dāng)使用"動(dòng)詞"或者"動(dòng)詞+名詞"(動(dòng)賓詞組)的形式。例如:"GetName()","SetValue()","Erase()","Reserve()"2.2.3保護(hù)成員函數(shù)保護(hù)成員函數(shù)的開頭應(yīng)當(dāng)加上一個(gè)下劃線“_”以示區(qū)別,例如:"_SetState()"2.2.4私有成員函數(shù)類似地,私有成員函數(shù)的開頭應(yīng)當(dāng)加上兩個(gè)下劃線“__”,例如:"__DestroyImp()"2.2.5私有成員函數(shù)的層次結(jié)構(gòu)表示通常來(lái)說(shuō),在一個(gè)類中,公有方法、保護(hù)方法和私有方法所完成的任務(wù)總是呈現(xiàn)一種逐級(jí)依次細(xì)化的層次結(jié)構(gòu)(意即:保護(hù)方法所實(shí)現(xiàn)的功能通常比該類中的公有方法更為細(xì)小瑣碎;類似地,私有方法的功能也比其保護(hù)方法更具原子性)。因此,對(duì)于遵循以上規(guī)則,并且功能較為復(fù)雜的類,在按照“公有、保護(hù)、私有”的三級(jí)形式劃分以后,如果其私有成員中仍然存在明顯不同的功能粒度,則可以通過追加更多下劃線前綴的形式予以表示。例如:由三個(gè)下劃線開頭的私有方法“___PushCdr”就要比同一類中,僅由兩個(gè)下劃線開頭的私有方法“__MergeConCall”所完成的功能粒度更細(xì)小、更瑣碎;而四個(gè)下劃線開頭的“____CalcCompensate”則比“___PushCdr”完成的功能更具原子性。如果發(fā)現(xiàn)類中的功能層數(shù)太多(從公有方法到最“原子”的私有方法間,一般不應(yīng)該超過7層),那通常反應(yīng)一個(gè)不良的設(shè)計(jì)。此時(shí)請(qǐng)檢查這個(gè)類的功能是否過于臃腫,已使接口顯得不太清晰。另外一個(gè)常見的問題是將無(wú)需訪問該類中私有或保護(hù)成員的功能定義成了方法。第一個(gè)問題可以通過重新劃分類層次結(jié)構(gòu)或?qū)⒁粋€(gè)類分裂為多個(gè)類等方法解決。對(duì)于第二個(gè)問題,由于這些方法無(wú)需訪問受限成員,大多數(shù)時(shí)候都可以把它們轉(zhuǎn)變成局部函數(shù)(放在無(wú)名空間或使用“static”前綴定義)。2.2.6成員函數(shù)的下劃線后綴命名對(duì)一些本應(yīng)該作為保護(hù)或私有成員的函數(shù),由于設(shè)計(jì)方面的其它考慮(例如:靈活性、功能等方面)將其提升為公有成員的,應(yīng)該在其后面添加與其原本訪問控制級(jí)別相應(yīng)的下劃線后綴。另外,對(duì)于其它不推薦直接使用的成員函數(shù)(例如:會(huì)引起兼容性或可移植性方面問題的函數(shù)),也應(yīng)當(dāng)在其后面加相應(yīng)下劃線提示。例如:"ioctl_()","SetSysOpt_()","GetSysOpt_()","PreParser__()"2.2.7回調(diào)和事件處理函數(shù)回調(diào)和事件處理函數(shù)習(xí)慣以單詞“On”開頭。例如:"_OnTimer()","OnExit()"2.2.8虛函數(shù)回調(diào)函數(shù)以外的虛函數(shù)習(xí)慣以“Do”開頭,如:"DoRefresh()","_DoEncryption()"2.3變量變量應(yīng)該是程序中使用最多的標(biāo)識(shí)符了,變量的命名規(guī)范可能是一套C++命名準(zhǔn)則中最重要的部分:變量的命名變量名由作用域前綴+類型前綴+一個(gè)或多個(gè)單詞組成。為便于界定,每個(gè)單詞的首字母要大寫。對(duì)于某些用途簡(jiǎn)單明了的局部變量,也可以使用簡(jiǎn)化的方式,如:i,j,k,x,y,z作用域前綴作用域前綴標(biāo)明一個(gè)變量的可見范圍。作用域可以有如下幾種:前綴說(shuō)明無(wú)局部變量m_類的成員變量(member)sm_類的靜態(tài)成員變量(staticmember)s_靜態(tài)變量(static)g_外部全局變量(global)sg_靜態(tài)全局變量(staticglobal)gg_進(jìn)程或動(dòng)態(tài)鏈接庫(kù)間共享的全局變量(globalglobal)除非不得已,否則應(yīng)該盡可能少使用全局變量。關(guān)于全局變量和局部靜態(tài)變量的依賴性問題和初始化時(shí)的線程安全性問題類型前綴類型前綴標(biāo)明一個(gè)變量的類型,可以有如下幾種:前綴說(shuō)明n整型和位域變量(number)e枚舉型變量(enumeration)c字符型變量(char)b布爾型變量(bool)f浮點(diǎn)型變量(float)p指針型變量和迭代子(pointer)pfn指向函數(shù)的指針變量或指向函數(shù)對(duì)象的指針(pointeroffunction)pm指向成員的指針(pointerofmember)r引用(reference),此前綴對(duì)于常引用(constreference)來(lái)說(shuō)可以省略g數(shù)組(grid)fo函數(shù)對(duì)象(FunctionObject)i類的實(shí)例(instance)對(duì)于經(jīng)常用到的類,也可以定義一些專門的前綴,如:std::string和std::wstring類的前綴可以定義為"st",std::vector類的前綴可以定義為"v"等等。類型前綴可以組合使用,例如"gc"表示字符數(shù)組,"ppn"表示指向整型的指針的指針等等。數(shù)值前綴的特別記法以“n”作為所有整形前綴是由于大多數(shù)情況下,編寫程序時(shí)不需要過多考慮整形的寬度,但在某些場(chǎng)合中,整形寬度是需要特別注意并且仔細(xì)加以區(qū)分的,這時(shí)可使用如下記法代替“n”前綴:前綴說(shuō)明b字節(jié)(8bit,byte)w字(16bit,word)dw雙字(32bit,doubleword)qw-或-nn四字(64bit,quadword)bf位域(bitfield)對(duì)浮點(diǎn)型變量也有類似記法如下:前綴說(shuō)明f單精度浮點(diǎn)(32bit,float)d雙精度浮點(diǎn)(64bit,double)ld擴(kuò)展精度浮點(diǎn)(80bit,longdouble)推薦的組成形式變量的名字應(yīng)當(dāng)使用"名詞"或者"形容詞+名詞"。例如:"nCode","m_nState","nMaxWidth"2.4常量C++中引入了對(duì)常量的支持,常量的命名規(guī)則如下:常量的命名常量名由類型前綴+全大寫字母組成,單詞間通過下劃線來(lái)界定,如:cDELIMITER,nMAX_BUFFER。類型前綴的定義與變量命名規(guī)則中的相同。2.5枚舉、聯(lián)合、typedef枚舉、聯(lián)合及typedef語(yǔ)句都是定義新類型的簡(jiǎn)單手段,它們的命名規(guī)則為:枚舉、聯(lián)合的命名由枚舉、聯(lián)合語(yǔ)句定義的類型名由全大寫字母組成,單詞間通過下劃線來(lái)界定,如:FAR_PROC,ERROR_TYPEtypedef的命名通常情況下,typedef語(yǔ)句定義的類型名,其命名規(guī)范與枚舉及聯(lián)合語(yǔ)句相同,也采用大寫字母加下劃線的原則。但是在定義一個(gè)模板類實(shí)例的別名時(shí),為清晰起見,可以考慮酌情使用類的命名原則,例如:typedefCWriter<CSysFile>CSysFileWriter;

typedefstd::vector<int>VINT;2.6宏、枚舉值宏、枚舉值的命名宏和枚舉值由全大寫字母組成,單詞間通過下劃線來(lái)界定,如:ERROR_UNKNOWN,OP_STOP。2.7名空間C++名空間是“類”概念的一種退化(大體相當(dāng)于只包含靜態(tài)成員且不能實(shí)例化的類)。它的引入為標(biāo)識(shí)符名稱提供了更好的層次結(jié)構(gòu),使標(biāo)識(shí)符看起來(lái)更加直觀簡(jiǎn)捷,同時(shí)大大降低了名字沖突的可能性。名空間的命名規(guī)則包括:名空間的命名名空間的名稱不應(yīng)該過長(zhǎng),通常都使用縮寫的形式來(lái)命名。例如,一個(gè)圖形庫(kù)可以將其所有外部接口存放在名空間"GLIB"中,但是將其換成"GRAPHIC_LIBRARY"就不大合適。如果碰到較長(zhǎng)的名空間,為了簡(jiǎn)化程序書寫,可以使用:namespacenew_name=old_long_name;語(yǔ)句為其定義一個(gè)較短的別名。3代碼風(fēng)格與版式代碼風(fēng)格的重要性怎么強(qiáng)調(diào)都不過分。一段稍長(zhǎng)一點(diǎn)的無(wú)格式代碼基本上就是不可讀的。先來(lái)看一下這方面的整體原則:空行的使用空行起著分隔程序段落的作用??招械皿w(不過多也不過少)將使程序的布局更加清晰??招胁粫?huì)浪費(fèi)內(nèi)存,雖然打印含有空行的程序是會(huì)多消耗一些紙張,但是值得。所以不要舍不得用空行。在每個(gè)類聲明之后、每個(gè)函數(shù)定義結(jié)束之后都要加2行空行。在一個(gè)函數(shù)體內(nèi),邏揖上密切相關(guān)的語(yǔ)句之間不加空行,其它地方應(yīng)加空行分隔。語(yǔ)句與代碼行一行代碼只做一件事情,如只定義一個(gè)變量,或只寫一條語(yǔ)句。這樣的代碼容易閱讀,并且方便于寫注釋。"if"、"for"、"while"、"do"、"try"、"catch"等語(yǔ)句自占一行,執(zhí)行語(yǔ)句不得緊跟其后。不論執(zhí)行語(yǔ)句有多少都要加"{}"。這樣可以防止書寫和修改代碼時(shí)出現(xiàn)失誤??s進(jìn)和對(duì)齊程序的分界符"{"和"}"應(yīng)獨(dú)占一行并且位于同一列,同時(shí)與引用它們的語(yǔ)句左對(duì)齊。"{}"之內(nèi)的代碼塊在"{"右邊一個(gè)制表符(4個(gè)半角空格符)處左對(duì)齊。如果出現(xiàn)嵌套的"{}",則使用縮進(jìn)對(duì)齊。如果一條語(yǔ)句會(huì)對(duì)其后的多條語(yǔ)句產(chǎn)生影響的話,應(yīng)該只對(duì)該語(yǔ)句做半縮進(jìn)(2個(gè)半角空格符),以突出該語(yǔ)句。例如:void

Function(intx)

{

CSessionLockiLock(mxLock);

for(初始化;終止條件;更新)

{

//...

}

try

{

//...

}

catch(constexception&err)

{

//...

}

catch(...)

{

//...

}

//...

}最大長(zhǎng)度代碼行最大長(zhǎng)度宜控制在70至80個(gè)字符以內(nèi)。代碼行不要過長(zhǎng),否則眼睛看不過來(lái),也不便于打?。?009年更新:隨著GUI開發(fā)環(huán)境和高分寬屏的普及,此規(guī)則可以視情況適當(dāng)放寬)。長(zhǎng)行拆分長(zhǎng)表達(dá)式要在低優(yōu)先級(jí)操作符處拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語(yǔ)句可讀。例如:if((very_longer_variable1>=very_longer_variable2)

&&(very_longer_variable3<=very_longer_variable4)

&&(very_longer_variable5<=very_longer_variable6))

{

DoSomething();

}空格的使用關(guān)鍵字之后要留空格。象"const"、"virtual"、"inline"、"case"等關(guān)鍵字之后至少要留一個(gè)空格,否則無(wú)法辨析關(guān)鍵字。象"if"、"for"、"while"、"catch"等關(guān)鍵字之后應(yīng)留一個(gè)空格再跟左括號(hào)"(",以突出關(guān)鍵字。函數(shù)名之后不要留空格,緊跟左括號(hào)"(",以與關(guān)鍵字區(qū)別。"("向后緊跟。而")"、","、";"向前緊跟,緊跟處不留空格。","之后要留空格,如Function(x,y,z)。如果";"不是一行的結(jié)束符號(hào),其后要留空格,如for(initialization;condition;update)。賦值操作符、比較操作符、算術(shù)操作符、邏輯操作符、位域操作符,如"="、"+="">="、"<="、"+"、"*"、"%"、"&&"、"||"、"<<","^"等二元操作符的前后應(yīng)當(dāng)加空格。一元操作符如"!"、"~"、"++"、"--"、"&"(地址運(yùn)算符)等前后不加空格。象"[]"、"."、"->"這類操作符前后不加空格。對(duì)于表達(dá)式比較長(zhǎng)的for、do、while、switch語(yǔ)句和if語(yǔ)句,為了緊湊起見可以適當(dāng)?shù)厝サ粢恍┛崭瘢鏵or(i=0;i<10;i++)和if((a<=b)&&(c<=d))等。例如:voidFunc1(intx,inty,intz);

//良好的風(fēng)格

voidFunc1(intx,inty,intz);

//不良的風(fēng)格

//===========================================================

if(year>=2000)

//良好的風(fēng)格

if(year>=2000)

//不良的風(fēng)格

if((a>=b)&&(c<=d))

//良好的風(fēng)格

if(a>=b&&c<=d)

//不良的風(fēng)格

//===========================================================

for(i=0;i<10;i++)

//良好的風(fēng)格

for(i=0;i<10;i++)

//不良的風(fēng)格

for(i=0;I<10;i++)//過多的空格

//===========================================================

x=a<b?a:b;

//良好的風(fēng)格

x=a<b?a:b;

//不好的風(fēng)格

//===========================================================

int*x=&y;

//良好的風(fēng)格

int*x=&y;

//不良的風(fēng)格

//===========================================================

array[5]=0;

//不要寫成array[5]=0;

a.Function();

//不要寫成a.Function();

b->Function();

//不要寫成b->Function();修飾符的位置為便于理解,應(yīng)當(dāng)將修飾符"*"和"&"緊靠數(shù)據(jù)類型。例如:char*name;

int*x;

int

y;

//為避免y被誤解為指針,這里必須分行寫。

int*Function(void*p);注釋注釋的位置應(yīng)與被描述的代碼相鄰,可以放在代碼的上方或右方,不可放在下方。邊寫代碼邊注釋,修改代碼同時(shí)修改相應(yīng)的注釋,以保證注釋與代碼的一致性。不再有用的注釋要?jiǎng)h除。注釋應(yīng)當(dāng)準(zhǔn)確、易懂,防止注釋有二義性。錯(cuò)誤的注釋不但無(wú)益反而有害。當(dāng)代碼比較長(zhǎng),特別是有多重嵌套時(shí),應(yīng)當(dāng)在一些段落的結(jié)束處加注釋,便于閱讀。與常量的比較在與宏、常量進(jìn)行"==","!=",">=","<="等比較運(yùn)算時(shí),應(yīng)當(dāng)將常量寫在運(yùn)算符左邊,而變量寫在運(yùn)算符右邊。這樣可以避免因?yàn)榕既粚戝e(cuò)把比較運(yùn)算變成了賦值運(yùn)算的問題。例如:if(NULL==p)

//如果把"=="錯(cuò)打成"=",編譯器就會(huì)報(bào)錯(cuò)

{

//...

}為增強(qiáng)代碼的可讀性而定義的宏以下預(yù)定義宏對(duì)程序的編譯沒有任何影響,只為了增加代碼的可讀性:宏說(shuō)明NOTE需要注意的代碼TODO尚未實(shí)現(xiàn)的接口、類、算法等UNDONE已取消的接口、類、算法等FOR_DBG標(biāo)記為調(diào)試方便而臨時(shí)增加的代碼OK僅用于調(diào)試的標(biāo)記例如:TODOclassCMyClass;

TODOvoidFunction(void);

FOR_DBGcout<<"...";3.1類/結(jié)構(gòu)類是C++中最重要也是使用頻率最高的新特性之一。類的版式好壞將極大地影響代碼品質(zhì)。3.1.1注釋頭與類聲明與文件一樣,每個(gè)類應(yīng)當(dāng)有一個(gè)注釋頭用來(lái)說(shuō)明該類的各個(gè)方面。類聲明換行緊跟在注釋頭后面,"class"關(guān)鍵字由行首開始書寫,后跟類名稱。界定符"{"和"};"應(yīng)獨(dú)占一行,并與"class"關(guān)鍵字左對(duì)齊。/*!@class

********************************************************************************

<PRE>

類名稱

:CXXX

功能

:<簡(jiǎn)要說(shuō)明該類所完成的功能>

異常類

:<屬于該類的異常類(如果有的話)>

備注

:<使用該類時(shí)需要注意的問題(如果有的話)>

典型用法:<如果該類的使用方法較復(fù)雜或特殊,給出典型的代碼例子>

作者

:<xxx>,[yyy],[zzz]...(作者和逗號(hào)分割的修改者列表)

</PRE>

*******************************************************************************/

classCXXX

{

//...

};對(duì)于功能明顯的簡(jiǎn)單類(接口小于10個(gè)),也可以使用簡(jiǎn)單的單行注釋頭://!<簡(jiǎn)要說(shuō)明該類所完成的功能>

classCXXX

{

//...

};3.1.2繼承基類直接跟在類名稱之后,不換行,訪問說(shuō)明符(public,private,或protected)不可省略。如:classCXXX:publicCAAA,privateCBBB

{

//...

};3.1.3以行為為中心沒人喜歡上來(lái)就看到一大堆私有數(shù)據(jù),大多數(shù)用戶關(guān)心的是類的接口與它提供的服務(wù),而不是其實(shí)現(xiàn)細(xì)節(jié)。所以應(yīng)當(dāng)將公有的定義和成員放在類聲明的最前面,保護(hù)的放在中間,而私有的擺在最后。3.1.4訪問說(shuō)明符訪問說(shuō)明符(public,private,或protected)應(yīng)該獨(dú)占一行,并與類聲明中的‘class’關(guān)鍵字左對(duì)齊。3.1.5類成員的聲明版式對(duì)于比較復(fù)雜(成員多于20個(gè))的類,其成員必須分類聲明。每類成員的聲明由訪問說(shuō)明符(public,private,或protected)+全行注釋開始。注釋不滿全行(80個(gè)半角字符)的,由"/"字符補(bǔ)齊,最后一個(gè)"/"字符與注釋間要留一個(gè)半角空格符。如果一類聲明中有很多組功能不同的成員,還應(yīng)該用分組注釋將其分組。分組注釋也要與"class"關(guān)鍵字對(duì)齊。每個(gè)成員的聲明都應(yīng)該由"class"關(guān)鍵字開始向右縮進(jìn)一個(gè)制表符(4個(gè)半角空格符),成員之間左對(duì)齊。例如:classCXXX

{

public:

///////////////////////////////////////////////////////////////////////類型定義

typedefvector<string>VSTR;

public:

/////////////////////////////////////////////////////////////構(gòu)造、析構(gòu)、初始化

CXXX();

~CXXX();

public:

///////////////////////////////////////////////////////////////////////公用方法

//[[功能組1

voidFunction1(void)const;

longFunction2(INintn);

//]]功能組1

//[[功能組2

voidFunction3(void)const;

boolFunction4(OUTint&n);

//]]功能組2

private:

///////////////////////////////////////////////////////////////////////////屬性

//...

private:

/////////////////////////////////////////////////////////////////////禁用的方法

//禁止復(fù)制

CXXX(INconstCXXX&rhs);

CXXX&operator=(INconstCXXX&rhs);

};3.1.6正確地使用const和mutable把不改變對(duì)象邏輯狀態(tài)的成員都標(biāo)記為const成員不僅有利于用戶對(duì)成員的理解,更可以最大化對(duì)象使用方式的靈活性及合理性(比如通過const指針或const引用的形式傳遞一個(gè)對(duì)象)。如果某個(gè)屬性的改變并不影響該對(duì)象邏輯上的狀態(tài),而且這個(gè)屬性需要在const方法中被改變,則該屬性應(yīng)該標(biāo)記為"mutable"。例如:classCString

{

public:

//!查找一個(gè)子串,find()不會(huì)改變字符串的值,所以為const函數(shù)

intfind(INconstCString&str)const;

//...

private:

//最后一次錯(cuò)誤值,改動(dòng)這個(gè)值不會(huì)影響對(duì)象的邏輯狀態(tài),

//像find()這樣的const函數(shù)也可能修改這個(gè)值

mutableintm_nLastError;

//...

};也就是說(shuō),應(yīng)當(dāng)盡量使所有邏輯上只讀的操作成為const方法,然后使用mutable解決那些存在邏輯沖突的屬性。3.1.7嵌套的類聲明在相應(yīng)的邏輯關(guān)系確實(shí)存在時(shí),類聲明可以嵌套。嵌套類可以使用簡(jiǎn)單的單行注釋頭://...

classCXXX

{

//!嵌套類說(shuō)明

classCYYY

{

//...

};

};3.1.8初始化列表應(yīng)當(dāng)盡可能通過構(gòu)造函數(shù)的初始化列表來(lái)初始化成員和基類。初始化列表至少獨(dú)占一行,并且與構(gòu)造函數(shù)的定義保持一個(gè)制表符(4個(gè)半角空格)的縮進(jìn)。例如:CXXX::CXXXX(INintnA,INboolbB)

:m_nA(nA),m_bB(bB)

{

//...

};初始化列表的書寫順序應(yīng)當(dāng)與對(duì)象的構(gòu)造順序一致,即:先按照聲明順序?qū)懟惓跏蓟?,再按照聲明順序?qū)懗蓡T初始化。如果一個(gè)成員"a"需要使用另一個(gè)成員"b"來(lái)初始化,則"b"必須在"a"之前聲明,否則將會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤(有些編譯器會(huì)給出警告)。例如://...

classCXXXX:publicCAA,publicCBB

{

//...

CYYm_iA;

CZZm_iB;

//m_iA必須在m_iB之前聲明

};

CXXX::CXXXX(INintnA,INintnB,INboolbC)

:CAA(nA),CBB(nB),m_iA(bC),m_iB(m_iA)//先基類,后成員,

//分別按照聲明順序書寫

{

//...

};3.1.9內(nèi)聯(lián)函數(shù)的實(shí)現(xiàn)體定義在類聲明之中的函數(shù)將自動(dòng)成為內(nèi)聯(lián)函數(shù)。但為了使類的聲明更為清晰明了,應(yīng)盡量避免直接在聲明中直接定義成員函數(shù)的編程風(fēng)格。鼓勵(lì)使用"inline"關(guān)鍵字將內(nèi)聯(lián)函數(shù)放在類聲明的外部定義。3.2函數(shù)函數(shù)是程序執(zhí)行的最小單位,任何一個(gè)有效的C/C++程序都少不了函數(shù)。3.2.1函數(shù)原型函數(shù)原型的格式為:[存儲(chǔ)類]返回值類型

[名空間或類::]函數(shù)名(參數(shù)列表)[const說(shuō)明符][異常過濾器]例如:staticinlinevoid

Function1(void)

int

CSem::Function2(INconstchar*pcName)constthrow(Exp)其中:以"[]"括住的為可選項(xiàng)目。除了構(gòu)造/析構(gòu)函數(shù)及類型轉(zhuǎn)換操作符外,"返回值類型"和"參數(shù)列表"項(xiàng)不可省略(可以為"void")。"const說(shuō)明符"僅用于成員函數(shù)中。"存儲(chǔ)類","參數(shù)列表"和"異常過濾器"的說(shuō)明見下文。3.2.2函數(shù)聲明函數(shù)聲明的格式為://!函數(shù)功能簡(jiǎn)單說(shuō)明(可選)

函數(shù)原型;例如://!執(zhí)行某某操作

staticvoid

Function(void);函數(shù)聲明和其它代碼間要有空行分割。聲明類的成員函數(shù)時(shí),為了緊湊,返回值類型和函數(shù)名之間不用換行,也可以適當(dāng)減少聲明間的空行。3.2.3函數(shù)定義函數(shù)定義使用如下格式:/*!@function

********************************************************************************

<PRE>

函數(shù)名

:<函數(shù)名>

功能

:<函數(shù)實(shí)現(xiàn)功能>

參數(shù)

:<參數(shù)類表及說(shuō)明(如果有的話),格式為:>

[IN|OUT]參數(shù)1:參數(shù)說(shuō)明

[IN|OUT]參數(shù)2:參數(shù)說(shuō)明

...

返回值

:<函數(shù)返回值的意義(如果有的話)>

拋出異常:<可能拋出的異常及其說(shuō)明(如果有的話),格式為:>

類型1:說(shuō)明

類型2:說(shuō)明

...

復(fù)雜度

:<描述函數(shù)的復(fù)雜度/開銷(可選)>

備注

:<其它注意事項(xiàng)(如果有的話)>

典型用法:<如果該函數(shù)的使用方法較復(fù)雜或特殊,給出典型的代碼例子>

作者

:<xxx>,[yyy],[zzz]...(作者和逗號(hào)分割的修改者列表)

</PRE>

*******************************************************************************/

函數(shù)原型

{

//...

}對(duì)于返回值、參數(shù)意義都很明確的簡(jiǎn)單函數(shù)(代碼不超過20行),也可以使用單行函數(shù)頭://!函數(shù)實(shí)現(xiàn)功能

函數(shù)原型

{

//...

}函數(shù)定義和其它代碼之間至少分開2行空行。3.2.4參數(shù)描述宏以下預(yù)定義宏對(duì)程序的編譯沒有任何影響,只為了增強(qiáng)對(duì)參數(shù)的理解:宏說(shuō)明IN輸入?yún)?shù)。OUT輸出參數(shù)。DUMMY啞元參數(shù)-不使用參數(shù)的值,僅為幫助函數(shù)重載解析等目的而設(shè)置的參數(shù)。OPTIONAL可選參數(shù)-通常指可以為NULL的指針參數(shù),帶默認(rèn)值的參數(shù)不需要這樣標(biāo)明。RESERVED保留參數(shù)-這個(gè)參數(shù)當(dāng)前未被支持,留待以后擴(kuò)展;或者該參數(shù)為內(nèi)部使用,用戶無(wú)需關(guān)心。OWNER獲得參數(shù)的所有權(quán),調(diào)用者不再負(fù)責(zé)銷毀實(shí)參指定的對(duì)象;如果用來(lái)修飾返回值,則表示調(diào)用者獲得返回值的所有權(quán),并負(fù)責(zé)將其銷毀。UNUSED標(biāo)明這個(gè)參數(shù)在此版本中已不再使用。CHANGED參數(shù)類型或用途與較早版本相比發(fā)生了變化。ADDED新增的參數(shù)。NOTE需要注意的參數(shù)-參數(shù)意義發(fā)生變化或者與習(xí)慣用法不同。WRKBUF工作緩沖區(qū)-為避免頻繁分配臨時(shí)資源而傳入的臨時(shí)工作區(qū)。DEFERRED表示指定的參數(shù)會(huì)被延后使用,調(diào)用者在當(dāng)前調(diào)用返回后仍然要保證該參數(shù)有效,直到事先在接口中約定的,某個(gè)未來(lái)的時(shí)間點(diǎn)。其中:除了空參數(shù)"void"和啞元參數(shù)以外,每個(gè)參數(shù)左側(cè)都必須有"IN"和/或"OUT"修飾。既輸入又輸出的參數(shù)應(yīng)記為:"INOUT",而不是"OUTIN"。IN/OUT的左側(cè)還可以根據(jù)需要加入一個(gè)或多個(gè)上表中列出的其它宏。參數(shù)描述宏的使用思想是:只要一個(gè)描述宏可以用在指定參數(shù)上(即:對(duì)這個(gè)參數(shù)來(lái)說(shuō),用這個(gè)描述宏修飾它是貼切的),那么就應(yīng)當(dāng)使用它。也就是說(shuō),應(yīng)該把能用的描述宏都用上,以期盡量具體地描述一個(gè)參數(shù)的作用和用法等信息。3.2.5參數(shù)列表參數(shù)列表的格式為:參數(shù)描述宏1參數(shù)類型1參數(shù)1,參數(shù)描述宏2參數(shù)類型2參數(shù)2,...例如:INconstintnCode,OUTstring&nName

OWNERINCDatabase*piDB,OPTIONALINOUTint*pnRecordCount=NULL

INOUTstring&stRuleList,RESERVEDINintnOperate=0

...其中:"參數(shù)描述宏"見上文參數(shù)命名規(guī)范與變量的命名規(guī)范相同3.2.6存儲(chǔ)類"extern","static","inline"等函數(shù)存儲(chǔ)類說(shuō)明應(yīng)該在聲明和定義中一致并且顯式地使用。不允許隱式地使用一個(gè)類型聲明,也不允許一個(gè)類型聲明僅存在于函數(shù)的聲明或定義中。3.2.7成員函數(shù)的存儲(chǔ)類由于C++語(yǔ)言的限制,類中成員函數(shù)的"static","virtual","explicit"等存儲(chǔ)類說(shuō)明不允許出現(xiàn)在函數(shù)定義中。但是為了明確起見,這些存儲(chǔ)類應(yīng)以注釋的形式在相應(yīng)的成員定義中給出。例如:/*virtual*/CThread::EXITCODE

CSrvCtl::CWrkTrd::Entry(void)

{

//...

}

/*static*/inlinevoid

stringEx::regex_free(INOUTvoid*&pRegEx)

{

//...

}特別地,對(duì)于在類聲明中直接實(shí)現(xiàn)的方法,可以省略其"inline"關(guān)鍵字。而在內(nèi)聯(lián)(.inl)文件中實(shí)現(xiàn)的inline方法則不能省略。這是因?yàn)閕nlinelinkage是在聲明時(shí)起效的。3.2.8默認(rèn)參數(shù)類似地,參數(shù)的默認(rèn)值只能出現(xiàn)在函數(shù)聲明中,但是為了明確起見,這些默認(rèn)值應(yīng)以注釋的形式在定義中給出。例如:bool

stringEx::regex_find(OUTVREGEXRESULT&vResult,

IN

stringEx

stRegEx,

IN

size_t

nIndex

/*=0*/,

IN

size_t

nStartPos

/*=0*/,

IN

bool

bNoCase

/*=false*/,

IN

bool

bNewLine

/*=true*/,

IN

bool

bExtended

/*=true*/,

IN

bool

bNotBOL

/*=false*/,

IN

bool

bNotEOL

/*=false*/,

IN

bool

bUsePerlStyle/*=false*/)const

{

//...

}3.2.9異常過濾器對(duì)于任何可能拋出異常的函數(shù),必須在其聲明和定義中顯式地指定異常過濾器,并在過濾器中列舉該函數(shù)可能拋出的異常。例如:int

Function(INconstchar*pcName)throw(byExp,exception);如果一個(gè)函數(shù)本身及其直接調(diào)用的函數(shù)不會(huì)顯式拋出異常(沒有指定異常過濾器),那么該函數(shù)可以省略異過濾器。特別地:如果一個(gè)函數(shù)內(nèi)部顯式地捕獲了任何可能的異常(例如:使用了"catch(...)"),并且保證不拋出任何異常,那么應(yīng)該在其聲明和定義中顯式地指定一個(gè)空異常過濾器:"throw()"。例如:int

Function(INconstchar*pcName)throw();特別地:進(jìn)程入口函數(shù)("main()")不應(yīng)當(dāng)使用異常過濾器。除了空異常過濾器有時(shí)可幫助編譯器完成一些優(yōu)化以外,異常過濾器的主要作用反倒是為程序員提供函數(shù)出錯(cuò)時(shí)的行為描述。這些信息對(duì)于函數(shù)的使用者來(lái)說(shuō)十分有用。因此,即使僅作為一種文檔性質(zhì)的措施,異常過濾器也應(yīng)當(dāng)被保留下來(lái)。3.2.10代碼段注釋如果函數(shù)體中的代碼較長(zhǎng),應(yīng)該根據(jù)功能不同將其分段。代碼段間以空行分離,并且每段代碼都以代碼段分割注釋作為開始。例如:void

CXXX::Function(INvoid*pmodAddr)

{

if(NULL==pmodAddr)

{

return;

}

{CSessionLockiLock(mxLock);

//=====================================================================

//=判斷指定模塊是不是剛剛被裝入,由于在NT系列平臺(tái)中,“A”系列函數(shù)都是

//=由“W”系列函數(shù)實(shí)現(xiàn)的。所以可能會(huì)有一次LoadLibrary產(chǎn)生多次本函數(shù)調(diào)

//=用的情況。為了增加效率,特設(shè)此靜態(tài)變量判斷上次調(diào)用是否與本次相同。

staticPVOIDpLastLoadedModule=NULL;

if(pLastLoadedModule==pmodAddr)

{

return;

//相同,忽略這次調(diào)用

}

pLastLoadedModule=pmodAddr;

//=====================================================================

//=檢查這個(gè)模塊是否在旁路模塊表中

stringExstModName;

if(!BaiY_IMP::GetModuleNameByAddress(pmodAddr,stModName))

{

return;

}

if(CHookProc::sm_sstByPassModTbl.find(stModName)

!=CHookProc::sm_sstByPassModTbl.end())

{

return;

}

//=====================================================================

//=在這個(gè)模塊中HOOK所有存在于HOOK函數(shù)表中的函數(shù)

PROCTBL::iteratorp=sm_iProcTbl.begin();

for(;p!=sm_iProcTbl.end();++p)

{

p->HookOneModule(pmodAddr);

}

}//SessionLock

}明顯地,如果需要反復(fù)用到一段代碼的話,這段代碼就應(yīng)當(dāng)被抽取成一個(gè)函數(shù)。當(dāng)一個(gè)函數(shù)過長(zhǎng)(超過100行)或代碼的意圖不明確時(shí),為了便于閱讀和理解,也應(yīng)當(dāng)將其中的一些代碼段實(shí)現(xiàn)為單獨(dú)的函數(shù)。特別地,對(duì)由于如加密及性能優(yōu)化等特殊原因無(wú)法提取為一個(gè)單獨(dú)函數(shù)的代碼段,應(yīng)當(dāng)使用特別代碼段注釋顯式分割。當(dāng)然,類似情況應(yīng)當(dāng)盡量使用內(nèi)聯(lián)函數(shù)或編譯器提供的強(qiáng)制性內(nèi)聯(lián)函數(shù)代替。例如:void

CXXX::Function(void)

{

//...

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

//@@獲取首網(wǎng)卡的MAC地址

typedefCTmpHandle<IP_ADAPTER_INFO,FreeDeletor<IP_ADAPTER_INFO>>

THADAPTERINFO;

byteExbtAddr;

THADAPTERINFOthAdapterInfo;

thAdapterInfo=(IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));

ULONGulOutBufLen=sizeof(IP_ADAPTER_INFO);

//MakeaninitialcalltoGetAdaptersInfotoget

//thenecessarysizeintotheulOutBufLenvariable

if(ERROR_SUCCESS!=::GetAdaptersInfo(thAdapterInfo,&ulOutBufLen))

{

thAdapterInfo=(IP_ADAPTER_INFO*)malloc(ulOutBufLen);

}

if(NO_ERROR!=::GetAdaptersInfo(thAdapterInfo,&ulOutBufLen))

{

#ifdefDEBUG

CLog::DebugMsg(byT("licverifier"),byT("failedverifyinglicense"));

#endif

CProcess::Exit(-97);

}

btAddr.assign(thAdapterInfo->Address,thAdapterInfo->AddressLength);

//@@獲取首網(wǎng)卡的MAC地址

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

//...

}3.2.11調(diào)用系統(tǒng)API讓相同的代碼只出現(xiàn)一次所有系統(tǒng)API調(diào)用

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論