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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論