摘要:C語言是一種用途廣泛、使用方便的編程語言。但是它也存在著語法檢驗不夠嚴格等問題。該文章根據軟件編程方法并結合C語言的特點創(chuàng)設零缺陷編程方法,以供廣大編程愛好者借鑒。
關鍵詞:C語言;編程規(guī)范;零缺陷;測試
C語言簡單、易用,是許多編程愛好者的首選語言。但由于C語言的語法不是很嚴格,許多程序設計者在編程過程中會遇到許多錯誤,在程序設計方法上,國外有許多學者對程序零缺陷程序設計提出了自已的觀點和方法。如美國管理學家philipb。croby的“零缺陷”思想引進來,用以提高編程的質量,增大軟件中的驗證力度。IBM公司70年代末和80年代初提出的“凈室軟件工程”(clean room software engineering),“凈室”一詞源于精密半導體器件中的無塵生產車間,它強調在生產過程中就消除問題,而不是在產品生產以后,才依靠檢測來挑選有問題的產品。傳統(tǒng)的軟件工程建模、形式化方法、程序驗證(正確性證明)、以及統(tǒng)計SQA的集成使用已經組合成一種可以導致極高質量軟件的技術。凈室軟件工程(Cleanroom software engineering)是一種在軟件開發(fā)過程中強調在軟件中建立正確性的需要的方法。本文通過建立良好的C語言的編程風格,避免出現常見的錯誤,并通過凈室過程的方法來提高C語言編程的效率。
1 良好的編程風格
良好的編程風格可以在許多方面幫助開發(fā)人員。如果你閱讀過 Linux 內核源代碼的話,可能會對程序的優(yōu)美編排所傾倒。良好的編程風格可以增加代碼的可讀性,并幫助你理清頭緒。如果程序非常雜亂,大概看一眼就該讓你暈頭轉向了。編程風格最能體現一個程序員的綜合素質。
許多人可能對 Windows 所推崇的匈牙利命名法很熟悉。這種方法定義了非常復雜的函 數、變量、類型等的命名方法,典型的命名方法是采用大小寫混寫的方式,對于變量名稱,則采用添加前綴的辦法來表示其類型,例如:
char szBuffer[20];
int nCount;
利用 sz 和 n 分別代表字符串和整數。為了表示一個變量名稱,采用如下的變量名稱是可能的:
int iThisIsAVeryLongVariable;
在 Linux 中,我們經常看到的是定義非常簡單的函數接口和變量名稱。在 Linux 內核的源代碼中,可以看到 Linux 內核源代碼的編碼風格說明。UNIX 系統(tǒng)的一個特點是設計精巧,并遵守積木式原則。C 語言最初來自 UNIX操作系統(tǒng),與 UNIX 的設計原則一樣, C 語言被廣泛認可和使用的一個重要原因是它的靈活性以及簡潔性。因此,在利用 C 語言編寫程序時,始終應當符合其簡潔的設計原則,而不應當使用非常復雜的變量命名方法。C 語言編程代碼格式要點如下:
縮進時,使用長度為 8 個字符寬的 Tab 鍵。如果程序的縮進超過 3 級,則應考慮重新設計程序。
大括號的位置。除函數的定義體外,應當將左大括號放在行尾,而將右大括號放在行首 。函數的定義體應將左右大括號放在行首。對變量名,不贊成使用大小寫混寫的形式,但鼓勵使用描述性的名稱;盡可能不使用全局變量;不采用匈牙利命名法表示變量的類型;采用短小精悍的名稱表示局部變量;保持函數短小,從而避免使用過多的局部變量。保持函數短小精悍。不應過分強調注釋的作用,應盡量采用好的編碼風格而不是添加過多的注釋。函數函數應該短小而迷人,而且它只作一件事情,并且只作一件事情,而且將它做好。一個函數的最大長度和函數的復雜程度以及縮進大小成反比。于是,如果你已經寫了簡單但長度較長的的函數,而且你已經對不同的情況做了很多很小的事情,寫一個更長一點的函數也是無所謂的。然而,假如你要寫一個很復雜的函數,而且你已經估計到假如一般人讀這個函數,他可能都不知道這個函數在說些什么,這個時候,使用具有描述性名字的有幫助的函數。另外一個需要考慮的是局部變量的數量。他們不應該超過5-10個,否則你有可能會出錯。重新考慮這個函數,將他們分割成更小的函數。
注釋是一件很好的事情,但是過多的注釋也是危險的,不要試圖區(qū)解釋你的代碼是注釋如何如何的好,你應該將代碼寫得更好,而不是花費大量的時間去解釋那些糟糕的代碼。
2 C語言中容易出現的問題
C語言由于語法檢查不是很嚴格,所以程序的編寫過程中它會出現一些你意想不到的問題。下面舉一些簡單的例子來說明這一點。
2.1 賦值語句與比較語句容易出現混淆
我們舉一個簡單的例子:
如果x等于y,則打印。我們有時候會寫成
(x=y) printf();
這實際上把比較語句和賦值語句混淆起來了,真正的語句應該寫成這樣
(x==y) printf();
2.2 邏輯與()和二進制與()運算之間的區(qū)別
邏輯運算,就是“布爾代數”意義上的運算。運算結果只有兩種情況,0和非0,即1與true。從中可以建立起一種判斷邏輯表達式是否為“真”的語句。而按位運算,則是二進制意義上的運算。
如(11)十進制=(1011)二進制
(5)十進制=(0101)二進制
則11 5為
1011
0101
=(0001)二進制=(1)十進制
邏輯或(||)和二進制或(|)運算與上述相同。
2.3 自加或自減
簡單的來說,++i 和 i++,在單獨使用時,就是 i=i+1。
而 a = ++i,相當于 i=i+1; a = i;
而 a = i++,相當于 a = i; i=i+1;
i++ 是先賦值后加減,++i 是先加減后賦值。所以我們在使用自加或自減進行賦值時,一定要注意變量使用的先后次序。
C語言編程時的注意事項還有很多,這里由于篇幅的原因就不再一一列舉了。
3 “凈室”化的程序設計方法
凈室(Cleanroom,無塵室或潔凈室)是指一個具有低污染水平的環(huán)境,這里所指的污染來源有灰塵、空氣傳播的微生物、懸浮顆粒和化學揮發(fā)性氣體。更準確地講,一個凈室具有一個受控的污染級別,污染級別可用每立方米的顆粒數,或者用最大顆粒大小來厘定的。凈室被廣泛地應用在對環(huán)境污染特別敏感的行業(yè),例如半導體生產、生化技術、生物技術等。我們這里為了提高軟件編程的水平引入了凈室軟件工程的方法,總體說來是采用傳統(tǒng)的軟件工程建模、形式化方法、程序驗證(正確性證明)以及統(tǒng)計SQA的集成使用已經組合成一種可以導致極高質量軟件的技術。凈室軟件工程(Cleanroom software engineering)是一種在軟件開發(fā)過程中強調在軟件中建立正確性的需要的方法用來代替?zhèn)鹘y(tǒng)的分析、設計、編碼、測試和調試周期。凈室軟件工程的哲學是:通過在第一次正確地書寫代碼增量并在測試前驗證它們的正確性來避免對成本很高的錯誤消除過程的依賴。它的過程模型是在代碼增量積聚到系統(tǒng)的過程的同時進行代碼增量的統(tǒng)計質量驗證。凈室方法在很多方面將軟件工程提升到另一個層次。
凈室過程強調在規(guī)約和設計上的嚴格性,以及使用基于數學的正確性證明來對結果設計模型的每個元素進行形式化驗證。作為對形式化方法中采用的方法的擴展,凈室方法還強調統(tǒng)計質量控制技術,包括基于客戶對軟件預期的使用的測試。當現實世界中軟件失敗時,則充滿了立即的和長期的危險。這些危險可能和人的安全、經濟損失、或業(yè)務和社會基礎設施的有效運作相關。凈室軟件工程是一個過程模型,它在可能產生嚴重的危險前消除錯誤。
凈室方法使用增量軟件模型的一個專門版本。一個“軟件增量的流水線”被若干小的、獨立的軟件工程小組開發(fā),一旦每個增量被認證通過,它將被集成為一個整體。因此,系統(tǒng)的功能隨時間增加。開發(fā)一個采用增量策略的項目計劃,建立每個增量的功能、它的項目大小、以及凈室開發(fā)進度表。必須特別小心以保證通過認證的增量將被定時集成。使用一個運用盒結構的規(guī)約方法來描述功能規(guī)約。盒結構“在每一個精化級別上分離和分開行為、數據及過程的創(chuàng)造性定義”。使用盒結構方法,凈室設計是規(guī)約的自然的無縫的擴展。
4 嚴密的測試方法
凈室過程的測試方法描述通過箱式結構和統(tǒng)計質量驗證(statistical quality certification)箱式結構來完成的。它是通過形式化方法來保證證軟件是完美無缺陷的。它是將程序的初始狀態(tài)、運行狀態(tài)和結果以狀態(tài)圖的形式表出,它能夠很嚴格發(fā)現程序運行中出現的問題。在程序完成后進行測試,其主要是測試質量,次要目的是發(fā)現那些在驗證中沒有被發(fā)現的缺陷。這種程序驗證由程序員本人完成是不夠的,應該由小組成員在驗證回顧會議上進行驗證。合理的驗證小組成員3-8人,特別是新程序員要參加討論,主持者最重要的任務是使團隊的每一個成員都理解驗證每一步并同意其正確性。
驗證的主要目的是:
a 是否程序做了不合理的假設;
b 是忘記了編程語言中的某些細節(jié);
c 是否忽略了某些程序邏輯中的可疑部分。
通過這種方式用全新的眼光來看待工作,他們常常會提出自己發(fā)現不了的問題。
驗證的方式上可以采用“黑盒”、“ 白盒”或“灰盒”的檢查模式。
黑盒測試也稱功能測試或數據驅動測試,它是在已知產品所應具有的功能,通過測試來檢測每個功能是否都能正常使用,在測試時,把程序看作一個不能打開的黑盆子,在完全不考慮程序內部結構和內部特性的情況下,測試者在程序接口進行測試,它只檢查程序功能是否按照需求規(guī)格說明書的規(guī)定正常使用,程序是否能適當地接收輸入數鋸而產生正確的輸出信息,并且保持外部信息(如數據庫或文件)的完整性。
黑盒測試方法主要有等價類劃分、邊值分析、因—果圖、錯誤推測等,主要用于軟件確認測試。“黑盒”法著眼于程序外部結構、不考慮內部邏輯結構、針對軟件界面和軟件功能進行測試。“黑盒”法是窮舉輸入測試,只有把所有可能的輸入都作為測試情況使用,才能以這種方法查出程序中所有的錯誤。實際上測試情況有無窮多個,人們不僅要測試所有合法的輸入,而且還要對那些不合法但是可能的輸入進行測試。
白盒測試也稱結構測試或邏輯驅動測試,它是知道產品內部工作過程,可通過測試來檢測產品內部動作是否按照規(guī)格說明書的規(guī)定正常進行,按照程序內部的結構測試程序,檢驗程序中的每條通路是否都有能按預定要求正確工作,而不顧它的功能,白盒測試的主要方法有邏輯驅動、基路測試等,主要用于軟件驗證。 “白盒”法全面了解程序內部邏輯結構、對所有邏輯路徑進行測試。“白盒”法是窮舉路徑測試。在使用這一方案時,測試者必須檢查程序的內部結構,從檢查程序的邏輯著手,得出測試數據。貫穿程序的獨立路徑數是天文數字。但即使每條路徑都測試了仍然可能有錯誤。第一,窮舉路徑測試決不能查出程序違反了設計規(guī)范,即程序本身是個錯誤的程序。第二,窮舉路徑測試不可能查出程序中因遺漏路徑而出錯。第三,窮舉路徑測試可能發(fā)現不了一些與數據相關的錯誤。
灰盒測試,是介于二者之間的。灰盒測試關注輸出對于輸入的正確性,同時也關注內部表現,但這種關注不象白盒那樣詳細、完整,只是通過一些表征性的現象、事件、標志來判斷內部的運行狀態(tài),有時候輸出是正確的,但內部其實已經錯誤了,這種情況非常多,如果每次都通過白盒測試來操作,效率會很低,因此需要采取這樣的一種灰盒的方法。灰盒測試結合了白盒測試盒黑盒測試的要素。它考慮了用戶端、特定的系統(tǒng)知識和操作環(huán)境。它在系統(tǒng)組件的協(xié)同性環(huán)境中評價應用軟件的設計。灰盒測試由方法和工具組成,這些方法和工具取材于應用程序的內部知識盒與之交互的環(huán)境,能夠用于黑盒測試以增強測試效率、錯誤發(fā)現和錯誤分析的效率。
在程序測試階段可根據實際情況選擇不同的具體的測試方法。
5 總結
本文通過C語言編程中的編程規(guī)范、易出錯的地方和用凈室的方法來提高C語言的編程質量,提高軟件開發(fā)的效率。凈室方法是一種理論性強的編程方法,嚴格按照此方法進行編程是很多程序員難以達到的,本文將這種方法用以提高C語言編程質量是一種嘗試,供廣大編程愛好者借鑒。
參考文獻
[1]斯蒂夫里.零缺陷程序設計[M].夏昕,王堯,譯.北京:機械工業(yè)出版社,2003.
[2]佩騰.軟件測試[M].張小松,等譯.北京:機械工業(yè)出版社,2006.
[3]張芳妮,呂波.語言編程常見問題解答[M].北京:清華大學出版社,1996.
[4]譚浩強.C語言程序設計[M].北京:清華大學出版社,2000。