【文章內(nèi)容簡介】
說明:這一問題往往有兩個極端:要么是調(diào)用者和被調(diào)用 者對參數(shù)均不作合法性檢查,造成問題隱患; 要么就是調(diào)用者和被調(diào)用者均對參數(shù)進行合法性檢 查,產(chǎn)生了冗余代碼。4 )禁止將函數(shù)的參數(shù)作為工作變量。說明:將函數(shù)的參數(shù)作為工作變量,有可能錯誤地改變參 數(shù)內(nèi)容,很危險。方法:先用局部變量代之,最后再將該局部變量的內(nèi)容賦 給該參數(shù)。 5 )函數(shù)的規(guī)模盡量限制在 200 行以內(nèi)。說明:不包括注釋和空格行。6 )一個函數(shù)僅完成一件功能。7 )非調(diào)度函數(shù)禁止使用控制參數(shù),只使用數(shù)據(jù)參數(shù)。說明:調(diào)度函數(shù)是指根據(jù)輸入的消息類型來啟動相應的功 能實體,而本身并不完成具體功能??刂茀?shù)是指 改變函數(shù)功能行為的參數(shù),即函數(shù)要根據(jù)此參數(shù)來 決定具體怎樣工作。非調(diào)度函數(shù)的控制參數(shù)增加了 函數(shù)間的控制耦合,使函數(shù)間的耦合度增大,并使 函數(shù)的功能不唯一。 8 )檢查函數(shù)輸入的有效性。說明:函數(shù)的輸入主要有兩種:一種是參數(shù)輸入;另一種是全 局變量、數(shù)據(jù)文件的輸入,即非參數(shù)輸入。9 )不把與函數(shù)返回值類型不同的變量進行強制的轉(zhuǎn)換后作為返回值返回。在調(diào)用函數(shù)填寫參數(shù)時,不進行默認數(shù)據(jù)類型轉(zhuǎn)換或強制數(shù)據(jù)類型轉(zhuǎn)換。10 )設計高扇入、合理扇出(小于 7 )的函數(shù)。說明:扇出是指一個函數(shù)直接調(diào)用(控制)其它函數(shù)的數(shù)目,而 扇入是指有多少上級函數(shù)調(diào)用它。函數(shù)較合理的扇出通常 是 3 5 (調(diào)度函數(shù)除外)。 11 )不進行函數(shù)本身或函數(shù)間的遞歸調(diào)用。影響:理解性;系統(tǒng)資源(如??臻g);測試。12 ) 優(yōu)化函數(shù)結(jié)構(gòu)。說明:對初步劃分后的函數(shù)結(jié)構(gòu)應進行優(yōu)化。優(yōu)化原則:( 1 )不能影響模塊功能的實現(xiàn)。( 2 )考查出錯處理和模塊的性能要求進行完善。( 3 )通過分解或合并函數(shù)來改進軟件結(jié)構(gòu)。( 4 )規(guī)模大的函數(shù)要進行分解。( 5 )降低函數(shù)間接口的復雜度。( 6 )不同層次的函數(shù)調(diào)用要有較合理的扇入、扇出。( 7 )函數(shù)功能應可預測。( 8 )提高函數(shù)內(nèi)聚。(單一功能的函數(shù)內(nèi)聚最高) 13 )禁止使用 B O O L 參數(shù)。說明: 1 、無意義; 2 、不利于擴充。 示例:重入E x a m 是 i n t型全局變量,函數(shù) S q u r e _ E x a m 返回 E x a m 平方值。那么如下函數(shù)不具有可重入性。u n s i g n e d i n t e x a m p l e ( i n t p a r a ){ u n s i g n e d i n t t e m p 。 E x a m = p a r a 。 / / ( ** ) t e m p = S q u a r e _ E x a m ( ) 。 r e t u r n t e m p 。}此函數(shù)若被多個進程調(diào)用結(jié)果可能是未知的;當( ** )語句剛執(zhí)行完后,另一個使用本函數(shù)的進程可能正好被激活,當新激活的進程執(zhí)行到此函數(shù)時,將使 E x a m賦與另一個不同的 p a r a 值,所以當控制重新回到 “ te mp = S q u a r e _E x a m( ) ” 后,計算出的 te mp 很可能不是預想中的結(jié)果。 7 可測性1 )統(tǒng)一的調(diào)測開關和打印函數(shù)。說明:調(diào)測打印格式要有統(tǒng)一的形式。信息串中至少要有所在 模塊名(或源文件名)及行號。調(diào)測開關應分為不同級 別和類型。2 )測試代碼部分作為一個子模塊。3 )使用斷言來發(fā)現(xiàn)問題,提高可測性。說明:斷言是對某種假設條件進行檢查,可理解為若條件成立則 無動作,否則報告。它可以快速發(fā)現(xiàn)并定位軟件問題,同 時自動報警。 S t e v e M a g u i re ,《編程精粹》 4 )斷言:調(diào)測時可能發(fā)生的非法情況,正常運行時不應發(fā)生。斷言處理最終產(chǎn)品肯定會出現(xiàn)且必須處理的錯誤情況 說明:斷言是用來處理不應該發(fā)生的錯誤情況的,對于可能會 發(fā)生的且必須處理的情況要寫防錯程序,而不是斷言。 如某模塊收到其它模塊或鏈路上的消息后,要對消息的 檢查是正常的錯誤檢查,不能用斷言來實現(xiàn)。5 )編寫防錯程序,在處理錯誤后用斷言宣布發(fā)生錯誤。6 )用調(diào)測開關來切換軟件的 D E B U G 版和正式版。 示例: C 語言斷言(其中 N U L L 為 0L ) i f d e f _ E X A M _ A S S E R T _ T E S T _ / / 若使用斷言測試v o i d e x a m _ a s s e r t ( c h a r * f i l e _ n a m e , u n s i g n e d i n t l i n e _ n o ){ p r i n t f ( \ n A s s e r t f a i l e d : % s , l i n e % u \ n , f i l e _ n a m e , l i n e _ n o ) 。 / / a b o r t ( ) 。} d e f i n e A S S E R T ( c o n d i t i o n ) i f ( c o n d i t i o n ) / / 若條件成立,則無動作 N U L L 。 e l s e / / 否則報告 e x a m _ a s s e r t ( _ _ F I L E _ _ , _ _ L I N E _ _ ) e l s e / / 若不使用斷言測試 d e f i n e E X A M _ A S S E R T ( c o n d i t i o n ) N U L L e n d i f / * e n d o f A S S E R T * / 8 程序效率1 )在保證軟件系統(tǒng)的正確性、穩(wěn)定性、可讀性及可測性的前提下,提高代碼效率。2 )系統(tǒng)數(shù)據(jù)結(jié)構(gòu) 程序算法 空間效率例 143 )循環(huán)體內(nèi)工作量最小化。 例 154 )在多重循環(huán)中,應將最忙的循環(huán)放在最內(nèi)層。 例 16說明:減少 CPU 切入循環(huán)層的次數(shù)。 5 )避免循環(huán)體內(nèi)含判斷語句,如果判斷語句與循環(huán)變量無關,應將循環(huán)語句置于判斷語句的代碼塊之中。說明:目的是減少判斷次數(shù)。6 )盡量用乘法或其它方法代替除法。例 1 :空間效率如下記錄學生學習成績的結(jié)構(gòu)不合理。t y p e d e f u n s i g n e d c h a r B Y T E 。t y p e d e f u n s i g n e d s h o r t W O R D 。t y p e d e f s t r u c t S T U D E N T _ S C O R E _ S T R U{ B Y T E n a me [ 8 ] 。 B Y T E a g e 。 B Y T E s e x 。 B Y T E c l a s s 。 B Y T E s u b j e c t 。 f l o a t s c o r e 。} S T U D E N T _ S C O R E 。分為兩個結(jié)構(gòu),總的存貯空間變小,操作也變得更方便。 t y p e d e f s t r u c t S T U D E N T _ S T R U{ B Y T E n a me [ 8 ] 。 B Y T E a g e 。 B Y T E s e x 。 B Y T E c l a s s 。} S T U D E N T 。t y p e d e f s t r u c t S T U D E N T _ S C O R E _ S T R U{ W O R D s t u d e n t _ i n d e x 。 B Y T E s u b j e c t 。 f l o a t s c o r e 。} S T U D E N T _ S C O R E 。 例:如下代碼效率不高。f o r ( in d = 0 。 in d M A X _ A D D _ N U M B E R 。 in d + + ){ s u m + = in d 。 ba c k _ s u m = s u m 。 / * ba c k u p s u m * /}語句 “ b a c k _ s u m = s u m ?!?完全可以放在 f o r 語句之后。例:如下代碼效率不高。f o r ( r ow = 0 。 r o w 1 0 0。 r o w + + ){ f o r ( c o l = 0 。 c o l 5 。 co l + + ) { s u m + = a [ r o w ] [ c o l ] 。 }}可以改為如下方式,以提高效率。f o r ( co l = 0 。 c ol 5 。 c o l + + ){ f o r ( r o w = 0 。 r ow 1 0 0 。 r o w + + ) { s u m + = a [ r o w ] [ c o l ] 。 }} 9 質(zhì)量保證1 在軟件設計過程中構(gòu)筑軟件質(zhì)量。2 代碼質(zhì)量保證優(yōu)先原則。 ( 1 )正確性,指程序要實現(xiàn)設計要求的功能。 ( 2 )穩(wěn)定性、安全性,指程序穩(wěn)定、可靠、安全。 ( 3 )可測試性,指程序要具有良好的可測試性。 ( 4 )規(guī)范 /可讀性,指程序書寫風格、命名規(guī)則等要符合規(guī)范。 ( 5 )全局效率,指軟件系統(tǒng)的整體效率。 ( 6 )局部效率,指某個模塊 /子模塊 /函數(shù)的本身效率。 ( 7 )個人表達方式 /個人方便性,指個人編程習慣。 3 只引用屬于自己的存貯空間。4 防止引用已經(jīng)釋放的內(nèi)存空間。5 過程 /函數(shù)中分配的內(nèi)存,在過程 /函數(shù)退出之前要釋放。6 過程 /函數(shù)中申請的(為打開文件而使用的)文件句柄,在過程 /函數(shù)退出之前要關閉。7 防止內(nèi)存操作越界。說明:內(nèi)存操作主要是指對數(shù)組、指針、內(nèi)存地址等的操作。