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

下載本文檔

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

文檔簡介

文檔軟件設(shè)計規(guī)范制定:審核:批準:文件編號生效日期版本號分發(fā)部門修訂履歷序號版本修訂內(nèi)容修訂人修訂日期會簽與文件發(fā)放:會簽部門會簽人會簽日期簽收部門簽收人簽收日期深圳市德卡科技有限公司文件編號文件版本A1生效日期軟件設(shè)計規(guī)范發(fā)行類別■新增□修訂發(fā)行部門研發(fā)中心目錄HYPERLINK第一章、項目模塊劃分 15HYPERLINK一、模塊劃分 15HYPERLINK二、模塊命名 15HYPERLINK第二章、文件格式 15HYPERLINK一、c文件格式說明: 16HYPERLINK1、文件創(chuàng)建及修改說明區(qū) 16HYPERLINK2、頭文件引用區(qū) 16HYPERLINK3、全局變量定義區(qū) 16HYPERLINK4、驅(qū)動函數(shù)區(qū) 16HYPERLINK5、應(yīng)用函數(shù)區(qū) 17HYPERLINK6、文件結(jié)束說明 17HYPERLINK二、h文件格式說明 17HYPERLINK1、文件創(chuàng)建及修改說明區(qū) 17HYPERLINK2、防重調(diào)用定義 18HYPERLINK3、頭文件引用 18HYPERLINK4、控制接口定義區(qū) 18HYPERLINK5、常量定義區(qū) 19HYPERLINK6、宏調(diào)用定義區(qū) 19HYPERLINK7、類型定義區(qū) 19HYPERLINK8、外部引用變量區(qū) 19HYPERLINK9、外部引用函數(shù)區(qū) 20HYPERLINK10、操作流程說明區(qū) 20HYPERLINK11、文件結(jié)束說明 20HYPERLINK第三章、命名規(guī)則 21HYPERLINK一、函數(shù)命名規(guī)則 21HYPERLINK二、變量命名規(guī)則 21HYPERLINK三、宏命名規(guī)則 22HYPERLINK四、文件命名規(guī)則 22HYPERLINK五、新定義變量類型命名規(guī)則 22HYPERLINK六、命名注意事項: 22HYPERLINK1、標識符命名基本原則 23HYPERLINK2、命名中若使用特殊約定或縮寫,則要有注釋說明 23HYPERLINK3、局部循環(huán)變量也必須按照變量命名規(guī)則來定義 23HYPERLINK4、不要用數(shù)字或較奇怪的字符來定義標識符 23HYPERLINK5、用正確的反義詞組命名具有互斥意義的變量或相反動作的函數(shù)等 23HYPERLINK6、避免使用以下劃線開始和結(jié)尾的定義 23HYPERLINK7、程序中不要出現(xiàn)僅靠大小寫區(qū)分的相似的標識符 23HYPERLINK8、標識符縮寫 24HYPERLINK9、函數(shù)名應(yīng)準確描述函數(shù)的功能 24HYPERLINK10、避免使用無意義或含義不清的動詞為函數(shù)命名 24HYPERLINK第四章、代碼書寫規(guī)范 24HYPERLINK一、基本原則 24HYPERLINK二、排版 24HYPERLINK1、縮進風格 24HYPERLINK2、不要使用【TAB】鍵 24HYPERLINK3、空行 24HYPERLINK4、語句長度要小于80個字符 25HYPERLINK5、長語句換行 25HYPERLINK6、長表達式換行 26HYPERLINK7、若函數(shù)的參數(shù)較長,則要進行適當?shù)膭澐?26HYPERLINK8、一行只寫一條語句 26HYPERLINK9、括號{} 27HYPERLINK10、語句縮進要求 27HYPERLINK11、分界符 28HYPERLINK12、空格 29HYPERLINK三、注釋 30HYPERLINK1、注釋量 30HYPERLINK2、函數(shù)頭部注釋 30HYPERLINK3、代碼與注釋同時修改 31HYPERLINK4、注釋的內(nèi)容要清楚、明了,含義準確,防止注釋二義性 31HYPERLINK5、避免在注釋中使用縮寫,特別是非常用縮寫 31HYPERLINK6、注釋書寫位置 31HYPERLINK7、變量、常量命名不能充分自注釋的,必須加以注釋 32HYPERLINK8、數(shù)據(jù)結(jié)構(gòu)命名不能充分自注釋的,必須加以注釋 32HYPERLINK9、全局變量注釋 32HYPERLINK10、注釋要與說描述的內(nèi)容進行同樣的縮排 32HYPERLINK11、將注釋與其上面的代碼用空行隔開 33HYPERLINK12、連續(xù)case語句處理時,必須編寫注釋 34HYPERLINK13、代碼或表達式的中間禁止插入注釋 36HYPERLINK14、通過正確命名使代碼成為自注釋的 36HYPERLINK15、在代碼的功能、意圖層次上進行注釋,提供有用、額外的信息 36HYPERLINK16、在程序塊的結(jié)束行右方加注釋標記,以表明某程序塊的結(jié)束 36HYPERLINK17、注釋格式 37HYPERLINK18、采用中文注釋 37HYPERLINK19、使用#if0和#endif注釋代碼塊 37HYPERLINK20、注釋不能嵌套 37HYPERLINK四、代碼可讀性 37HYPERLINK1、使用小括號明確表達式的操作順序 37HYPERLINK2、用有意義的枚舉和宏替代數(shù)字 38HYPERLINK3、源程序中關(guān)系較為緊密的代碼應(yīng)盡可能相鄰 39HYPERLINK4、用多行簡單語句替代復(fù)雜語句 39HYPERLINK五、變量,結(jié)構(gòu) 40HYPERLINK1、公共變量 40HYPERLINK1.1、去掉沒必要的公共變量 40HYPERLINK1.2、仔細定義并明確公共變量的含義、作用、取值范圍及公共變量間的關(guān)系 40HYPERLINK1.3、明確公共變量與操作此公共變量的函數(shù)或過程的關(guān)系 40HYPERLINK1.4、要謹慎向公共變量傳遞數(shù)據(jù) 40HYPERLINK1.5、防止局部變量與公共變量同名。 40HYPERLINK1.6、公共變量僅由模塊或函數(shù)創(chuàng)建和修改,其余模塊和函數(shù)只能訪問 40HYPERLINK2、局部變量 41HYPERLINK2.1、嚴禁使用未經(jīng)初始化的變量作為右值 41HYPERLINK2.2、不使用與硬件或軟件環(huán)境關(guān)系密切的變量 41HYPERLINK2.3、變量聲明時,同一類型,不同意義的多個變量,要分行,便于區(qū)分 41HYPERLINK2.4、對只設(shè)置一次的變量,宜使用“const”限定詞進行聲明 41HYPERLINK2.5、避免在函數(shù)中使用static局部變量 41HYPERLINK3、數(shù)組 41HYPERLINK3.1、數(shù)組大小及初始值要明確定義 41HYPERLINK3.2、數(shù)組、結(jié)構(gòu)和聯(lián)合的初始化列表應(yīng)顯式描述 41HYPERLINK4、結(jié)構(gòu)、聯(lián)合 42HYPERLINK4.1、結(jié)構(gòu)的功能要單一,是針對一種事務(wù)的抽象 42HYPERLINK4.2、不要設(shè)計面面俱到、非常靈活的數(shù)據(jù)結(jié)構(gòu) 43HYPERLINK4.3、不同結(jié)構(gòu)間的關(guān)系不要過于復(fù)雜 43HYPERLINK4.4、結(jié)構(gòu)中元素的個數(shù)應(yīng)適中 44HYPERLINK4.5、結(jié)構(gòu)體中元素的布局 44HYPERLINK4.6、結(jié)構(gòu)體設(shè)計要考慮兼容性 45HYPERLINK4.7、跨平臺數(shù)據(jù)結(jié)構(gòu),要考慮字節(jié)順序及對齊問題 45HYPERLINK4.8、struct或union類型中至少應(yīng)有一個成員 46HYPERLINK4.9、struct或union類型的成員類型 46HYPERLINK5、枚舉 47HYPERLINK5.1、枚舉元素的初始化應(yīng)完整 47HYPERLINK6、自定義數(shù)據(jù)類型 47HYPERLINK6.1、合理地設(shè)計數(shù)據(jù)并使用自定義數(shù)據(jù)類型 47HYPERLINK6.2、自定義數(shù)據(jù)類型命名要恰當 47HYPERLINK7、類型轉(zhuǎn)換 47HYPERLINK7.1、謹慎使用數(shù)據(jù)類型的強制轉(zhuǎn)換 47HYPERLINK7.2、了解編譯系統(tǒng)默認的數(shù)據(jù)類型轉(zhuǎn)換 47HYPERLINK7.3、應(yīng)禁止signed類型與unsigned類型之間的隱式轉(zhuǎn)化 48HYPERLINK7.4、應(yīng)禁止int類型與float類型的隱式轉(zhuǎn)化 48HYPERLINK8、指針 48HYPERLINK8.1、不應(yīng)對指針變量使用強制類型轉(zhuǎn)換賦值 48HYPERLINK8.2、不應(yīng)把自動類型的局部變量的地址賦值給外部指針 48HYPERLINK8.3、指針的指針不應(yīng)超過兩級 48HYPERLINK8.4、指向不同數(shù)據(jù)類型的指針之間不應(yīng)相互轉(zhuǎn)換 48HYPERLINK8.5、指針轉(zhuǎn)換過程中不應(yīng)丟失指針的const、volatile屬性 48HYPERLINK8.6、只有指向數(shù)組的指針才允許進行算術(shù)運算 48HYPERLINK8.7、只有指向同一數(shù)組的兩個指針才允許相減 49HYPERLINK8.8、只有指向同一數(shù)組的兩個指針才允許用>、>=、<和<=等關(guān)系運算符進行比較 49HYPERLINK8.9、指針的索引值不應(yīng)為負 50HYPERLINK8.10、不應(yīng)對指針值可能為NULL的指針進行算術(shù)運算 50HYPERLINK8.11、調(diào)用返回類型為指針的函數(shù)后,應(yīng)進行是否為空的判斷 50HYPERLINK8.12、局部變量的地址不應(yīng)在本對象消亡后傳給另外一個對象 50HYPERLINK8.13、一個未知大小的對象的指針不應(yīng)成為加法或者減法操作的左操作數(shù) 51HYPERLINK六、函數(shù) 51HYPERLINK1、函數(shù)編寫原則 51HYPERLINK1.1、明確函數(shù)功能,精確(而不是近似)地實現(xiàn)函數(shù)設(shè)計 51HYPERLINK1.2、函數(shù)的規(guī)模盡量限制在200行以內(nèi) 51HYPERLINK1.3、一個函數(shù)僅完成一件功能 51HYPERLINK1.4、為簡單功能編寫函數(shù) 51HYPERLINK1.5、不要設(shè)計多用途面面俱到的函數(shù) 52HYPERLINK1.6、函數(shù)功能具有可預(yù)測性 52HYPERLINK1.7、函數(shù)功能具有獨立性 52HYPERLINK1.8、防止函數(shù)出現(xiàn)隨機內(nèi)聚 53HYPERLINK1.9、功能不明確的較小函數(shù),可以不必存在 54HYPERLINK1.10、設(shè)計高扇入、合理扇出(小于7)的函數(shù) 54HYPERLINK1.11、減少函數(shù)本身或函數(shù)間的遞歸調(diào)用 54HYPERLINK1.12、降低函數(shù)間的耦合度 54HYPERLINK2、函數(shù)參數(shù) 55HYPERLINK2.1、明確接口函數(shù)參數(shù)的合法性檢查者 55HYPERLINK2.2、防止將函數(shù)的參數(shù)作為工作變量 55HYPERLINK2.3、避免設(shè)計多參數(shù)函數(shù),不使用的參數(shù)從接口中去掉 56HYPERLINK2.4、非調(diào)度函數(shù)應(yīng)減少或防止控制參數(shù),盡量只使用數(shù)據(jù)參數(shù) 56HYPERLINK2.5、檢查函數(shù)所有參數(shù)輸入的有效性 57HYPERLINK2.6、檢查函數(shù)所有非參數(shù)輸入的有效性,如數(shù)據(jù)文件、公共變量等 57HYPERLINK2.7、調(diào)用函數(shù)時參數(shù)類型要一致 57HYPERLINK2.8、避免使用BOOL參數(shù) 57HYPERLINK2.9、在函數(shù)參數(shù)中不應(yīng)使用static存儲類標識符 57HYPERLINK2.10、函數(shù)參數(shù)數(shù)量 57HYPERLINK2.11、宜避免函數(shù)參數(shù)在調(diào)用中未被使用 57HYPERLINK3、函數(shù)返回 58HYPERLINK3.1、對所調(diào)用函數(shù)的錯誤返回碼要仔細、全面地處理 58HYPERLINK3.2、函數(shù)的返回值要清楚、明了,讓使用者不容易忽視錯誤情況 58HYPERLINK3.3、函數(shù)返回值要與賦值變量類型一致 58HYPERLINK3.4、對于提供了返回值的函數(shù),在引用時最好使用其返回值 58HYPERLINK3.5、函數(shù)只有一個出口 58HYPERLINK4、可重入函數(shù) 58HYPERLINK4.1、可重入函數(shù)使用局部變量 58HYPERLINK4.2、可重入函數(shù)使用全局變量 58HYPERLINK5、函數(shù)模塊劃分 59HYPERLINK5.1、仔細分析模塊的功能,進行函數(shù)的劃分和組織 59HYPERLINK5.2、如果多段代碼重復(fù)做同一件事情,那么在函數(shù)的劃分上可能存在問題 59HYPERLINK5.3、函數(shù)內(nèi)部的代碼結(jié)構(gòu)順序 59HYPERLINK6、循環(huán)語句 60HYPERLINK6.1、循環(huán)控制變量的類型應(yīng)為整型 60HYPERLINK6.2、循環(huán)控制變量應(yīng)為局部變量 61HYPERLINK6.3、for循環(huán)控制語句中的3個表達式只應(yīng)和循環(huán)控制相關(guān) 61HYPERLINK6.4、for循環(huán)不宜只執(zhí)行一次 61HYPERLINK7、判斷語句 61HYPERLINK7.1、不要輕易用條件分支去替換邏輯表達式 61HYPERLINK7.2、switch語句中不應(yīng)只包含default語句 61HYPERLINK7.3、所有非空的switchcase子句都應(yīng)以break語句結(jié)束 61HYPERLINK7.4、switch控制表達式不應(yīng)是一個常量或邏輯表達式 61HYPERLINK7.5、每一個switch語句都應(yīng)至少有一個case子句 61HYPERLINK7.6、case表達式的類型應(yīng)與switch控制表達式的類型一致 61HYPERLINK7.7、case表達式的大小不應(yīng)超過switch控制表達式的大小 61HYPERLINK8、賦值語句 62HYPERLINK8.1、盡量不使用條件賦值語句 62HYPERLINK9、其他注意事項 62HYPERLINK9.1、避免函數(shù)中不必要語句,防止程序中的垃圾代碼 62HYPERLINK9.2、在多任務(wù)操作系統(tǒng)的環(huán)境下編程,更要注意函數(shù)可重入性的構(gòu)造 62HYPERLINK9.3、將常用較長變量用宏替代 62HYPERLINK七、預(yù)處理 62HYPERLINK1、宏 62HYPERLINK1.1、用宏定義表達式時,要使用完備的括號 62HYPERLINK1.2、將宏所定義的多條表達式放在大括號中 63HYPERLINK1.3、使用宏時,不允許參數(shù)發(fā)生變化 63HYPERLINK1.4、函數(shù)類宏調(diào)用時參數(shù)要完整 64HYPERLINK2、條件編譯 64HYPERLINK2.1、預(yù)處理語句“#if”和“#endif”不應(yīng)分散在不同的文件之中 64HYPERLINK2.2、被包含文件中的“#else”、“#elseif”、“#endif”不應(yīng)與父文件中的“#if”匹配 64HYPERLINK2.3、“#if”表達式中使用的宏應(yīng)該已經(jīng)被定義,并且“#if”表達式只能包含整型常量 64HYPERLINK2.4、宏如果需要被重定義,應(yīng)該先用“#undef”解除前面的定義 64HYPERLINK八、中斷 64HYPERLINK1、中斷服務(wù)程序不應(yīng)有返回值 64HYPERLINK2、中斷服務(wù)程序中不應(yīng)使用printf()函數(shù) 64HYPERLINK3、對于中斷中使用到的非局部變量,在中斷處理函數(shù)中應(yīng)對其進行入棧保護 64HYPERLINK4、調(diào)用中斷處理程序中的變量要進行開關(guān)中斷處理 64HYPERLINK5、對于開關(guān)中斷,要注意成對匹配 64HYPERLINK6、中斷服務(wù)程序代碼要簡單化 65HYPERLINK九、程序可測性 65HYPERLINK1、原則 65HYPERLINK1.1、統(tǒng)一的調(diào)測開關(guān)及打印函數(shù) 65HYPERLINK1.2、統(tǒng)一的打印信息串格式 65HYPERLINK1.3、正式軟件產(chǎn)品中應(yīng)把斷言及其它調(diào)測代碼去掉(即把有關(guān)的調(diào)測開關(guān)關(guān)掉) 65HYPERLINK1.4、用調(diào)測開關(guān)切換軟件的DEBUG版和正式版 65HYPERLINK1.5、軟件DEBUG版和發(fā)行版在實現(xiàn)功能上具有一致性 65HYPERLINK1.6、構(gòu)造測試環(huán)境和測試用例 65HYPERLINK1.7、預(yù)先設(shè)計程序調(diào)測的方法和手段及各種調(diào)測開關(guān) 65HYPERLINK1.8、調(diào)測開關(guān)應(yīng)分為不同級別和類型 66HYPERLINK2、斷言 66HYPERLINK2.1、使用斷言來發(fā)現(xiàn)軟件問題,提高代碼可測性 66HYPERLINK2.2、用斷言來檢查程序正常運行時不應(yīng)發(fā)生但在調(diào)測時有可能發(fā)生的非法情況 67HYPERLINK2.3、不能用斷言來檢查最終產(chǎn)品肯定會出現(xiàn)且必須處理的錯誤情況 67HYPERLINK2.4、對較復(fù)雜的斷言加上明確的注釋 67HYPERLINK2.5、用斷言確認函數(shù)的參數(shù) 67HYPERLINK2.6、用斷言保證沒有定義的特性或功能不被使用 67HYPERLINK2.7、用斷言對程序開發(fā)環(huán)境(OS/Compiler/Hardware)的假設(shè)進行檢查 68HYPERLINK2.8、編寫防錯程序,然后在處理錯誤之后可用斷言宣布發(fā)生錯誤 68HYPERLINK十、程序效率 69HYPERLINK1、原則 69HYPERLINK1.1、編程時要經(jīng)常注意代碼的效率 69HYPERLINK1.2、提高代碼效率的前提 69HYPERLINK1.3、局部效率應(yīng)為全局效率服務(wù) 69HYPERLINK1.4、合理劃分模塊函數(shù) 69HYPERLINK1.5、不應(yīng)花過多的時間拼命地提高調(diào)用不很頻繁的函數(shù)代碼效率 70HYPERLINK1.6、不要一味追求緊湊的代碼 70HYPERLINK1.7、不應(yīng)存在執(zhí)行不到的代碼 70HYPERLINK1.8、去掉沒必要的全局變量 70HYPERLINK2、方法 70HYPERLINK2.1、解決軟件空間效率1 70HYPERLINK2.2、解決軟件空間效率2 71HYPERLINK2.3、循環(huán)體內(nèi)工作量最小化 71HYPERLINK2.4、仔細分析有關(guān)算法,并進行優(yōu)化 72HYPERLINK2.5、仔細考查、分析系統(tǒng)及模塊處理輸入(如事務(wù)、消息等)的方式,并加以改進 72HYPERLINK2.6、直接用匯編編寫調(diào)用頻繁或性能要求極高的函數(shù) 72HYPERLINK2.7、在多重循環(huán)中,應(yīng)將最忙的循環(huán)放在最內(nèi)層 72HYPERLINK2.8、盡量減少循環(huán)嵌套層次 73HYPERLINK2.9、盡量不在循環(huán)體內(nèi)放置判斷語句 73HYPERLINK2.10、盡量用乘法或其它方法代替除法,特別是浮點運算中的除法 74HYPERLINK2.11、應(yīng)注意switch-case語句的使用 74HYPERLINK十一、程序質(zhì)量 74HYPERLINK1、原則 74HYPERLINK1.1、代碼質(zhì)量保證優(yōu)先原則 74HYPERLINK1.2、合理劃分子模塊,提高可移植性和可重用性 75HYPERLINK1.3、提供良好的接口界面 75HYPERLINK1.4、系統(tǒng)具有一定容錯能力 75HYPERLINK2、方法 75HYPERLINK2.1、認真處理程序所能遇到的各種出錯情況 75HYPERLINK2.2、系統(tǒng)運行之初,要初始化有關(guān)變量及運行環(huán)境,防止未經(jīng)初始化的變量被引用 75HYPERLINK2.3、系統(tǒng)運行之初,要對加載到系統(tǒng)中的數(shù)據(jù)進行一致性檢查 75HYPERLINK2.4、嚴禁隨意更改其它模塊或系統(tǒng)的有關(guān)設(shè)置和配置 75HYPERLINK2.5、不能隨意改變與其它模塊的接口 75HYPERLINK2.6、防止內(nèi)存操作越界 75HYPERLINK2.7、編程時,要防止差1錯誤 76HYPERLINK2.8、要時刻注意易混淆的操作符 76HYPERLINK2.9、條件判斷語句必須處理所有情況 76HYPERLINK2.10、不要用goto語句 77HYPERLINK2.11、盡量都采用標準語句和標準庫函數(shù) 77HYPERLINK2.12、避免使用嵌入式匯編 77HYPERLINK2.13、精心構(gòu)造算法,并對其性能、效率進行測試 77HYPERLINK2.14、對較關(guān)鍵的算法最好使用其它算法來確認 77HYPERLINK2.15、時刻注意表達式是否會上溢、下溢 77HYPERLINK2.16、使用變量時要注意其邊界值的情況 77HYPERLINK2.17、注意程序代碼是否超過系統(tǒng)有關(guān)限制 78HYPERLINK2.18、循環(huán)、分支層次不要超過五層 78HYPERLINK2.19、不要比較浮點數(shù)的相等 78HYPERLINK2.20、關(guān)注共用體的存儲、對齊模式 78HYPERLINK2.21、頭文件中不應(yīng)有對象或函數(shù)的定義 78HYPERLINK2.22、不應(yīng)單獨使用小寫字母“l(fā)”或大寫字母“O”作為變量名 78HYPERLINK2.23、函數(shù)聲明時參數(shù)不應(yīng)只有類型名沒有標識符 78HYPERLINK2.24、不應(yīng)對有符號數(shù)進行位運算 78HYPERLINK2.25、無格式的字符型不應(yīng)與負數(shù)常量和零比較 78HYPERLINK2.26、無符號值不應(yīng)與負數(shù)常量比較 79HYPERLINK2.27、對變量進行移位操作應(yīng)保證不會產(chǎn)生溢出和數(shù)據(jù)截短 79HYPERLINK2.28、不應(yīng)在布爾表達式中使用賦值操作符 79HYPERLINK2.29、不應(yīng)對布爾表達式進行算術(shù)或者位運算 79HYPERLINK2.30、表達式的值在任何求值順序下應(yīng)保持一致 79HYPERLINK2.31、應(yīng)避免除數(shù)可能為0的情況出現(xiàn) 79HYPERLINK2.32、賦值運算符的左操作數(shù)不應(yīng)進行轉(zhuǎn)換操作,并且應(yīng)該是一個可更改的對象 79HYPERLINK2.33、sizeof操作符不應(yīng)用在有單邊作用的表達式上 79HYPERLINK2.34、留心具體語言及編譯器處理不同數(shù)據(jù)類型的原則及有關(guān)細節(jié) 80HYPERLINK十二、代碼代碼編輯、編譯、審查 80HYPERLINK1、打開編譯器的所有告警開關(guān)對程序進行編譯 80HYPERLINK2、在產(chǎn)品軟件(項目組)中,要統(tǒng)一編譯開關(guān)選項 80HYPERLINK3、通過代碼走讀及審查方式對代碼進行檢查 80HYPERLINK4、測試部測試產(chǎn)品之前,應(yīng)對代碼進行抽查及評審 80HYPERLINK5、養(yǎng)成隨時保存編寫代碼的習慣 80HYPERLINK6、同產(chǎn)品軟件(項目組)內(nèi),最好使用相同的編輯器,并使用相同的設(shè)置選項 80HYPERLINK7、要小心地使用編輯器提供的塊拷貝功能編程 80HYPERLINK8、合理地設(shè)計軟件系統(tǒng)目錄,方便開發(fā)人員使用 80HYPERLINK附錄A常用數(shù)據(jù)類型及簡寫 81HYPERLINK附錄B常用單詞及縮寫 82HYPERLINK附錄C常見反義詞組 84HYPERLINK附錄D常見命名規(guī)則 86HYPERLINK一、匈牙利命名法 86HYPERLINK二、駱駝(Camel)命名法 86HYPERLINK三、帕斯卡(Pascal)命名法 86四、下劃線命名法 86第一章、項目模塊劃分一、模塊劃分將整個項目按照功能進行模塊劃分,各個模塊相互獨立,每個模塊由一系列c文件和h文件組成。簡單功能的模塊采用一個c文件和h文件接口,復(fù)雜功能的模塊可能需要多個c文件和h文件。二、模塊命名按照模塊所實現(xiàn)功能的英文名稱或者簡寫命名,全部采用小寫字母,多于1個單詞的中間加下劃線。例如:模塊命名說明液晶lcd.clcd.h液晶初始化,字符、漢字和圖片顯示lcd_fonts.clcd_fonts.h液晶自定義字庫按鍵key.ckey.h按鍵初始化,鍵值列表,取按鍵值指示燈led.cled.h指示燈初始化,閃爍控制數(shù)碼管ledseg.cledseg.h數(shù)碼管初始化,數(shù)字顯示,特殊字符顯示蜂鳴器beep.cbeep.h蜂鳴器初始化,鳴叫控制第二章、文件格式一、c文件格式說明:1、文件創(chuàng)建及修改說明區(qū)主要包含:公司信息:公司名稱、公司網(wǎng)站。創(chuàng)建信息:創(chuàng)建者名稱,創(chuàng)建日期,最初版本號,文檔內(nèi)容描述。修改信息:修改者名稱,修改日期,修改后版本號,修改內(nèi)容描述。可參考模塊《template.c》說明:與硬件相關(guān)的文件可以在此增加說明,如芯片型號等。2、頭文件引用區(qū)主要包含:系統(tǒng)頭文件引用:文件名包含在尖括號中。自定義頭文件引用:文件名包含著雙引號中??蓞⒖寄K《template.c》3、全局變量定義區(qū)主要包含:全局變量定義區(qū)說明注釋行:全局變量定義:要賦初值。全局變量注釋:可參考模塊《template.c》。4、驅(qū)動函數(shù)區(qū)主要包含:驅(qū)動函數(shù)區(qū)說明注釋行:函數(shù)說明:包含函數(shù)說明,參數(shù)說明,返回值說明。函數(shù)體:可參考模塊《template.c》5、應(yīng)用函數(shù)區(qū)主要包含:應(yīng)用函數(shù)區(qū)說明注釋行:函數(shù)說明:包含函數(shù)功能說明,參數(shù)說明,返回值說明。函數(shù)體:可參考模塊《template.c》6、文件結(jié)束說明主要包含:文件結(jié)束說明:EndOfFile可參考模塊《template.c》二、h文件格式說明1、文件創(chuàng)建及修改說明區(qū)主要包含:公司信息:公司名稱、公司網(wǎng)站。創(chuàng)建信息:創(chuàng)建者名稱,創(chuàng)建日期,最初版本號,文檔內(nèi)容描述。修改信息:修改者名稱,修改日期,修改后版本號,修改內(nèi)容描述??蓞⒖寄K《template.h》2、防重調(diào)用定義命名規(guī)則:下劃線+文件名大寫+下劃線+文件類型H+下劃線可參考模塊《template.h》3、頭文件引用主要包含:系統(tǒng)頭文件引用:文件名包含在尖括號中。自定義頭文件引用:文件名包含著雙引號中??蓞⒖寄K《template.h》4、控制接口定義區(qū)主要包含:控制口線定義區(qū)說明注釋行:接口定義:全部采用大寫字母,單詞間以下劃線分割注釋說明:可參考模塊《template.h》5、常量定義區(qū)主要包含:常量定義區(qū)說明注釋行:常量定義:全部采用大寫字母,單詞間以下劃線分割注釋說明:可參考模塊《template.h》6、宏調(diào)用定義區(qū)主要包含:宏調(diào)用定義區(qū)說明注釋行:宏調(diào)用處理:注釋說明:可參考模塊《template.h》7、類型定義區(qū)主要包含:類型定義區(qū)說明注釋行:類型定義:注釋說明:結(jié)構(gòu)體成員要單獨說明??蓞⒖寄K《template.h》8、外部引用變量區(qū)主要包含:外部應(yīng)用變量區(qū)說明注釋行:引用變量聲明:以extern關(guān)鍵字開始注釋說明:可參考模塊《template.h》9、外部引用函數(shù)區(qū)主要包含:外部應(yīng)用函數(shù)區(qū)說明注釋行:函數(shù)注釋說明:包含函數(shù)功能說明,參數(shù)說明,返回值說明引用函數(shù)聲明:以extern關(guān)鍵字開始可參考模塊《template.h》10、操作流程說明區(qū)主要包含:操作流程說明區(qū)說明注釋行:模塊執(zhí)行流程說明:說明要詳細,執(zhí)行步驟要明確??蓞⒖寄K《template.h》11、文件結(jié)束說明主要包含:文件結(jié)束說明:EndOfFile可參考模塊《template.h》第三章、命名規(guī)則一、函數(shù)命名規(guī)則格式如下:序號說明字體選擇備注1模塊名稱大寫必選以最直觀模式給用戶區(qū)分不同的模塊函數(shù),采用模塊英文名稱或者簡寫2下劃線必選間隔符3函數(shù)動作首字母大寫必選動作英文名稱或者簡寫,最多2個單詞4函數(shù)對象首字母大寫可選對象英文名稱或者簡寫,最多2個單詞5函數(shù)范圍首字母大寫可選范圍英文名稱或者簡寫,最多2個單詞例如:LCD_DispWord,表示液晶模塊顯示漢字函數(shù)命名的一個重要原則是望文知意(其他人看到函數(shù)名就大體知道函數(shù)功能),必須考慮命名的準確性,命名體現(xiàn)函數(shù)的功能,而不要體現(xiàn)函數(shù)的實現(xiàn)方法。二、變量命名規(guī)則局部變量命名:格式如下:序號說明字體選擇備注1變量類型簡寫小寫必選以最直觀模式給用戶區(qū)分不同的變量類型,最多2個字母長度,具體參考《附錄A常用變量類型及簡寫》2變量修飾首字母大寫可選修飾詞英文名稱或者簡寫,最多2個單詞3變量名稱首字母大寫必選名稱英文名稱或者簡寫,最多2個單詞例如:ucharucCurrentValue;表示無符號類型,當前值數(shù)組變量命名時在局部變量類型前增加前綴字母“a”。例如:ucharaucSendBuff[10];指針變量命名時在局部變量類型前增加前綴字母“p”。例如:uchar*pucReceiveBuff[10];全局變量命名時在局部變量類型前增加前綴字母“g”和下劃線。靜態(tài)變量命名時在局部變量類型前增加前綴字母“s”和下劃線。三、宏命名規(guī)則格式如下:序號說明字體選擇備注1模塊名稱大寫必選以最直觀模式給用戶區(qū)分不同的模塊宏,采用模塊英文名稱或者簡寫2下劃線必選間隔符3功能名稱大寫必選功能英文名稱或者簡寫,最多2個單詞4下劃線可選間隔符5修飾詞大寫可選修飾詞英文名稱或者簡寫,最多2個單詞例如:#defineTMP_BUFF_MAX 256 //緩沖區(qū)最大長度四、文件命名規(guī)則格式如下(全部小寫):序號說明字體選擇備注1模塊名稱小寫必選采用模塊英文名稱或者簡寫2下劃線可選_3分類名稱小寫可選分類英文名稱或者簡寫4頓號必選.5文件類型小寫必選代碼文件(c),頭文件(h)例如:液晶模塊:lcd_driver.clcd_driver.hlcd_fonts.clcd_fonts.h按鍵模塊:key.ckey.h五、新定義變量類型命名規(guī)則新定義變量類型對變量進行命名時可以提出2個與其他類型不相同的字母前綴來表示,并在文件開始或者新類型定義時進行說明。六、命名注意事項:1、標識符命名基本原則標識符的命名要清晰、明了,有明確含義,同時使用完整的單詞或大家基本可以理解的縮寫,避免使人產(chǎn)生誤解。盡量采用英文命名,不可以用漢語拼音。標識符的長度應(yīng)當符合“min-length&&max-information”原則。說明:較短的單詞可通過去掉“元音”形成縮寫;較長的單詞可取單詞的頭幾個字母形成縮寫;一些單詞有大家公認的縮寫。參考《附錄B常用單詞及縮寫》2、命名中若使用特殊約定或縮寫,則要有注釋說明說明:應(yīng)該在源文件的開始之處,對文件中所使用的縮寫或約定,特別是特殊的縮寫,進行必要的注釋說明。3、局部循環(huán)變量也必須按照變量命名規(guī)則來定義說明:變量,尤其是局部變量,如果用單個字符表示,很容易敲錯(如i寫成j),而編譯時又檢查不出來,有可能為了這個小小的錯誤而花費大量的查錯時間。4、不要用數(shù)字或較奇怪的字符來定義標識符示例:如下命名,使人產(chǎn)生疑惑。#defineEXAMPLE_0_TEST#defineEXAMPLE_1_TESTvoidTMP_SetSls00(ucharucSls);應(yīng)改為有意義的單詞命名#defineEXAMPLE_UNIT_TEST#defineEXAMPLE_ASSERT_TESTvoidTMP_SetUdtMsgSls(ucharucSls);5、用正確的反義詞組命名具有互斥意義的變量或相反動作的函數(shù)等說明:可參考《附錄C常見反義詞組》下面是一些在軟件中常用的反義詞組。示例:uintuiMinSum;uintuiMaxSum;uintTMP_AddUser(uchar*pucUserName);uintTMP_DeleteUser(uchar*pucUserName);6、避免使用以下劃線開始和結(jié)尾的定義除了編譯開關(guān)/頭文件等特殊應(yīng)用,應(yīng)避免使用_EXAMPLE_TEST_之類以下劃線開始和結(jié)尾的定義7、程序中不要出現(xiàn)僅靠大小寫區(qū)分的相似的標識符例如:uintuix,uiX;//變量x與X容易混淆voidTMP_foo(uintuiX);//函數(shù)foo與FOO容易混淆voidTMP_FOO(floatfX);8、標識符縮寫命名時盡量不使用單詞縮寫,如果單詞太長必須縮寫,應(yīng)該省略其中的元音字母,以便望文知意,如packet_header縮寫為pkt_hdr,而不要縮寫為pack_h。常用單詞縮寫見《附錄B常用單詞及縮寫》9、函數(shù)名應(yīng)準確描述函數(shù)的功能10、避免使用無意義或含義不清的動詞為函數(shù)命名說明:避免用含義不清的動詞如process、handle等為函數(shù)命名,因為這些動詞并沒有說明要具體做什么。第四章、代碼書寫規(guī)范一、基本原則制定規(guī)范的基本目的就是加強代碼的可維護性,也就是說代碼必須易于閱讀,易于理解,易于測試,易于移植。所有的代碼必須采用ANSIC,標準函數(shù)原型必須采用ANSIC標準。保持代碼語句和結(jié)構(gòu)簡單清晰,避免使用復(fù)雜語句。二、排版1、縮進風格程序塊要采用縮進風格編寫,縮進的空格數(shù)為4個。預(yù)處理語句、全局數(shù)據(jù)、函數(shù)原型、標題、附加說明、函數(shù)說明、標號等均頂格書寫。語句塊的“{”“}”配對對齊,并與其前一行對齊。2、不要使用【TAB】鍵 【TAB】鍵在不同編輯器和打印機上因所設(shè)置空格數(shù)目不同而造成程序布局不整齊,從而導致代碼縮排混亂??梢圆捎每崭矜I來替代,4個空格代替一個【TAB】鍵。如果采用SourceInsight軟件,可以設(shè)置按【TAB】鍵后自動用4個空格鍵替代。3、空行相對獨立的程序塊之間、變量說明之后必須加空行。程序文件結(jié)構(gòu)各部分之間空兩行,若不必要也可只空一行,各函數(shù)實現(xiàn)之間一般空兩行示例:如下例子不符合規(guī)范。if((ucCount==1)&&(ucRetCode==1)){if(ucStatus=='1'){*pucErrCode=0;returnEPRONTCENTER;}}if((ucCount==1)&&(ucRetCode==0)){*pucErrCode=EPRONTCENTER;returnEPRONTCENTER;}應(yīng)如下書寫:if((ucCount==1)&&(ucRetCode==1)){if(ucStatus=='1'){*pucErrCode=0;returnEPRONTCENTER;}}if((ucCount==1)&&(ucRetCode==0)){*pucErrCode=EPRONTCENTER;returnEPRONTCENTER;}4、語句長度要小于80個字符一行語句以小于80字符為宜,不要寫得過長。過多的代碼會導致顯示器顯示不足,從而降低代碼閱讀速度,代碼打印時也會導致打印不足5、長語句換行較長的語句(>80字符)要分成多行書寫,長表達式要在低優(yōu)先級操作符處劃分新行,操作符放在新行之首,劃分出的新行要進行適當?shù)目s進,使排版整齊,語句可讀。 示例:stPermCountMsg.ucHead.ucLen=TMP_TO_STAT_PERM_COUNT_LEN+TMP_STAT_SIZE_PER_FRAM*sizeof(ulong);aucTaskTable[ucFrameId*TMP_STAT_TASK_CHECK_NUMBER+ucIndex]=astAtPoi[ucIndex].ucStatus;6、長表達式換行循環(huán)、判斷等語句中若有較長的表達式或語句,則要進行適應(yīng)的劃分,長表達式要在低優(yōu)先級操作符處劃分新行,操作符放在新行之首。劃分出的新行要進行適當?shù)目s進,使排版整齊,語句可讀。示例:if((ucTaskNo<TMP_MAX_TASK_NUMBER)&&(TMP_StatItemValid(ucStatItem))){...//programcode}for(i=0,j=0;(i<astBufferKeyword[ucWordIndex].ucWordLength)&&(j<stNewKeyword.ucWordLength);i++,j++){...//programcode}for(i=0,j=0;(i<usFirstWordLength)&&(j<ucSecondWordLength);i++,j++){...//programcode}7、若函數(shù)的參數(shù)較長,則要進行適當?shù)膭澐?、一行只寫一條語句不允許把多個短語句寫在一行中,即一行只寫一條語句示例:如下例子不符合規(guī)范。stRect.ucLength=0;stRect.ucWidth=0;應(yīng)如下書寫stRect.ucLength=0;stRect.ucWidth=0;9、括號{}if、for、do、while、case、switch、default等語句自占一行,且if、for、do、while等語句的執(zhí)行語句部分無論多少都要加括號{}。左大括號“{”后和右大括號“}”前不可出現(xiàn)代碼,并且與引用他的語句左對齊。示例:如下例子不符合規(guī)范。if(pUserCR==NULL)return;應(yīng)如下書寫:if(pUserCR==NULL){return;}10、語句縮進要求函數(shù)的開始、結(jié)構(gòu)的定義及循環(huán)、判斷等語句中的代碼都要采用縮進風格,case語句下的情況處理語句也要遵從語句縮進要求。預(yù)處理指令不需要縮進,總是從行首開始。即使預(yù)處理指令位于縮進代碼塊中,指令也應(yīng)從行首開始示例:良好風格:預(yù)處理指令均從行首開始if(lopsided_score){#ifDISASTER_PENDING//Correct--StartsatbeginningoflineDropEverything();#ifNOTIFYNotifyClient();#endif#endifBackToNormal();}不良風格:縮進的預(yù)處理指令if(lopsided_score){#ifDISASTER_PENDING//Wrong!The"#if"shouldbeatbeginning//oflineDropEverything();#endif//Wrong!Donotindent"#endif"BackToNormal();}11、分界符程序塊的分界符(如C/C++語言的大括號‘{’和‘}’)應(yīng)各獨占一行并且位于同一列,同時與引用它們的語句左對齊。在函數(shù)體的開始、類的定義、結(jié)構(gòu)的定義、枚舉的定義以及if、for、do、while、switch、case語句中的程序都要采用如上的縮進方式。示例:如下例子不符合規(guī)范。for(...){...//programcode}if(...){...//programcode}voidexample_fun(void){...//programcode}應(yīng)如下書寫。for(...){...//programcode}if(...){...//programcode}voidexample_fun(void){...//programcode}12、空格在兩個以上的關(guān)鍵字、變量、常量進行對等操作時,它們之間的操作符之前、之后或者前后要加空格;進行非對等操作時,如果是關(guān)系密切的操作符(一元操作符,成員操作符,數(shù)組下標)后不應(yīng)加空格。說明:采用這種松散方式編寫代碼的目的是使代碼更加清晰。由于留空格所產(chǎn)生的清晰性是相對的,所以,在已經(jīng)非常清晰的語句中沒有必要再留空格,如果語句已足夠清晰則括號內(nèi)側(cè)(即左括號后面和右括號前面)不需要加空格,多重括號間不必加空格,因為在C/C++語言中括號已經(jīng)是最清晰的標志了。在長語句中,如果需要加的空格非常多,那么應(yīng)該保持整體清晰,而在局部不加空格。給操作符留空格時不要連續(xù)留兩個以上空格。(1)、關(guān)鍵字之后要留空格,以突出關(guān)鍵字。(2)、函數(shù)名之后不要留空格,緊跟左括號‘(’,以與關(guān)鍵字區(qū)別(3)、‘(’向后緊跟,‘)’、‘,’、‘;’向前緊跟,緊跟處不留空格。(4)、‘,’之后要留空格,例如:Function(x,y,z)。(5)、如果‘;’不是一行的結(jié)束符號,其后要留空格例如:for(initialization;condition;update)(6)、賦值操作符、比較操作符、算術(shù)操作符、邏輯操作符、位域操作符,如“=”、“+=”“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后應(yīng)當加一個空格。if(current_time>=MAX_TIME_VALUE)a=b+c;a*=2;a=b^2;(7)、"!"、"~"、"++"、"--"、"&"(地址運算符)等單目操作符前后不加空格。*p='a';//內(nèi)容操作"*"與內(nèi)容之間flag=!isEmpty;//非操作"!"與內(nèi)容之間p=&mem;//地址操作"&"與內(nèi)容之間i++; //"++","--"與內(nèi)容之間(8)、”[]”、"->"、"."前后不加空格。p->id=pid;//"->"指針前后不加空格(9)、指針定義符號*的前面加空格。char*get_string(){char*str;}(10)、對于表達式比較長的for語句和if語句,為了緊湊起見可以適當?shù)厝サ粢恍┛崭窭纾篺or(i=0;i<10;i++)和if((a<=b)&&(c<=d))三、注釋1、注釋量一般情況下,源程序有效注釋量必須在20%以上。說明:注釋的原則是有助于對程序的閱讀理解,注釋不宜太多也不能太少,注釋語言必須準確、易懂、簡潔。 2、函數(shù)頭部注釋每個函數(shù)頭部都應(yīng)該進行注釋,包括函數(shù)實現(xiàn)的功能,參數(shù)說明,返回值等。函數(shù)的頭部注釋要達到調(diào)用無需瀏覽函數(shù),從注釋區(qū)就能夠了解該函數(shù)的全部信息。函數(shù)功能:該函數(shù)實現(xiàn)的具體功能,具有依賴關(guān)系的函數(shù)間在此進行說明。參數(shù):如果參數(shù)值為已知,可以在此詳細列表說明。如果函數(shù)有調(diào)用全局變量,也要在此進行詳細說明。返回:函數(shù)返回值,對不同的返回值要進行詳細說明。3、代碼與注釋同時修改邊寫代碼邊注釋,修改代碼同時修改相應(yīng)的注釋,以保證注釋與代碼的一致性。不再有用的注釋要刪除。4、注釋的內(nèi)容要清楚、明了,含義準確,防止注釋二義性說明:錯誤的注釋不但無益反而有害。5、避免在注釋中使用縮寫,特別是非常用縮寫說明:在使用縮寫時或之前,應(yīng)對縮寫進行必要的說明。6、注釋書寫位置注釋應(yīng)與其描述的代碼相近,對代碼的注釋應(yīng)放在其上方或右方(對單條語句的注釋)相鄰位置,不可放在下面,如放于上方則需與其上面的代碼用空行隔開。示例:如下例子不符合規(guī)范。例1://getreplicatesubsystemindexandnetindicatorucRepssnInd=aucSsnData[ucIndex].ucRepssnIndex;ucRepssnNi=aucSsnData[ucIndex].ucNi;例2:ucRepssnInd=aucSsnData[ucIndex].ucRepssnIndex;ucRepssnNi=aucSsnData[ucIndex].ucNi;//getreplicatesubsystemindexandnetindicator應(yīng)如下書寫//getreplicatesubsystemindexandnetindicatorucRepssnInd=aucSsnData[ucIndex].ucRepssnIndex;ucRepssnNi=aucSsnData[ucIndex].ucNi;7、變量、常量命名不能充分自注釋的,必須加以注釋對于所有有物理含義的變量、常量,如果其命名不是充分自注釋的,在聲明時都必加注釋,說明其物理含義。變量、常量、宏的注釋應(yīng)放在其上方相鄰位置或右方。示例://activestatistictasknumber#defineMAX_ACT_TASK_NUMBER1000#defineMAX_ACT_TASK_NUMBER1000//activestatistictasknumber8、數(shù)據(jù)結(jié)構(gòu)命名不能充分自注釋的,必須加以注釋數(shù)據(jù)結(jié)構(gòu)聲明(包括數(shù)組、結(jié)構(gòu)、類、枚舉等),如果其命名不是充分自注釋的,必須加以注釋。對數(shù)據(jù)結(jié)構(gòu)的注釋應(yīng)放在其上方相鄰位置,不可放在下面;對結(jié)構(gòu)中的每個域的注釋放在此域的右方。示例:可按如下形式說明枚舉/數(shù)據(jù)/聯(lián)合結(jié)構(gòu)。//sccpinterfacewithsccpuserprimitivemessagenameenumSCCP_USER_PRIMITIVE{N_UNITDATA_IND,//sccpnotifysccpuserunitdatacomeN_NOTICE_IND,//sccpnotifyusertheNo.7networkcannot//transmissionthismessageN_UNITDATA_REQ,//sccpuser'sunitdatatransmissionrequest};9、全局變量注釋全局變量要有較詳細的注釋,包括對其功能、取值范圍、以及存取時注意事項等的說明。10、注釋要與說描述的內(nèi)容進行同樣的縮排說明:可使程序排版整齊,并方便注釋的閱讀與理解。示例:如下例子,排版不整齊,閱讀稍感不方便。voidexample_fun(void){//codeonecommentsCodeBlockOne//codetwocommentsCodeBlockTwo}應(yīng)改為如下布局。voidexample_fun(void){//codeonecommentsCodeBlockOne//codetwocommentsCodeBlockTwo}11、將注釋與其上面的代碼用空行隔開示例:如下例子,顯得代碼過于緊湊。//codeonecomments*/programcodeone//codetwocommentsprogramcodetwo應(yīng)如下書寫://codeonecommentsprogramcodeone//codetwocommentsprogramcodetwo12、連續(xù)case語句處理時,必須編寫注釋對于switch語句下的case語句,如果因為特殊情況需要處理完一個case后進入下一個case處理,必須在該case語句處理完、下一個case語句前加上明確的注釋。說明:這樣比較清楚程序編寫者的意圖,有效防止無故遺漏break語句。示例(注意斜體加粗部分):caseCMD_UP:ProcessUp();break;caseCMD_DOWN:ProcessDown();break;caseCMD_FWD:ProcessFwd();if(...){...break;}else{ProcessCFW_B();//nowjumpintocaseCMD_A}caseCMD_A:ProcessA();break;caseCMD_B:ProcessB();break;caseCMD_C:ProcessC(); break;caseCMD_D:ProcessD();break;...13、代碼或表達式的中間禁止插入注釋說明:除非必要,不應(yīng)在代碼或表達中間插入注釋,否則容易使代碼可理解性變差。14、通過正確命名使代碼成為自注釋的通過對函數(shù)或過程、變量、結(jié)構(gòu)等正確的命名以及合理地組織代碼的結(jié)構(gòu),使代碼成為自注釋的。說明:清晰準確的函數(shù)、變量等的命名,可增加代碼可讀性,并減少不必要的注釋15、在代碼的功能、意圖層次上進行注釋,提供有用、額外的信息說明:注釋的目的是解釋代碼的目的、功能和采用的方法,提供代碼以外的信息,幫助讀者理解代碼,防止沒必要的重復(fù)注釋信息。示例:如下注釋意義不大。//ifreceive_flagisTRUEif(receive_flag)而如下的注釋則給出了額外有用的信息。//ifmtpreceiveamessagefromlinksif(receive_flag)16、在程序塊的結(jié)束行右方加注釋標記,以表明某程序塊的結(jié)束說明:當代碼段較長,特別是多重嵌套時,這樣做可以使代碼更清晰,更便于閱讀。示例:參見如下例子。if(...){//programcode while(index<MAX_INDEX){//programcode}/*endofwhile(index<MAX_INDEX)*///指明該條while語句結(jié)束}/*endofif(...)*///指明是哪條if語句結(jié)束17、注釋格式語句、變量定義、宏定義注釋使用“//……”格式語句塊、函數(shù)說明使用“/*……*/”格式。18、采用中文注釋注釋應(yīng)考慮程序易讀及外觀排版的因素,使用的語言若是中、英兼有的,建議多使用中文,除非能用非常流利準確的英文表達。說明:注釋語言不統(tǒng)一,影響程序易讀性和外觀排版,出于對維護人員的考慮,建議使用中文。19、使用#if0和#endif注釋代碼塊使用#if0和#endif注釋代碼塊。例如:來注釋一段較大的代碼#if0#defineDISP_TBL_SIZE5//Sizeofdisplaybuffertable#defineDISP_MAX_X80//Max.numberofcharactersinXaxis#defineDISP_MAX_Y25//Max.numberofcharactersinYaxis#defineDISP_MASK0x5F#endif20、注釋不能嵌套四、代碼可讀性1、使用小括號明確表達式的操作順序注意運算符的優(yōu)先級,并用括號明確表達式的操作順序,避免使用默認優(yōu)先級。說明:防止閱讀程序時產(chǎn)生誤解,防止因默認的優(yōu)先級與設(shè)計思想不符而導致程序出錯。示例:下列語句中的表達式word=(high<<8)|low(1)if((a|b)&&(a&c))(2)if((a|b)<(c&d))(3)如果書寫為high<<8|lowa|b&&a&ca|b<c&d由于high<<8|low=(high<<8)|low,a|b&&a&c=(a|b)&&(a&c),(1)(2)不會出錯,但語句不易理解;a|b<c&d=a|(b<c)&d,(3)造成了判斷條件出錯。2、用有意義的枚舉和宏替代數(shù)字避免使用不易理解的數(shù)字,用有意義的標識來替代。涉及物理狀態(tài)或者含有物理意義的常量,不應(yīng)直接使用數(shù)字,必須用有意義的枚舉或宏來代替。示例:如下的程序可讀性差。if(Trunk[index].trunk_state==0){Trunk[index].trunk_state=1;...//programcode}應(yīng)改為如下形式: #defineTRUNK_IDLE0#defineTRUNK_BUSY1if(Trunk[index].trunk_state==TRUNK_IDLE){Trunk[index].trunk_state=TRUNK_BUSY;...//programcode}3、源程序中關(guān)系較為緊密的代碼應(yīng)盡可能相鄰說明:便于程序閱讀和查找。示例:以下代碼布局不太合理。rect.length=10;char_poi=str;rect.width=5;若按如下形式書寫,可能更清晰一些。rect.length=10;rect.width=5;//矩形的長與寬關(guān)系較密切,放在一起。char_poi=str;4、用多行簡單語句替代復(fù)雜語句不要使用難懂的技巧性很高的語句,除非很有必要時。說明:高技巧語句不等于高效率的程序,實際上程序的效率關(guān)鍵在于算法。示例:如下表達式,考慮不周就可能出問題,也較難理解。*stat_poi+++=1;*++stat_poi+=1;應(yīng)分別改為如下。*stat_poi+=1;stat_poi++;//此二語句功能相當于“*stat_poi+++=1;”++stat_poi;*stat_poi+=1;//此二語句功能相當于“*++stat_poi+=1;五、變量,結(jié)構(gòu) 1、公共變量1.1、去掉沒必要的公共變量說明:公共變量是增大模塊間耦合的原因之一,故應(yīng)減少沒必要的公共變量以降低模塊間的耦合度。1.2、仔細定義并明確公共變量的含義、作用、取值范圍及公共變量間的關(guān)系說明:在對變量聲明的同時,應(yīng)對其含義、作用及取值范圍進行注釋說明,同時若有必要還應(yīng)說明與其它變量的關(guān)系。1.3、明確公共變量與操作此公共變量的函數(shù)或過程的關(guān)系 明確公共變量與操作此公共變量的函數(shù)或過程的關(guān)系,如訪問、修改及創(chuàng)建等。說明:明確過程操作變量的關(guān)系后,將有利于程序的進一步優(yōu)化、單元測試、系統(tǒng)聯(lián)調(diào)以及代碼維護等。這種關(guān)系的說明可在注釋或文檔中描述。示例:在源文件中,可按如下注釋形式說明。RELATIONSystem_InitInput_RecPrint_RecStat_ScoreStudentCreateModifyAccessAccessScoreCreateModifyAccessAccess,Modify注:RELATION為操作關(guān)系;System_Init、Input_Rec、Print_Rec、Stat_Score為四個不同的函數(shù);Student、Score為兩個全局變量;Create表示創(chuàng)建,Modify表示修改,Access表示訪問。其中,函數(shù)Input_Rec、Stat_Score都可修改變量Score,故此變量將引起函數(shù)間較大的耦合,并可能增加代碼測試、維護的難度。1.4、要謹慎向公共變量傳遞數(shù)據(jù)當向公共變量傳遞數(shù)據(jù)時,要十分小心,防止賦與不合理的值或越界等現(xiàn)象發(fā)生。說明:對公共變量賦值時,若有必要應(yīng)進行合法性檢查,以提高代碼的可靠性、穩(wěn)定性。1.5、防止局部變量與公共變量同名。說明:若使用了較好的命名規(guī)則,那么此問題可自動消除。1.6、公共變量僅由模塊或函數(shù)創(chuàng)建和修改,其余模塊和函數(shù)只能訪問構(gòu)造僅有一個模塊或函數(shù)可以修改、創(chuàng)建,而其余有關(guān)模塊或函數(shù)只訪問的公共變量,防止多個不同模塊或函數(shù)都可以修改、創(chuàng)建同一公共變量的現(xiàn)象。說明:降低公共變量耦合度。2、局部變量2.1、嚴禁使用未經(jīng)初始化的變量作為右值說明:特別是在C/C++中引用未經(jīng)賦值的指針,經(jīng)常會引起系統(tǒng)崩潰。2.2、不使用與硬件或軟件環(huán)境關(guān)系密切的變量使用嚴格形式定義的、可移植的數(shù)據(jù)類型,盡量不要使用與具體硬件或軟件環(huán)境關(guān)系密切的變量。說明:使用標準的數(shù)據(jù)類型,有利于程序的移植。2.3、變量聲明時,同一類型,不同意義的多個變量,要分行,便于區(qū)分示例:以下代碼中,i,j,k是臨時循環(huán)變量,與有實際意義的lenth,width放一起不太合理。intlength,width,i,j,k;若按如下形式書寫,可能更清晰一些。intlength,width;inti,j,k;2.4、對只設(shè)置一次的變量,宜使用“const”限定詞進行聲明2.5、避免在函數(shù)中使用static局部變量盡量避免函數(shù)帶有“記憶”功能,相同的輸入應(yīng)當產(chǎn)生相同的輸出。帶有“記憶”功能的函數(shù),其行為可能是不可預(yù)測的,因為它的行為可能取決于某種“記憶狀態(tài)”。這樣的函數(shù)既不易理解又不利于測試和維護。3、數(shù)組3.1、數(shù)組大小及初始值要明確定義數(shù)組初始化不要采用系統(tǒng)默認值,最好能夠采用初始化語句來完成3.2、數(shù)組、結(jié)構(gòu)和聯(lián)合的初始化列表應(yīng)顯式描述數(shù)組、結(jié)構(gòu)和聯(lián)合的初始化列表應(yīng)使用大括號,并使用附加的大括號來指示嵌套的結(jié)構(gòu);程序員應(yīng)顯式地考慮和描述復(fù)雜數(shù)據(jù)類型的所有元素,不應(yīng)忽略某個元素的初始化。例如:錯誤用法int16_ty[3][2]={1,2,3,4,5,6};int16_ty[3][2]={{1,2}};正確用法:int16_ty[3][2]={{1,2},{3,4},{54、結(jié)構(gòu)、聯(lián)合4.1、結(jié)構(gòu)的功能要單一,是針對一種事務(wù)的抽象說明:設(shè)計結(jié)構(gòu)時應(yīng)力爭使結(jié)構(gòu)代表一種現(xiàn)實事務(wù)的抽象,而不是同時代表多種。結(jié)構(gòu)中的各元素應(yīng)代表同一事務(wù)的不同側(cè)面,而不應(yīng)把描述沒有關(guān)系或關(guān)系很弱的不同事務(wù)的元素放到同一結(jié)構(gòu)中。示例:如下結(jié)構(gòu)不太清晰、合理。typedefstructSTUDENT_STRU{unsignedcharaucName[8];//student'snameunsignedcharucAge;//student'sageunsignedcharucSex;//student'ssex,asfollows//0-FEMALE;1-MALEunsignedcharaucTeacherName[8];//thestudentteacher'snameunisgnedcharucTeacherSex;//histeachersex}STUDENT;若改為如下,可能更合理些。typedefstructTEACHER_STRU{unsignedcharaucName[8];//teachernameunisgnedcharucSex;//teachersex,asfollows//0-FEMALE;1-MALE}TEACHER;typedefstructSTUDENT_STRU{unsignedcharaucName[8];//student'snameunsignedcharucAge;//student'sageunsignedcharucSex;//student'ssex,asfollows//0-FEMALE;1-MALEunsignedintucTeacherInd;//histeacherindex}STUDENT;4.2、不要設(shè)計面面俱到、非常靈活的數(shù)據(jù)結(jié)構(gòu)說明:面面俱到、靈活的數(shù)據(jù)結(jié)構(gòu)反而容易引起誤解和操作困難。4.3、不同結(jié)構(gòu)間的關(guān)系不要過于復(fù)雜說明:若兩個結(jié)構(gòu)間關(guān)系較復(fù)雜、密切,那么應(yīng)合為一個結(jié)構(gòu)。示例:如下兩個結(jié)構(gòu)的構(gòu)造不合理。typedefstructPERSON_ONE_STRU{unsignedcharaucName[8];unsignedcharaucAddr[40];unsignedcharucSex;unsignedcharucCity[15];}PERSON_ONE;typedefstructPERSON_TWO_STRU{unsignedcharaucName[8];unsignedcharucAge;unsignedcharucTel;}PERSON_TWO;由于兩個結(jié)構(gòu)都是描述同一事物的,那么不如合成一個結(jié)構(gòu)。typedefstructPERSON_STRU{unsignedcharaucName[8];unsignedcharucAge;unsignedcharucSex;unsignedcharaucAddr[40];unsignedcharaucCity[15];unsignedcharucTel;}PERSON;4.4、結(jié)構(gòu)中元素的個數(shù)應(yīng)適中若結(jié)構(gòu)中元素個數(shù)過多可考慮依據(jù)某種原則把元素組成不同的子結(jié)構(gòu),以減少原結(jié)構(gòu)中元素的個數(shù)。說明:增加結(jié)構(gòu)的可理解性、可操作性和可維護性。示例:假如認為如上的_PERSON結(jié)構(gòu)元素過多,那么可如下對之劃分。typedefstructPERSON_BASE_INFO_STRU{unsignedcharucName[8];unsignedcharucAge;unsignedcharucSex;}PERSON_BASE_INFO;typedefstructPERSON_ADDRESS_STRU{unsignedcharucAddr[40];unsigne

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論