版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第七章程序編碼(實現(xiàn)階段)目的:把詳細設(shè)計轉(zhuǎn)換成計算機語言實現(xiàn)的程序代碼。內(nèi)容:1.程序設(shè)計語言的選擇。2.程序設(shè)計風(fēng)格及語言,編碼風(fēng)格對軟件質(zhì)量
的影響。
1.程序設(shè)計語言的選擇2.程序設(shè)計風(fēng)格3.程序效率4.程序復(fù)雜性定性度量做為軟件工程過程的一個階段,程序編碼是設(shè)計的繼續(xù)。程序設(shè)計語言的特性和程序設(shè)計風(fēng)格會深刻地影響軟件的質(zhì)量和可維護性。為了保證程序編碼的質(zhì)量,程序員必須深刻理解、熟練掌握并正確地運用程序設(shè)計語言的特性。此外,還要求源程序具有良好的結(jié)構(gòu)性和良好的程序設(shè)計風(fēng)格。1.程序設(shè)計語言的選擇1〉分類(1)機器語言(2)匯編語言(3)高級語言(4)第四代語言4GL高級語言:I.經(jīng)典的高級語言II.通用結(jié)構(gòu)化的程序設(shè)計語言(PL/1,PASCAL,C,Ada,etc)II.通用結(jié)構(gòu)化的程序設(shè)計語言A)PL/1(ProgramLanguageOne)(Fortran+Cobol)由IBM公司及SHARE,60年代中后期,(PL/S—系統(tǒng)設(shè)計,PL/M—微機處理系統(tǒng),PL/C—程序設(shè)計教學(xué))PL/1的子集。B)PASCAL,Wirth,1970推出。C)C語言,Bell實驗室開發(fā)(為了寫Unix)靈活,支持復(fù)雜的數(shù)據(jù)結(jié)構(gòu),大量應(yīng)用指針,豐富的運算符和操作符,類似匯編,C—〉TurboC—〉C++—〉VC++D)ADA,DOD,1974開發(fā),為嵌入式實時系統(tǒng)開發(fā)。III.專用語言(APL,FORTH,LISP,PROLOG,JAVAetc)APL:數(shù)組和向量運算,幾乎沒有結(jié)構(gòu)化控制結(jié)構(gòu)和數(shù)據(jù)。FORTH:為開發(fā)PC機系統(tǒng)軟件設(shè)計的語言,特點:堆棧方式編輯。LISP:人工智能。PROLOG:專家系統(tǒng)。JAVA,1991,SUN公司,JamesGosling,面向?qū)ο蟮?,類C++的,提供基于TCP/IP協(xié)議的網(wǎng)絡(luò)環(huán)境下交互式和實時程序。JAVA推動了Internet上基于Web服務(wù)的應(yīng)用發(fā)展。第四代語言4GL=FourthGenerationLanguage超高級語言Natural,Focus,Nomadetc一條語句=30-50條機器代碼指令缺點:編譯器過大,速度慢,解釋器過大。優(yōu)點:“非過程”的語言foreverySTUDENTifSCOREisEXCELLENT
doPROMOTION2>選擇:(1)用戶要求(2)運行環(huán)境(3)工程規(guī)模(4)應(yīng)用范圍(5)程序員經(jīng)驗知識(6)可移植性好(7)軟件輔助工具(8)費用2.程序設(shè)計風(fēng)格=良好的編程習(xí)慣
程序?qū)嶋H上也是一種供人閱讀的文章,有一個文章的風(fēng)格問題。應(yīng)該使程序具有良好的風(fēng)格。
源程序文檔化
數(shù)據(jù)說明
語句結(jié)構(gòu)
輸入/輸出(I/O)方法
源程序文檔化
一.標識符的命名二.安排注釋
三.程序的視覺組織一.符號名的命名符號名即標識符,包括模塊名、變量名、常量名、標號名、子程序名、
、數(shù)據(jù)區(qū)名以及緩沖區(qū)名等。這些名字應(yīng)能反映它所代表的實際東西,應(yīng)有一定實際意義。例如,表示次數(shù)的量用Times,表示總量的用Total,表示平均值的用Average,表示和的量用Sum等。名字不是越長越好,應(yīng)當(dāng)選擇精煉的意義明確的名字。必要時可使用縮寫名字,但這時要注意縮寫規(guī)則要一致,并且要給每一個名字加注釋。同時,在一個程序中,一個變量只應(yīng)用于一種用途。NEW.BALANCE.ACCOUNTS.PAYABLE
NBALAP
N
總之:標識符命名應(yīng)意義明確,清晰,可理解性高,一致性的命名例:D=S*T=Velocity*TimeDistance=Speed*Time匈牙利命名規(guī)則:CharlesSimonyi,1972提出,MicrosoftWindows開發(fā)中引入,Apple,3COM等公司均采用。1.變量名構(gòu)成ArnoldSchwarzenegger變量名=〈類型(type)〉〈限定詞(Qualifier3)〉類型—為每一個變量確定類型,一般用“小寫字母”。限定詞—“第一個字母大寫”,若還有其他類型,則該類型第一個字母大寫。類型與限定詞之間沒有分隔符。例:handleWindows,handle—類型,Windows限定詞2.類型
基類型(Class)類型
構(gòu)成的類型
加前綴構(gòu)成的類型
加后綴構(gòu)成—子類型類型:由在數(shù)據(jù)上執(zhí)行的操作決定,如文件窗口內(nèi)部注釋,程序的視覺組織。(1)基類型:2-3字符長,有約定記號。例:f—標志(flag),取值fTrue和fFalseCh—單個字符,SZ—以零結(jié)束的字符(2)前綴p—指針,pch—指向字符的指針類型i—數(shù)組索引,如iabc—元素類型為abc的數(shù)組的索引c—計數(shù),cch—字符計數(shù)類型d—偏移,dx,若x是坐標類型,則dx表示距離(3)后綴—子類型:基類型后加一個或兩個小寫英文字母,Xi(inch),Xp(pixel)
限定詞中有其它類型,應(yīng)將“其他類型”第一個字母大寫。如:1.chPtrTmp(chPTRTMP)ch—字符,Ptr—指針,Tmp臨時變量2.對于布爾變量,限定詞應(yīng)描述為真,如f—布爾變量fOpen/fOPEN二.程序的注釋
夾在程序中的注釋是程序員與日后的程序讀者之間通信的重要手段。注釋決不是可有可無的。一些正規(guī)的程序文本中,注釋行的數(shù)量占到整個源程序的1/3到1/2,甚至更多。注釋分為序言性注釋和功能性注釋。序言性注釋通常置于每個程序模塊的開頭部分,它應(yīng)當(dāng)給出程序的整體說明,對于理解程序本身具有引導(dǎo)作用。有些軟件開發(fā)部門對序言性注釋做了明確而嚴格的規(guī)定,要求程序編制者逐項列出。有關(guān)項目包括:
程序標題;
有關(guān)本模塊功能和目的的說明;
主要算法;
接口說明:包括調(diào)用形式,參數(shù)描述,子程序清單;
有關(guān)數(shù)據(jù)描述:重要的變量及其用途,約束或限制條件,以及其它有關(guān)信息;
模塊位置:在哪一個源文件中,或隸屬于哪一個軟件包;
開發(fā)簡歷:模塊設(shè)計者,復(fù)審者,復(fù)審日期,修改日期及有關(guān)說明等。功能性注釋功能性注釋嵌在源程序體中,用以描述其后的語句或程序段是在做什么工作,或是執(zhí)行了下面的語句會怎么樣。而不要解釋下面怎么做。例如,
/*ADDAMOUNTTOTOTAL*/
TOTAL=AMOUNT+TOTAL
不好。
如果注明把月銷售額計入年度總額,便使讀者理解了下面語句的意圖:
/*ADDMONTHLY-SALESTOANNUAL-TOTAL*/
TOTAL=AMOUNT+TOTAL要點
描述一段程序,而不是每一個語句;
用縮進和空行,使程序與注釋容易區(qū)別;
注釋要正確。視覺組織
空格、空行和移行恰當(dāng)?shù)乩每崭瘢梢酝怀鲞\算的優(yōu)先性,避免發(fā)生運算的錯誤。例如
,將表達式
(A<-17)ANDNOT(B<=49)ORC
寫成
(A<-17)ANDNOT(B<=49)ORC自然的程序段之間可用空行隔開;移行也叫做向右縮格。它是指程序中的各行不必都在左端對齊,都從第一格起排列。這樣做使程序完全分不清層次關(guān)系。對于選擇語句和循環(huán)語句,把其中的程序段語句向右做階梯式移行。使程序的邏輯結(jié)構(gòu)更加清晰。例如,兩重選擇結(jié)構(gòu)嵌套,寫成下面的移行形式,層次就清楚得多。
IF(…)THEN
IF(…)THEN
……
ELSE
……
ENDIF
……
ELSE
……
ENDIF數(shù)據(jù)說明在設(shè)計階段已經(jīng)確定了數(shù)據(jù)結(jié)構(gòu)的組織及其復(fù)雜性。在編寫程序時,則需要注意數(shù)據(jù)說明的風(fēng)格。為了使程序中數(shù)據(jù)說明更易于理解和維護,必須注意以下幾點。1.數(shù)據(jù)說明的次序應(yīng)當(dāng)規(guī)范化2.說明語句中變量安排有序化3.使用注釋說明復(fù)雜數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)說明的次序應(yīng)當(dāng)規(guī)范化數(shù)據(jù)說明次序規(guī)范化,使數(shù)據(jù)屬性容易查找,也有利于測試,排錯和維護。原則上,數(shù)據(jù)說明的次序與語法無關(guān),其次序是任意的。但出于閱讀、理解和維護的需要,最好使其規(guī)范化,使說明的先后次序固定。
例如,在FORTRAN程序中數(shù)據(jù)說明次序 ①常量說明 ②簡單變量類型說明 ③數(shù)組說明 ④公用數(shù)據(jù)塊說明 ⑤所有的文件說明在類型說明中還可進一步要求。例如,
可按如下順序排列: ①整型量說明 ②實型量說明 ③字符量說明 ④邏輯量說明說明語句中變量安排有序化當(dāng)多個變量名在一個說明語句中說明時,應(yīng)當(dāng)對這些變量按字母的順序排列。帶標號的全程數(shù)據(jù)(如FORTRAN的公用塊)也應(yīng)當(dāng)按字母的順序排列。例如,把
integersize,length,width,cost,price
寫成
integer
cost,length,price,size,width
使用注釋說明復(fù)雜數(shù)據(jù)結(jié)構(gòu)如果設(shè)計了一個復(fù)雜的數(shù)據(jù)結(jié)構(gòu),應(yīng)當(dāng)使用注釋來說明在程序?qū)崿F(xiàn)時這個數(shù)據(jù)結(jié)構(gòu)的固有特點。例如,對PL/1的鏈表結(jié)構(gòu)和Pascal中用戶自定義的數(shù)據(jù)類型,都應(yīng)當(dāng)在注釋中做必要的補充說明。語句結(jié)構(gòu)在設(shè)計階段確定了軟件的邏輯流結(jié)構(gòu),但構(gòu)造單個語句則是編碼階段的任務(wù)。語句構(gòu)造力求簡單,直接,不能為了片面追求效率而使語句復(fù)雜化。1.在一行內(nèi)只寫一條語句在一行內(nèi)只寫一條語句,并且采取適當(dāng)?shù)囊菩懈袷剑钩绦虻倪壿嫼凸δ茏兊酶用鞔_。許多程序設(shè)計語言允許在一行內(nèi)寫多個語句。但這種方式會使程序可讀性變差。因而不可取。
例如,有一段排序程序
FORI:=1TON-1DOBEGINT:=I;FORJ:=I+1TONDOIFA[J]<A[T]THENT:=J;IFT≠ITHENBEGINWORK:=A[T];A[T]:=A[I];A[I]:=WORK;ENDEND;由于一行中包括了多個語句,掩蓋了程序的循環(huán)結(jié)構(gòu)和條件結(jié)構(gòu),使其可讀性變得很差。FORI:=1TON-1DO//改進布局
BEGIN
T:=I;
FORJ:=I+1TONDO
IFA[J]<A[T]THENT:=J;
IFT≠ITHEN
BEGIN
WORK:=A[T];
A[T]:=A[I];
A[I]:=WORK;
END
END;2.程序編寫首先應(yīng)當(dāng)考慮清晰性程序編寫首先應(yīng)當(dāng)考慮清晰性,不要刻意追求技巧性,使程序編寫得過于緊湊。例如,有一個用C語句寫出的程序段:
A[I]=A[I]+A[T];
A[T]=A[I]-A[T];
A[I]=A[I]-A[T];
此段程序可能不易看懂,有時還需用實際數(shù)據(jù)試驗一下。實際上,這段程序的功能就是交換A[I]和A[T]中的內(nèi)容。目的是為了節(jié)省一個工作單元。如果改一下:
WORK=A[T];
A[T]=A[I];
A[I]=WORK;
就能讓讀者一目了然了。3.程序要能直截了當(dāng)?shù)卣f明程序員的用意。程序編寫得要簡單,寫清楚,直截了當(dāng)?shù)卣f明程序員的用意。例如,
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
V[i][j]=(i/j)*(j/i)
除法運算(/)在除數(shù)和被除數(shù)都是整型量時,其結(jié)果只取整數(shù)部分,而得到整型量。
當(dāng)
i<j
時,i/j=0
當(dāng)
j<i
時,j/i=0
得到的數(shù)組
當(dāng)i≠j時
V[i][j]=(i/j)*(j/i)=0
當(dāng)i=j(luò)時
V[i][j]=(i/j)*(j/i)=1這樣得到的結(jié)果
V
是一個單位矩陣。寫成以下的形式,就能讓讀者直接了解程序編寫者的意圖。
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j)
V[i][j]=1.0;
ELSE
V[i][j]=0.0;
4.除非對效率有特殊的要求,程序編寫要做到清晰第一,效率第二。不要為了追求效率而喪失了清晰性。事實上,程序效率的提高主要應(yīng)通過選擇高效的算法來實現(xiàn)。5.首先要保證程序正確,然后才要求提高速度。反過來說,在使程序高速運行時,首先要保證它是正確的。
6.避免使用臨時變量而使可讀性下降。例如,有的程序員為了追求效率,往往喜歡把表達式
A[I]+1/A[I];寫成
AI=A[I];X=AI+1/AI;這樣將一句分成兩句寫,會產(chǎn)生意想不到的問題。7.讓編譯程序做簡單的優(yōu)化。8.盡可能使用庫函數(shù)9.避免不必要的轉(zhuǎn)移。同時如果能保持程序可讀性,則不必用
GOTO語句。
例如,有一個求三個數(shù)中最小值的程序:
IF(X<Y)GOTO30
IF(Y<Z)GOTO50
SMALL=ZGOTO7030IF(X<Z)GOTO60
SMALL=ZGOTO7050SMALL=Y(jié)GOTO7060SMALL=X70CONTINUE
程序只需編寫成:
small=x;
if(y<small)small=y(tǒng);
if(z<small)small=z;
所以程序應(yīng)當(dāng)簡單,不必過于深奧,
避免使用GOTO語句繞來繞去。10.盡量只采用三種基本的控制結(jié)構(gòu)來編寫程序。除順序結(jié)構(gòu)外,使用
if-then-else來實現(xiàn)選擇結(jié)構(gòu);使用
do-until或do-while來實現(xiàn)循環(huán)結(jié)構(gòu)。
11.避免使用空的ELSE語句和IF…THENIF…的語句。這種結(jié)構(gòu)容
易使讀者產(chǎn)生誤解。例如, if(char>='a’)
if(char<=’z’)
cout<<“Thisisaletter?!?
else
cout<<“Thisisnotaletter?!?
可能產(chǎn)生二義性問題。
12.避免采用過于復(fù)雜的條件測試。13.盡量減少使用“否定”條件的條件語句。例如,如果在程序中出現(xiàn)
if(!(char<‘0’||char>‘9’))……
改成
if(char>='0’&&char<='9’)……
不要讓讀者繞彎子想。14.盡可能用通俗易懂的偽碼來描述程序的流程,然后再翻譯成必須使用的語言。15.數(shù)據(jù)結(jié)構(gòu)要有利于程序的簡化。16.要模塊化,使模塊功能盡可能單一化,模塊間的耦合能夠清晰可見。17.利用信息隱蔽,確保每一個模塊的獨立性。18.從數(shù)據(jù)出發(fā)去構(gòu)造程序。19.不要修補不好的程序,要重新編寫。也不要一味地追求代碼的復(fù)用,要重新組織。20.對太大的程序,要分塊編寫、測試,然后再集成。21.對遞歸定義的數(shù)據(jù)結(jié)構(gòu)盡量使用遞歸過程。輸入(Input)和輸出(Output)=(I/O)輸入和輸出信息是與用戶的使用直接相關(guān)的。輸入和輸出的方式和格式應(yīng)當(dāng)盡可能方便用戶的使用。一定要避免因設(shè)計不當(dāng)給用戶帶來的麻煩。因此,在軟件需求分析階段和設(shè)計階段,就應(yīng)基本確定輸入和輸出的風(fēng)格。系統(tǒng)能否被用戶接受,有時就取決于輸入和輸出的風(fēng)格。
不論是批處理的輸入/輸出方式,還是交互式的輸入/輸出方式,在設(shè)計和編碼時都應(yīng)考慮下列原則:
1.
對所有的輸入數(shù)據(jù)都要進行檢驗,識別錯誤的輸入,以保證每個數(shù)據(jù)的有效性;
2.
檢查輸入項的各種重要組合的合理性,必要時報告輸入狀態(tài)信息;
3.
使得輸入的步驟和操作盡可能簡單,并保持簡單的輸入格式;
4.
輸入數(shù)據(jù)時,應(yīng)允許使用自由格式輸入;
5.
應(yīng)允許缺省值;
6.
輸入一批數(shù)據(jù)時,最好使用輸入結(jié)束標志,而不要由用戶指定輸入數(shù)據(jù)數(shù)目;
7.
在交互式輸入輸入時,要在屏幕上使用提示符明確提示交互輸入的請求,指明可使用選擇項的種類和取值范圍。同時,在數(shù)據(jù)輸入的過程中和輸入結(jié)束時,也要在屏幕上給出狀態(tài)信息;
8.
當(dāng)程序設(shè)計語言對輸入/輸出格式有嚴格要求時,應(yīng)保持輸入格式與輸入語句的要求的一致性;
9.
給所有的輸出加注解,并設(shè)計輸出報表格式。
輸入/輸出風(fēng)格還受到許多其它因素的影響。如輸入/輸出設(shè)備(例如終端的類型,圖形設(shè)備,數(shù)字化轉(zhuǎn)換設(shè)備等)、用戶的熟練程度、以及通信環(huán)境等。
3.程序效率討論效率的準則
程序的效率是指程序的執(zhí)行速度及程序所需占用的內(nèi)存的存儲空間。程序編碼是最后提高運行速度和節(jié)省存儲的機會,因此在此階段不能不考慮程序的效率。讓我們首先明確討論程序效率的幾條準則
效率是一個性能要求,應(yīng)當(dāng)在需求分析階段給出。軟件效率以需求為準,不應(yīng)以人力所及為準。
好的設(shè)計可以提高效率。
程序的效率與程序的簡單性相關(guān)。
一般說來,任何對效率無重要改善,且對程序的簡單性、可讀性和正確性不利的程序設(shè)計方法都是不可取的。算法對效率的影響源程序的效率與詳細設(shè)計階段確定的算法的效率直接有關(guān)。在詳細設(shè)計翻譯轉(zhuǎn)換成源程序代碼后,算法效率反映為程序的執(zhí)行速度和存儲容量的要求。設(shè)計向程序轉(zhuǎn)換過程中的指導(dǎo)原則:
①
在編程序前,盡可能化簡有關(guān)的算術(shù)表達式和邏輯表達式;
②
仔細檢查算法中的嵌套的循環(huán),盡可能將某些語句或表達式移到循環(huán)外面;
③
盡量避免使用多維數(shù)組;
④
盡量避免使用指針和復(fù)雜的表;
⑤
采用“快速”的算術(shù)運算;
⑥
不要混淆數(shù)據(jù)類型,避免在表達式中出現(xiàn)類型混雜;⑦
盡量采用整數(shù)算術(shù)表達式和布爾表達式;⑧
選用等效的高效率算法;許多編譯程序具有“優(yōu)化”功能,可以自動生成高效率的目標代碼。影響存儲器效率的因素在大中型計算機系統(tǒng)中,存儲限制不再是主要問題。在這種環(huán)境下,對內(nèi)存采取基于操作系統(tǒng)的分頁功能的虛擬存儲管理。存儲效率與操作系統(tǒng)的分頁功能直接有關(guān)。采用結(jié)構(gòu)化程序設(shè)計,將程序功能合理分塊,使每個模塊或一組密切相關(guān)模塊的程序體積大小與每頁的容量相匹配,可減少頁面調(diào)度,減少內(nèi)外存交換,提高存儲效率。
在微型計算機系統(tǒng)中,存儲器的容量對軟件設(shè)計和編碼的制約很大。因此要選擇可生成較短目標代碼且存儲壓縮性能優(yōu)良的編譯程序,有時需采用匯編程序。提高存儲器效率的關(guān)鍵是程序的簡單性。影響輸入/輸出的因素輸入/輸出可分為兩種類型:
面向人(操作員)的輸入/輸出
面向設(shè)備的輸入/輸出如果操作員能夠十分方便、簡單地錄入輸入數(shù)據(jù),或者能夠十分直觀、一目了然地了解輸出信息,則可以說面向人的輸入/輸出是高效的。
關(guān)于面向設(shè)備的輸入/輸出,可以提出一些提高輸入/輸出效率的指導(dǎo)原則:
輸入/輸出的請求應(yīng)當(dāng)最小化;
對于所有的輸入/輸出操作,安排適當(dāng)?shù)木彌_區(qū),以減少頻繁的信息交換。
對輔助存儲(例如磁盤),選擇盡可能簡單的,可接受的存取方法;
對輔助存儲的輸入/輸出,應(yīng)當(dāng)成塊傳送;
對終端或打印機的輸入/輸出,應(yīng)考慮設(shè)備特性,盡可能改善輸入/輸出的質(zhì)量和速度;
任何不易理解的,對改善輸入/輸出效果關(guān)系不大的措施都是不可取的;
任何不易理解的所謂“超高效”的輸入/輸出是毫無價值的;
影響程序效率的因素:1.算法。2.存儲效率。3.I/O提高程序效率的方法:1.簡化表達式。2.少嵌套。3.避免復(fù)雜結(jié)構(gòu)。注意:1。效率要靠好的設(shè)計和優(yōu)秀的算法來達到,而不能指望語句的改進來提高。2。程序的效率和簡單性是一致的。應(yīng)“先使程序正確,再使程序有效率”,“先使程序清晰,再使程序有效率”4.程序復(fù)雜性定性度量程序復(fù)雜性主要指模塊內(nèi)程序的復(fù)雜性。它直接關(guān)聯(lián)到軟件開發(fā)費用的多少,開發(fā)周期的長短和軟件內(nèi)部潛伏錯誤的多少。減少程序復(fù)雜性,可提高軟件的簡單性和可理解性,并使軟件開發(fā)費用減少,開發(fā)周期縮短,軟件內(nèi)部潛藏錯誤減少。用途:1.估計軟件開發(fā)的工作量,成本。2.估計軟件中的錯誤數(shù)。3.評價不同軟件設(shè)計方案或不同算法的優(yōu)劣復(fù)雜性度量需要滿足的假設(shè)為了度量程序復(fù)雜性,要求:
它可以用來計算任何一個程序的復(fù)雜性;
對于不合理的程序,例如對于長度動態(tài)增長的程序,或者對于原則上無法排錯的程序,不應(yīng)當(dāng)使用它進行復(fù)雜性計算;
如果程序中指令條數(shù)、附加存儲量、計算時間增多,不會減少程序的復(fù)雜性。
1.代碼行度量法源代碼行數(shù)度量法基于兩個前提:
程序復(fù)雜性隨著程序規(guī)模的增加不均衡地增長;
控制程序規(guī)模的方法最好是采用分而治之的辦法。將一個大程序分解成若干個簡單的可理解的程序段。方法的基本考慮是統(tǒng)計一個程序模塊的源代碼行數(shù)目,并以源代碼行數(shù)做為程序復(fù)雜性的度量。設(shè)每行代碼的出錯率為每100行源程序中可能有的錯誤數(shù)目。Thayer曾指出,程序出錯率的估算范圍是從0.04%~7%之間,即每100行源程序中可能存在0.04~7個錯誤。他還指出,每行代碼的出錯率與源程序行數(shù)之間不存在簡單的線性關(guān)系。
Lipow指出,對于小程序,每行代碼出錯率為1.3%~1.8%;對于大程序,每行代碼的出錯率增加到2.7%~3.2%之間,這只是考慮了程序的可執(zhí)行部分,沒有包括程序中的說明部分。Lipow及其他研究者得出一個結(jié)論:對于少于100個語句的小程序,源代碼行數(shù)與出錯率是線性相關(guān)的。隨著程序的增大,出錯率以非線性方式增長。2.McCabe度量法(McCabe環(huán)行復(fù)雜度度量法)McCabe度量法,又稱環(huán)路復(fù)雜性度量,是一種基于程序控制流的復(fù)雜性度量方法。該方法來自于數(shù)學(xué)中圖論Myers建議,對于復(fù)合判定,例如,(A=0)∩(C=D)∪(X=‘A’)算做三個判定。為使圖成為強連通圖,從圖的入口點到出口點加一條用虛線表示的有向邊,使圖成為強連通圖。這樣就可以使用上式計算環(huán)路復(fù)雜性。在例示中,結(jié)點數(shù)n=11,弧數(shù)m=13,p=1,則有
V(G)=m-n+p=13-11+1=3.等于程序圖中弧所封閉的區(qū)域數(shù)。幾點說明環(huán)路復(fù)雜度取決于程序控制結(jié)構(gòu)的復(fù)雜度。當(dāng)程序的分支數(shù)目或循環(huán)數(shù)目增加時其復(fù)雜度也增加。環(huán)路復(fù)雜度與程序中覆蓋的路徑條數(shù)有關(guān)。環(huán)路復(fù)雜度是可加的。例如,模塊A的復(fù)雜度為3,模塊B的復(fù)雜度為4,則模塊A與模塊B的復(fù)雜度是7。模塊規(guī)模適中,標準為V(G)<=10,若V(G)>10,模塊應(yīng)拆分。
McCabe建議,對于復(fù)雜度超過10的程序,應(yīng)分成幾個小程序,以減少程序中的錯誤。Walsh用實例證實了這個建議的正確性。在McCabe復(fù)雜度為10的附近,存在出錯率的間斷躍變。McCabe環(huán)路復(fù)雜度隱含的前提是:錯誤與程序的判定加上例行子程序的調(diào)用數(shù)目成正比。加工復(fù)雜性、數(shù)據(jù)結(jié)構(gòu)、錄入與打亂輸入卡片的錯誤可以忽略不計。這種度量的缺點是:
控制流的復(fù)雜性不區(qū)分。簡單IF語句與循環(huán)語句的復(fù)雜性同等看待
嵌套IF語句與簡單CASE語句的復(fù)雜性是一樣的模塊接口復(fù)雜性沒有考慮。模塊間接口當(dāng)成一個簡單分支一樣處理順序復(fù)雜性沒有度量。一個具有1000行的順序程序與一行語句的復(fù)雜性相同Halstead的軟件科學(xué)(1977)Halstead軟件科學(xué)研究確定計算機軟件開發(fā)中的一些定量規(guī)律,它采用以下一組基本的度量值。這些度量值通常在程序產(chǎn)生之后得出,或者在設(shè)計完成之后估算出。四個基本要素:操作數(shù)(運算對象):變量名,常量,……運算符:算術(shù)運算符,邏輯運算符,關(guān)系運算符,n1=用到的不同的運算符的個數(shù),
n2=不同操作數(shù)的個數(shù),N1=總運算符的個數(shù),
N2=總操作數(shù)的個數(shù)。
程序長度(預(yù)測的Halstead長度)
令n1表示程序中不同運算符(包括保留字)的個數(shù),令n2表示程序中不同運算對象的個數(shù),令H表示“程序長度”,則有
H=n1
log2n1+n2
log2n2這里,H是程序長度的預(yù)測值,它不等于程序中語句個數(shù)。
在定義中,運算符包括:
算術(shù)運算符
賦值符(=或:=)
邏輯運算符
分界符(,或;或:)
關(guān)系運算符
括號運算符
子程序調(diào)用符
數(shù)組操作符
循環(huán)操作符等。特別地,成對的運算符,例如
“begin…end”、“for…to”、
“repeat…until”、“while…do”、
“if…then…else”、“(…)”等都當(dāng)
做單一運算符。
運算對象包括變量名和常數(shù)。實際的Halstead長度
設(shè)N1為程序中實際出現(xiàn)的運算符總個數(shù),N2為程序中實際出現(xiàn)的運算對象總個數(shù),N為實際的Halstead長度,則有
N=N1+N2
程序的詞匯表
Halstead定義程序的詞匯表為不同的運算符種類數(shù)n1和不同的運算對象種類數(shù)n2的總和。若令n為程序的詞匯表,則有
n=n1+n2
例如,用FORTRAN語言寫出的交換排序的例子
SUBROUTINESORT(X,N)
DIMENSIONX(N)
IF(N.LT.2)RETURN
DO20I=2,N
DO10J=1,I
IF(X(I).GE.X(J))GOTO10
SAVE=X(I)
X(I)=X(J)
X(J)=SAVE
10CONTINUE
20CONTINUE
RETURN
END
因此有:
預(yù)測的Halstead長度
H=n1
log2n1+n2
log2n2=10
log210+7
log27=52.87
實際的Halstead長度
N=N1+N2=28+22=50
程序的詞匯表
n=n1+n2=10+7=17
程序量
程序量
V可用下式得到
V=N
log2n
它表明了程序在詞匯上的復(fù)雜性。其最小值為V*=(2+n2*)
log2(2+n2*)
這里,2表明程序中至少有兩個運算符:賦值符
=
和函數(shù)調(diào)用符
f()
,n2*表示輸入/輸出變量個數(shù)。程序量V=(28+22)
log2(10+7)=204等效的匯編語言程序的V=328。這說明匯編語言比FORTRAN語言需要更多的信息量(以bit表示)。
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年職業(yè)健康培訓(xùn)試題(含答案)
- 私人定制化培訓(xùn)課程設(shè)計與實施
- 校長管理培訓(xùn)心得與反思
- 2026年建筑行業(yè)施工項目成本管理項目分析方案
- 聚焦2026年能源消耗優(yōu)化分析方案
- 面向2026年醫(yī)療AI應(yīng)用的影像診斷輔助系統(tǒng)評估方案
- 面向2026智慧城市交通流優(yōu)化分析方案
- 針對2026年5G技術(shù)普及的通信服務(wù)方案
- 適配制造業(yè)2026年供應(yīng)鏈搜索效率提升方案
- 學(xué)校學(xué)習(xí)輔導(dǎo)與課外活動管理制度
- DB21-T 4279-2025 黑果腺肋花楸農(nóng)業(yè)氣象服務(wù)技術(shù)規(guī)程
- 2026廣東廣州市海珠區(qū)住房和建設(shè)局招聘雇員7人考試參考試題及答案解析
- 2026新疆伊犁州新源縣總工會面向社會招聘工會社會工作者3人考試備考題庫及答案解析
- 廣東省汕頭市2025-2026學(xué)年高三上學(xué)期期末語文試題(含答案)(含解析)
- 110接處警課件培訓(xùn)
- DB15∕T 385-2025 行業(yè)用水定額
- 2025四川數(shù)據(jù)集團有限公司第四批員工招聘5人參考題庫含答案解析(奪冠)
- 火箭軍教學(xué)課件
- 新媒體運營專員筆試考試題集含答案
- 護理不良事件之血標本采集錯誤分析與防控
- 數(shù)字孿生技術(shù)服務(wù)協(xié)議2025
評論
0/150
提交評論