?? 編程規范與范例(6).txt
字號:
[編程技巧]編程規范與范例(6)
程序匠人 發表于 2005-8-27 20:19:00 閱讀全文(254) | 回復(0) | 引用(0)
編程規范與范例(6)
〖文章轉載或出處〗≡中國電子技術信息網≡ 網址:www.CETINet.com
編程規范與范例(6)
目 錄
1 排版 6
2 注釋 11
3 標識符命名 18
4 可讀性 20
5 變量、結構 22
6 函數、過程 28
7 可測性 36
8 程序效率 40
9 質量保證 44
10 代碼編輯、編譯、審查 50
11 代碼測試、維護 52
12 宏 53
10 代碼編輯、編譯、審查
¹ 10-1:打開編譯器的所有告警開關對程序進行編譯。
¹ 10-2:在產品軟件(項目組)中,要統一編譯開關選項。
¹ 10-3:通過代碼走讀及審查方式對代碼進行檢查。
說明:代碼走讀主要是對程序的編程風格如注釋、命名等以及編程時易出錯的內容進行檢查,可由開發人員自己或開發人員交叉的方式進行;代碼審查主要是對程序實現的功能及程序的穩定性、安全性、可靠性等進行檢查及評審,可通過自審、交叉審核或指定部門抽查等方式進行。
¹ 10-4:測試部測試產品之前,應對代碼進行抽查及評審。
½ 10-1:編寫代碼時要注意隨時保存,并定期備份,防止由于斷電、硬盤損壞等原因造成代碼丟失。
½ 10-2:同產品軟件(項目組)內,最好使用相同的編輯器,并使用相同的設置選項。
說明:同一項目組最好采用相同的智能語言編輯器,如Muiti Editor,Visual Editor等,并設計、使用一套縮進宏及注釋宏等,將縮進等問題交由編輯器處理。
½ 10-3:要小心地使用編輯器提供的塊拷貝功能編程。
說明:當某段代碼與另一段代碼的處理功能相似時,許多開發人員都用編輯器提供的塊拷貝功能來完成這段代碼的編寫。由于程序功能相近,故所使用的變量、采用的表達式等在功能及命名上可能都很相近,所以使用塊拷貝時要注意,除了修改相應的程序外,一定要把使用的每個變量仔細查看一遍,以改成正確的。不應指望編譯器能查出所有這種錯誤,比如當使用的是全局變量時,就有可能使某種錯誤隱藏下來。
½ 10-4:合理地設計軟件系統目錄,方便開發人員使用。
說明:方便、合理的軟件系統目錄,可提高工作效率。目錄構造的原則是方便有關源程序的存儲、查詢、編譯、鏈接等工作,同時目錄中還應具有工作目錄----所有的編譯、鏈接等工作應在此目錄中進行,工具目錄----有關文件編輯器、文件查找等工具可存放在此目錄中。
½ 10-5:某些語句經編譯后產生告警,但如果你認為它是正確的,那么應通過某種手段去掉告警信息。
說明:在Borland C/C++中,可用“#pragma warn”來關掉或打開某些告警。
示例:
#pragma warn -rvl // 關閉告警
int examples_fun( void )
{
// 程序,但無return語句。
}
#pragma warn +rvl // 打開告警
編譯函數examples_fun時本應產生“函數應有返回值”告警,但由于關掉了此告警信息顯示,所以編譯時將不會產生此告警提示。
½ 10-6:使用代碼檢查工具(如C語言用PC-Lint)對源程序檢查。
½ 10-7:使用軟件工具(如 LogiSCOPE)進行代碼審查。
11 代碼測試、維護
¹ 11-1:單元測試要求至少達到語句覆蓋。
¹ 11-2:單元測試開始要跟蹤每一條語句,并觀察數據流及變量的變化。
¹ 11-3:清理、整理或優化后的代碼要經過審查及測試。
¹ 11-4:代碼版本升級要經過嚴格測試。
¹ 11-5:使用工具軟件對代碼版本進行維護。
¹ 11-6:正式版本上軟件的任何修改都應有詳細的文檔記錄。
½ 11-1:發現錯誤立即修改,并且要記錄下來。
½ 11-2:關鍵的代碼在匯編級跟蹤。
½ 11-3:仔細設計并分析測試用例,使測試用例覆蓋盡可能多的情況,以提高測試用例的效率。
½ 11-4:盡可能模擬出程序的各種出錯情況,對出錯處理代碼進行充分的測試。
½ 11-5:仔細測試代碼處理數據、變量的邊界情況。
½ 11-6:保留測試信息,以便分析、總結經驗及進行更充分的測試。
½ 11-7:不應通過“試”來解決問題,應尋找問題的根本原因。
½ 11-8:對自動消失的錯誤進行分析,搞清楚錯誤是如何消失的。
½ 11-9:修改錯誤不僅要治表,更要治本。
½ 11-10:測試時應設法使很少發生的事件經常發生。
½ 11-11:明確模塊或函數處理哪些事件,并使它們經常發生。
½ 11-12: 堅持在編碼階段就對代碼進行徹底的單元測試,不要等以后的測試工作來發現問題。
½ 11-13:去除代碼運行的隨機性(如去掉無用的數據、代碼及盡可能防止并注意函數中的“內部寄存器”等),讓函數運行的結果可預測,并使出現的錯誤可再現。
12 宏
¹ 12-1:用宏定義表達式時,要使用完備的括號。
示例:如下定義的宏都存在一定的風險。
#define RECTANGLE_AREA( a, b ) a * b
#define RECTANGLE_AREA( a, b ) (a * b)
#define RECTANGLE_AREA( a, b ) (a) * (b)
正確的定義應為:
#define RECTANGLE_AREA( a, b ) ((a) * (b))
¹ 12-2:將宏所定義的多條表達式放在大括號中。
示例:下面的語句只有宏的第一條表達式被執行。為了說明問題,for語句的書寫稍不符規范。
#define INTI_RECT_VALUE( a, b )\
a = 0;\
b = 0;
for (index = 0; index < RECT_TOTAL_NUM; index++)
INTI_RECT_VALUE( rect.a, rect.b );
正確的用法應為:
#define INTI_RECT_VALUE( a, b )\
{\
a = 0;\
b = 0;\
}
for (index = 0; index < RECT_TOTAL_NUM; index++)
{
INTI_RECT_VALUE( rect[index].a, rect[index].b );
}
¹ 12-3:使用宏時,不允許參數發生變化。
示例:如下用法可能導致錯誤。
#define SQUARE( a ) ((a) * (a))
int a = 5;
int b;
b = SQUARE( a++ ); // 結果:a = 7,即執行了兩次增1。
正確的用法是:
b = SQUARE( a );
a++; // 結果:a = 6,即只執行了一次增1。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -