




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
程序編碼結(jié)構(gòu)化程序設(shè)計(jì)程序設(shè)計(jì)風(fēng)格程序復(fù)雜性度量做為軟件工程過程的一個(gè)階段,程序編碼是設(shè)計(jì)的繼續(xù)。程序設(shè)計(jì)語言的特性和程序設(shè)計(jì)風(fēng)格會(huì)深刻地影響軟件的質(zhì)量和可維護(hù)性。為了保證程序編碼的質(zhì)量,程序員必須深刻地理解、熟練地掌握并正確地運(yùn)用程序設(shè)計(jì)語言的特性。此外,還要求源程序具有良好的結(jié)構(gòu)性和良好的程序設(shè)計(jì)風(fēng)格。結(jié)構(gòu)化程序設(shè)計(jì)結(jié)構(gòu)化程序設(shè)計(jì)主要包括兩方面:(1)在編寫程序時(shí),強(qiáng)調(diào)使用幾種基本控制結(jié)構(gòu),通過組合嵌套,形成程序的控制結(jié)構(gòu)。盡可能避免使用GOTO語句。(2)在程序設(shè)計(jì)過程中,盡量采用自頂向下和逐步細(xì)化的原則,由粗到細(xì),一步步展開。
語言中沒有的控制結(jié)構(gòu),可用一段等價(jià)的程序段模擬,但要求該程序段在整個(gè)系統(tǒng)中應(yīng)前后一致。嚴(yán)格控制GOTO語句,僅在下列情形才可使用:
①用一個(gè)非結(jié)構(gòu)化的程序設(shè)計(jì)語言去實(shí)現(xiàn)一個(gè)結(jié)構(gòu)化的構(gòu)造。
②若不使用GOTO語句就會(huì)使程序功能模糊。
③在某種可以改善而不是損害程序可讀性的情況下。
例1打印A,B,C三數(shù)中最小者的程序
程序1
if(A<
B)
goto120;
if(
B<
C)goto110;100write(C);
goto140;110write(B);
goto140;120if(A
<
C)goto130;
goto100;130write(A);140end
例2用二分法求方程f(x)=0在區(qū)間[a..b]中的根的程序
假設(shè)在閉區(qū)間[a..b]上函數(shù)f(x)有唯一的一個(gè)零點(diǎn)f0=f(a);f1=f(b); //程序1if(f0*f1<=0){
x0=a;x1=b;
for(i=1;i<=n;i++){
xm=(x0+x1)/2;fm=f(xm);
if(abs(fm)<eps||abs(x1-x0)<eps)
goto
finish;
if(f0*fm>0)
{x0=xm;f0=fm;}
else
x1=xm;
}
finish:printf(“\nTherootofthisequationis%d\n”,xm);}單入口,兩出口正常出口是循環(huán)達(dá)到n
次,非正常出口是循環(huán)中途控制轉(zhuǎn)出到標(biāo)號(hào)finish
所在位置可讀性好f0=f(a);f1=f(b);//程序3
if(f0*f1<=0){
x0=a;x1=b;i=1;finished=0;
while(i<=n&&finished==0){
xm=(x0+x1)/2;fm=f(xm);
if(abs(fm)<eps||abs(x1-x0)<eps)
finished=1;if(finished==0)
if(f0*fm>0)
{
x0=xm;f0=fm;}
else
x1=xm;
}}引入布爾變量finished,改for型循環(huán)為while型,將單入口多出口結(jié)構(gòu)改為單入口單出口結(jié)構(gòu)。
自頂向下,逐步求精在詳細(xì)設(shè)計(jì)和編碼階段,應(yīng)當(dāng)采取自頂向下,逐步求精的方法。把一個(gè)模塊的功能逐步分解,細(xì)化為一系列具體的步驟,進(jìn)而翻譯成一系列用某種程序設(shè)計(jì)語言寫成的程序。main
(){//程序框架
建立2到100的數(shù)組A[],其中A[i]=i;
-----------------------------------1
建立2到10的素?cái)?shù)表B[],其中存放2到10以內(nèi)的素?cái)?shù);-----------2
若A[i]=i是B[]中任一數(shù)的倍數(shù),則剔除A[i];---------------------3
輸出A[]中所有沒有被剔除的數(shù);
-----------------------------------4}
main(){
/*建立2到100的數(shù)組A[],其中A[i]=i*/
for(i=2;i<=100;i++)A[i]=i;
/*建立2到10的素?cái)?shù)表B[],其中存放2到10以內(nèi)的素?cái)?shù)*/
B[1]=2;B[2]=3;B[3]=5;B[4]=7;
/*若A[i]=i是B[]中任一數(shù)的倍數(shù),則剔除A[i]*/
for(j=1;j<=4;j++)檢查A[]所有的數(shù)能否被B[j]整除并將能被整除的數(shù)從A[]中剔除;-----3.1
/*輸出A[]中所有沒有被剔除的數(shù)*/
for(i=2;i<=100;i++)
若A[i]沒有被剔除,則輸出之
---4.1}對(duì)框架中的局部再做細(xì)化,得到整個(gè)程序。
for(i=2;i<=100;i++)
if(A[i]/B[j]*B[j]==A[i])
A[i]=0;
/*輸出A[]中所有沒有被剔除的數(shù)*/
for(i=2;i<=100;i++)
/*若A[i]沒有被剔除,則輸出之*/
if(A[i]!=0)
printf(
“A[%d]=%d\n”,i,A[i]);
}自頂向下,逐步求精方法的優(yōu)點(diǎn)符合人們解決復(fù)雜問題的普遍規(guī)律??商岣哕浖_發(fā)的成功率和生產(chǎn)率用先全局后局部,先整體后細(xì)節(jié),先抽象后具體的逐步求精的過程開發(fā)出來的程序具有清晰的層次結(jié)構(gòu),程序容易閱讀和理解程序自頂向下,逐步細(xì)化,分解成一個(gè)樹形結(jié)構(gòu)。在同一層的節(jié)點(diǎn)上的細(xì)化工作相互獨(dú)立。有利于編碼、測(cè)試和集成程序清晰和模塊化,使得在修改和重新設(shè)計(jì)一個(gè)軟件時(shí),可復(fù)用的代碼量最大每一步工作僅在上層節(jié)點(diǎn)的基礎(chǔ)上做不多的設(shè)計(jì)擴(kuò)展,便于檢查有利于設(shè)計(jì)的分工和組織工作。
源程序文檔化
標(biāo)識(shí)符的命名
安排注釋
程序的視覺組織符號(hào)名的命名符號(hào)名即標(biāo)識(shí)符,包括模塊名、變量名、常量名、標(biāo)號(hào)名、子程序名、、數(shù)據(jù)區(qū)名以及緩沖區(qū)名等。這些名字應(yīng)能反映它所代表的實(shí)際東西,應(yīng)有一定實(shí)際意義。例如,表示次數(shù)的量用Times,表示總量的用Total,表示平均值的用Average,表示和的量用Sum等。
序言性注釋通常置于每個(gè)程序模塊的開頭部分,它應(yīng)當(dāng)給出程序的整體說明,對(duì)于理解程序本身具有引導(dǎo)作用。有些軟件開發(fā)部門對(duì)序言性注釋做了明確而嚴(yán)格的規(guī)定,要求程序編制者逐項(xiàng)列出。有關(guān)項(xiàng)目包括:
程序標(biāo)題;有關(guān)本模塊功能和目的的說明;
主要算法;
接口說明:包括調(diào)用形式,參數(shù)描述,子程序清單;
有關(guān)數(shù)據(jù)描述:重要的變量及其用途,約束或限制條件,以及其它有關(guān)信息;
模塊位置:在哪一個(gè)源文件中,或隸屬于哪一個(gè)軟件包;
開發(fā)簡(jiǎn)歷:模塊設(shè)計(jì)者,復(fù)審者,復(fù)審日期,修改日期及有關(guān)說明等。功能性注釋功能性注釋嵌在源程序體中,用以描述其后的語句或程序段是在做什么工作,或是執(zhí)行了下面的語句會(huì)怎么樣。而不要解釋下面怎么做。例如,
/*ADDAMOUNTTOTOTAL*/
TOTAL=AMOUNT+TOTAL
不好。
如果注明把月銷售額計(jì)入年度總額,便使讀者理解了下面語句的意圖:
/*ADDMONTHLY-SALESTOANNUAL-TOTAL*/
TOTAL=AMOUNT+TOTAL要點(diǎn)描述一段程序,而不是每一個(gè)語句;用縮進(jìn)和空行,使程序與注釋容易區(qū)別;注釋要正確。視覺組織
空格、空行和移行恰當(dāng)?shù)乩每崭?,可以突出運(yùn)算的優(yōu)先性,避免發(fā)生運(yùn)算的錯(cuò)誤。例如,將表達(dá)式
(A<-17)ANDNOT(B<=49)ORC
寫成
(A<-17)ANDNOT(B<=49)ORC自然的程序段之間可用空行隔開;移行也叫做向右縮格。它是指程序中的各行不必都在左端對(duì)齊,都從第一格起排列。這樣做使程序完全分不清層次關(guān)系。對(duì)于選擇語句和循環(huán)語句,把其中的程序段語句向右做階梯式移行。使程序的邏輯結(jié)構(gòu)更加清晰。例如,兩重選擇結(jié)構(gòu)嵌套,寫成下面的移行形式,層次就清楚得多。
IF(…)THEN
IF(…)THEN
……
ELSE
……
ENDIF
……
ELSE
……
ENDIF數(shù)據(jù)說明在設(shè)計(jì)階段已經(jīng)確定了數(shù)據(jù)結(jié)構(gòu)的組織及其復(fù)雜性。在編寫程序時(shí),則需要注意數(shù)據(jù)說明的風(fēng)格。為了使程序中數(shù)據(jù)說明更易于理解和維護(hù),必須注意以下幾點(diǎn)。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ù)屬性容易查找,也有利于測(cè)試,排錯(cuò)和維護(hù)。原則上,數(shù)據(jù)說明的次序與語法無關(guān),其次序是任意的。但出于閱讀、理解和維護(hù)的需要,最好使其規(guī)范化,使說明的先后次序固定。
例如,在FORTRAN程序中數(shù)據(jù)說明次序 ①常量說明 ②簡(jiǎn)單變量類型說明 ③數(shù)組說明 ④公用數(shù)據(jù)塊說明 ⑤所有的文件說明在類型說明中還可進(jìn)一步要求。例如,可按如下順序排列: ①整型量說明 ②實(shí)型量說明 ③字符量說明 ④邏輯量說明說明語句中變量安排有序化當(dāng)多個(gè)變量名在一個(gè)說明語句中說明時(shí),應(yīng)當(dāng)對(duì)這些變量按字母的順序排列。帶標(biāo)號(hào)的全程數(shù)據(jù)(如FORTRAN的公用塊)也應(yīng)當(dāng)按字母的順序排列。例如,把
integer
size,length,width,cost,price
寫成
integer
cost,length,price,size,width
使用注釋說明復(fù)雜數(shù)據(jù)結(jié)構(gòu)如果設(shè)計(jì)了一個(gè)復(fù)雜的數(shù)據(jù)結(jié)構(gòu),應(yīng)當(dāng)使用注釋來說明在程序?qū)崿F(xiàn)時(shí)這個(gè)數(shù)據(jù)結(jié)構(gòu)的固有特點(diǎn)。例如,對(duì)PL/1的鏈表結(jié)構(gòu)和Pascal中用戶自定義的數(shù)據(jù)類型,都應(yīng)當(dāng)在注釋中做必要的補(bǔ)充說明。語句結(jié)構(gòu)在設(shè)計(jì)階段確定了軟件的邏輯流結(jié)構(gòu),但構(gòu)造單個(gè)語句則是編碼階段的任務(wù)。語句構(gòu)造力求簡(jiǎn)單,直接,不能為了片面追求效率而使語句復(fù)雜化。1.在一行內(nèi)只寫一條語句在一行內(nèi)只寫一條語句,并且采取適當(dāng)?shù)囊菩懈袷剑钩绦虻倪壿嫼凸δ茏兊酶用鞔_。許多程序設(shè)計(jì)語言允許在一行內(nèi)寫多個(gè)語句。但這種方式會(huì)使程序可讀性變差。因而不可取。
例如,有一段排序程序
FORI:=1TON-1DOBEGINT:=I;FORJ:=I+1TONDOIFA[J]<A[T]THENT:=J;IFT≠ITHENBEGINWORK:=A[T];A[T]:=A[I];A[I]:=WORK;ENDEND;由于一行中包括了多個(gè)語句,掩蓋了程序的循環(huán)結(jié)構(gòu)和條件結(jié)構(gòu),使其可讀性變得很差。FORI:=1TON-1DO//改進(jìn)布局
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)考慮清晰性,不要刻意追求技巧性,使程序編寫得過于緊湊。例如,有一個(gè)用Pascal語句寫出的程序段:
A[I]:=A[I]+A[T];
A[T]:=A[I]-A[T];
A[I]:=A[I]-A[T];
此段程序可能不易看懂,有時(shí)還需用實(shí)際數(shù)據(jù)試驗(yàn)一下。實(shí)際上,這段程序的功能就是交換A[I]和A[T]中的內(nèi)容。目的是為了節(jié)省一個(gè)工作單元。如果改一下:
WORK:=A[T];
A[T]:=A[I];
A[I]:=WORK;
就能讓讀者一目了然了。
3.程序要能直截了當(dāng)?shù)卣f明程序員的用意。程序編寫得要簡(jiǎn)單,寫清楚,直截了當(dāng)?shù)卣f明程序員的用意。例如,
DO5I=1,N
DO5J=1,N
5V(I,J)=(I/J)*(J/I)
除法運(yùn)算(/)在除數(shù)和被除數(shù)都是整型量時(shí),其結(jié)果只取整數(shù)部分,而得到整型量。當(dāng)I<J時(shí),I/J=0
當(dāng)J<I時(shí),J/I=0
得到的數(shù)組當(dāng)I≠J時(shí)
V(I,J)=(I/J)*(J/I)=0當(dāng)I=J時(shí)
V(I,J)=(I/J)*(J/I)=1這樣得到的結(jié)果V是一個(gè)單位矩陣。寫成以下的形式,就能讓讀者直接了解程序編寫者的意圖。
DO5I=1,N
DO5J=1,N
IF(I.EQ.J)THEN
V(I,J)=1.0
ELSE
V(I,J)=0.0
ENDIF
5CONTINUE
4.除非對(duì)效率有特殊的要求,程序編寫要做到清晰第一,效率第二。不要為了追求效率而喪失了清晰性。事實(shí)上,程序效率的提高主要應(yīng)通過選擇高效的算法來實(shí)現(xiàn)。5.首先要保證程序正確,然后才要求提高速度。反過來說,在使程序高速運(yùn)行時(shí),首先要保證它是正確的。
6.避免使用臨時(shí)變量而使可讀性下降。例如,有的程序員為了追求效率,往往喜歡把表達(dá)式
A[I]+1/A[I];寫成AI=A[I];X=AI+1/AI;這樣將一句分成兩句寫,會(huì)產(chǎn)生意想不到的問題。7.讓編譯程序做簡(jiǎn)單的優(yōu)化。8.盡可能使用庫(kù)函數(shù)9.避免不必要的轉(zhuǎn)移。同時(shí)如果能保持程序可讀性,則不必用GOTO語句。例如,有一個(gè)求三個(gè)數(shù)中最小值的程序:
IF(X<Y)GOTO30
IF(Y<Z)GOTO50
SMALL=ZGOTO7030IF(X<Z)GOTO60
SMALL=Z
GOTO7050SMALL=Y(jié)GOTO7060SMALL=X70CONTINUE程序只需編寫成:SMALL=X
IF(Y.LT.SMALL)SMALL=Y(jié)
IF(Z.LT.SMALL)SMALL=Z所以程序應(yīng)當(dāng)簡(jiǎn)單,不必過于深?yuàn)W,避免使用GOTO語句繞來繞去。10.盡量只采用三種基本的控制結(jié)構(gòu)來編寫程序。除順序結(jié)構(gòu)外,使用IF-THEN-ELSE來實(shí)現(xiàn)選擇結(jié)構(gòu);使用DO-UNTIL或DO-WHILE來實(shí)現(xiàn)循環(huán)結(jié)構(gòu)。
11.避免使用空的ELSE語句和IF…THENIF…的語句。這種結(jié)構(gòu)容易使讀者產(chǎn)生誤解。例如,
IF(CHAR>='A’)THEN
IF(CHAR<='Z’)THEN
PRINT“Thisisaletter?!?/p>
ELSE
PRINT“Thisisnotaletter?!?/p>
可能產(chǎn)生二義性問題。
12.避免采用過于復(fù)雜的條件測(cè)試。13.盡量減少使用“否定”條件的條件語句。例如,如果在程序中出現(xiàn)
IFNOT((CHAR<‘0’)OR(CHAR>‘9’))THEN……
改成
IF(CHAR>='0’)AND(CHAR<='9’)THEN……
不要讓讀者繞彎子想。14.盡可能用通俗易懂的偽碼來描述程序的流程,然后再翻譯成必須使用的語言。15.數(shù)據(jù)結(jié)構(gòu)要有利于程序的簡(jiǎn)化。16.要模塊化,使模塊功能盡可能單一化,模塊間的耦合能夠清晰可見。17.利用信息隱蔽,確保每一個(gè)模塊的獨(dú)立性。18.從數(shù)據(jù)出發(fā)去構(gòu)造程序。19.不要修補(bǔ)不好的程序,要重新編寫。也不要一味地追求代碼的復(fù)用,要重新組織。20.對(duì)太大的程序,要分塊編寫、測(cè)試,然后再集成。21.對(duì)遞歸定義的數(shù)據(jù)結(jié)構(gòu)盡量使用遞歸過程。輸入和輸出輸入和輸出信息是與用戶的使用直接相關(guān)的。輸入和輸出的方式和格式應(yīng)當(dāng)盡可能方便用戶的使用。一定要避免因設(shè)計(jì)不當(dāng)給用戶帶來的麻煩。因此,在軟件需求分析階段和設(shè)計(jì)階段,就應(yīng)基本確定輸入和輸出的風(fēng)格。系統(tǒng)能否被用戶接受,有時(shí)就取決于輸入和輸出的風(fēng)格。
不論是批處理的輸入/輸出方式,還是交互式的輸入/輸出方式,在設(shè)計(jì)和程序編碼時(shí)都應(yīng)考慮下列原則:
1.對(duì)所有的輸入數(shù)據(jù)都要進(jìn)行檢驗(yàn),識(shí)別錯(cuò)誤的輸入,以保證每個(gè)數(shù)據(jù)的有效性;
2.
檢查輸入項(xiàng)的各種重要組合的合理性,必要時(shí)報(bào)告輸入狀態(tài)信息;
3.使得輸入的步驟和操作盡可能簡(jiǎn)單,并保持簡(jiǎn)單的輸入格式;
4.輸入數(shù)據(jù)時(shí),應(yīng)允許使用自由格式輸入;
5.應(yīng)允許缺省值;
6.輸入一批數(shù)據(jù)時(shí),最好使用輸入結(jié)束標(biāo)志,而不要由用戶指定輸入數(shù)據(jù)數(shù)目;
7.在交互式輸入輸入時(shí),要在屏幕上使用提示符明確提示交互輸入的請(qǐng)求,指明可使用選擇項(xiàng)的種類和取值范圍。同時(shí),在數(shù)據(jù)輸入的過程中和輸入結(jié)束時(shí),也要在屏幕上給出狀態(tài)信息;
8.當(dāng)程序設(shè)計(jì)語言對(duì)輸入/輸出格式有嚴(yán)格要求時(shí),應(yīng)保持輸入格式與輸入語句的要求的一致性;
9.給所有的輸出加注解,并設(shè)計(jì)輸出報(bào)表格式。
輸入/輸出風(fēng)格還受到許多其它因素的影響。如輸入/輸出設(shè)備(例如終端的類型,圖形設(shè)備,數(shù)字化轉(zhuǎn)換設(shè)備等)、用戶的熟練程度、以及通信環(huán)境等。
程序效率討論效率的準(zhǔn)則
程序的效率是指程序的執(zhí)行速度及程序所需占用的內(nèi)存的存儲(chǔ)空間。程序編碼是最后提高運(yùn)行速度和節(jié)省存儲(chǔ)的機(jī)會(huì),因此在此階段不能不考慮程序的效率。讓我們首先明確討論程序效率的幾條準(zhǔn)則效率是一個(gè)性能要求,應(yīng)當(dāng)在需求分析階段給出。軟件效率以需求為準(zhǔn),不應(yīng)以人力所及為準(zhǔn)。好的設(shè)計(jì)可以提高效率。程序的效率與程序的簡(jiǎn)單性相關(guān)。一般說來,任何對(duì)效率無重要改善,且對(duì)程序的簡(jiǎn)單性、可讀性和正確性不利的程序設(shè)計(jì)方法都是不可取的。算法對(duì)效率的影響源程序的效率與詳細(xì)設(shè)計(jì)階段確定的算法的效率直接有關(guān)。在詳細(xì)設(shè)計(jì)翻譯轉(zhuǎn)換成源程序代碼后,算法效率反映為程序的執(zhí)行速度和存儲(chǔ)容量的要求。設(shè)計(jì)向程序轉(zhuǎn)換過程中的指導(dǎo)原則:
①在編程序前,盡可能化簡(jiǎn)有關(guān)的算術(shù)表達(dá)式和邏輯表達(dá)式;
②仔細(xì)檢查算法中的嵌套的循環(huán),盡可能將某些語句或表達(dá)式移到循環(huán)外面;
③盡量避免使用多維數(shù)組;
④盡量避免使用指針和復(fù)雜的表;
⑤采用“快速”的算術(shù)運(yùn)算;
⑥不要混淆數(shù)據(jù)類型,避免在表達(dá)式中出現(xiàn)類型混雜;⑦盡量采用整數(shù)算術(shù)表達(dá)式和布爾表達(dá)式;⑧選用等效的高效率算法;許多編譯程序具有“優(yōu)化”功能,可以自動(dòng)生成高效率的目標(biāo)代碼。影響存儲(chǔ)器效率的因素在大中型計(jì)算機(jī)系統(tǒng)中,存儲(chǔ)限制不再是主要問題。在這種環(huán)境下,對(duì)內(nèi)存采取基于操作系統(tǒng)的分頁功能的虛擬存儲(chǔ)管理。存儲(chǔ)效率與操作系統(tǒng)的分頁功能直接有關(guān)。采用結(jié)構(gòu)化程序設(shè)計(jì),將程序功能合理分塊,使每個(gè)模塊或一組密切相關(guān)模塊的程序體積大小與每頁的容量相匹配,可減少頁面調(diào)度,減少內(nèi)外存交換,提高存儲(chǔ)效率。
在微型計(jì)算機(jī)系統(tǒng)中,存儲(chǔ)器的容量對(duì)軟件設(shè)計(jì)和編碼的制約很大。因此要選擇可生成較短目標(biāo)代碼且存儲(chǔ)壓縮性能優(yōu)良的編譯程序,有時(shí)需采用匯編程序。提高存儲(chǔ)器效率的關(guān)鍵是程序的簡(jiǎn)單性。影響輸入/輸出的因素輸入/輸出可分為兩種類型:面向人(操作員)的輸入/輸出面向設(shè)備的輸入/輸出如果操作員能夠十分方便、簡(jiǎn)單地錄入輸入數(shù)據(jù),或者能夠十分直觀、一目了然地了解輸出信息,則可以說面向人的輸入/輸出是高效的。
關(guān)于面向設(shè)備的輸入/輸出,可以提出一些提高輸入/輸出效率的指導(dǎo)原則:
輸入/輸出的請(qǐng)求應(yīng)當(dāng)最小化;對(duì)于所有的輸入/輸出操作,安排適當(dāng)?shù)木彌_區(qū),以減少頻繁的信息交換。對(duì)輔助存儲(chǔ)(例如磁盤),選擇盡可能簡(jiǎn)單的,可接受的存取方法;
對(duì)輔助存儲(chǔ)的輸入/輸出,應(yīng)當(dāng)成塊傳送;
對(duì)終端或打印機(jī)的輸入/輸出,應(yīng)考慮設(shè)備特性,盡可能改善輸入/輸出的質(zhì)量和速度;任何不易理解的,對(duì)改善輸入/輸出效果關(guān)系不大的措施都是不可取的;任何不易理解的所謂“超高效”的輸入/輸出是毫無價(jià)值的;
程序復(fù)雜性度量程序復(fù)雜性主要指模塊內(nèi)程序的復(fù)雜性。它直接關(guān)聯(lián)到軟件開發(fā)費(fèi)用的多少,開發(fā)周期的長(zhǎng)短和軟件內(nèi)部潛伏錯(cuò)誤的多少。減少程序復(fù)雜性,可提高軟件的簡(jiǎn)單性和可理解性,并使軟件開發(fā)費(fèi)用減少,開發(fā)周期縮短,軟件內(nèi)部潛藏錯(cuò)誤減少。復(fù)雜性度量需要滿足的假設(shè)為了度量程序復(fù)雜性,要求:它可以用來計(jì)算任何一個(gè)程序的復(fù)雜性;對(duì)于不合理的程序,例如對(duì)于長(zhǎng)度動(dòng)態(tài)增長(zhǎng)的程序,或者對(duì)于原則上無法排錯(cuò)的程序,不應(yīng)當(dāng)使用它進(jìn)行復(fù)雜性計(jì)算;如果程序中指令條數(shù)、附加存儲(chǔ)量、計(jì)算時(shí)間增多,不會(huì)減少程序的復(fù)雜性。
代碼行度量法源代碼行數(shù)度量法基于兩個(gè)前提:
程序復(fù)雜性隨著程序規(guī)模的增加不均衡地增長(zhǎng);控制程序規(guī)模的方法最好是采用分而治之的辦法。將一個(gè)大程序分解成若干個(gè)簡(jiǎn)單的可理解的程序段。方法的基本考慮是統(tǒng)計(jì)一個(gè)程序模塊的源代碼行數(shù)目,并以源代碼行數(shù)做為程序復(fù)雜性的度量。設(shè)每行代碼的出錯(cuò)率為每100行源程序中可能有的錯(cuò)誤數(shù)目。Thayer曾指出,程序出錯(cuò)率的估算范圍是從0.04%~7%之間,即每100行源程序中可能存在0.04~7個(gè)錯(cuò)誤。他還指出,每行代碼的出錯(cuò)率與源程序行數(shù)之間不存在簡(jiǎn)單的線性關(guān)系。
Lipow指出,對(duì)于小程序,每行代碼出錯(cuò)率為1.3%~1.8%;對(duì)于大程序,每行代碼的出錯(cuò)率增加到2.7%~3.2%之間,這只是考慮了程序的可執(zhí)行部分,沒有包括程序中的說明部分。Lipow及其他研究者得出一個(gè)結(jié)論:對(duì)于少于100個(gè)語句的小程序,源代碼行數(shù)與出錯(cuò)率是線性相關(guān)的。隨著程序的增大,出錯(cuò)率以非線性方式增長(zhǎng)。
McCabe度量法McCabe度量法,又稱環(huán)路復(fù)雜性度量,是一種基于程序控制流的復(fù)雜性度量方法。它基于一個(gè)程序模塊的程序圖中環(huán)路的個(gè)數(shù),因此計(jì)算它先要畫出程序圖。程序圖是退化的程序流程圖。流程圖中每個(gè)處理都退化成一個(gè)結(jié)點(diǎn),流線變成連接不同結(jié)點(diǎn)的有向弧。程序圖僅描述程序內(nèi)部的控制流程,完全不表現(xiàn)對(duì)數(shù)據(jù)的具體操作,以及分支和循環(huán)的具體條件。計(jì)算環(huán)路復(fù)雜性的方法:根據(jù)圖論,在一個(gè)強(qiáng)連通的有向圖G中,環(huán)的個(gè)數(shù)由以下公式給出:
V(G)=m-n+p
其中,V(G)是有向圖G中環(huán)路個(gè)數(shù),m是圖G中弧數(shù),n是圖G中結(jié)點(diǎn)數(shù),p是圖G中的強(qiáng)連通分量個(gè)數(shù)。Myers建議,對(duì)于復(fù)合判定,例如,(A=0)∩(C=D)∪(X=‘A’)算做三個(gè)判定。為使圖成為強(qiáng)連通圖,從圖的入口點(diǎn)到出口點(diǎn)加一條用虛線表示的有向邊,使圖成為強(qiáng)連通圖。這樣就可以使用上式計(jì)算環(huán)路復(fù)雜性。在例示中,結(jié)點(diǎn)數(shù)n=11,弧數(shù)m=13,p=1,則有
V(G)=m-n+p=13-11+1=3.等于程序圖中弧所封閉的區(qū)域數(shù)。
幾點(diǎn)說明環(huán)路復(fù)雜度取決于程序控制結(jié)構(gòu)的復(fù)雜度。當(dāng)程序的分支數(shù)目或循環(huán)數(shù)目增加時(shí)其復(fù)雜度也增加。環(huán)路復(fù)雜度與程序中覆蓋的路徑條數(shù)有關(guān)。環(huán)路復(fù)雜度是可加的。例如,模塊A的復(fù)雜度為3,模塊B的復(fù)雜度為4,則模塊A與模塊B的復(fù)雜度是7。
McCabe建議,對(duì)于復(fù)雜度超過10的程序,應(yīng)分成幾個(gè)小程序,以減少程序中的錯(cuò)誤。Walsh用實(shí)例證實(shí)了這個(gè)建議的正確性。在McCabe復(fù)雜度為10的附近,存在出錯(cuò)率的間斷躍變。McCabe環(huán)路復(fù)雜度隱含的前提是:錯(cuò)誤與程序的判定加上例行子程序的調(diào)用數(shù)目成正比。加工復(fù)雜性、數(shù)據(jù)結(jié)構(gòu)、錄入與打亂輸入卡片的錯(cuò)誤可以忽略不計(jì)。這種度量的缺點(diǎn)是:對(duì)于不同種類的控制流的復(fù)雜性不能區(qū)分
簡(jiǎn)單IF語句與循環(huán)語句的復(fù)雜性同等看待
嵌套IF語句與簡(jiǎn)單CASE語句的復(fù)雜性是一樣的
模塊間接口當(dāng)成一個(gè)簡(jiǎn)單分支一樣處理一個(gè)具有1000行的順序程序與一行語句的復(fù)雜性相同
Halstead的軟件科學(xué)Halstead軟件科學(xué)研究確定計(jì)算機(jī)軟件開發(fā)中的一些定量規(guī)律,它采用以下一組基本的度量值。這些度量值通常在程序產(chǎn)生之后得出,或者在設(shè)計(jì)完成之后估算出。程序長(zhǎng)度(預(yù)測(cè)的Halstead長(zhǎng)度)
令n1表示程序中不同運(yùn)算符(包括保留字)的個(gè)數(shù),令n2表示程序中不同運(yùn)算對(duì)象的個(gè)數(shù),令H表示“程序長(zhǎng)度”,則有
H=n1log2n1+n2
log2n2這里,H是程序長(zhǎng)度的預(yù)測(cè)值,它不等于程序中語句個(gè)數(shù)。
在定義中,運(yùn)算符包括:算術(shù)運(yùn)算符賦值符(=或:=)邏輯運(yùn)算符分界符(,或;或:)關(guān)系運(yùn)算符括號(hào)運(yùn)算符子程序調(diào)用符數(shù)組操作符循環(huán)操作符等。特別地,成對(duì)的運(yùn)算符,例如
“BEGIN…END”、“FOR…TO”、“REPEAT…UNTIL”、“WHILE…DO”、“IF…THEN…ELSE”、“(…)”等都當(dāng)做單一運(yùn)算符。
運(yùn)算對(duì)象包括變量名和常數(shù)。實(shí)際的Halstead長(zhǎng)度
設(shè)N1為程序中實(shí)際出現(xiàn)的運(yùn)算符總個(gè)數(shù),N2為程序中實(shí)際出現(xiàn)的運(yùn)算對(duì)象總個(gè)數(shù),N為實(shí)際的Halstead長(zhǎng)度,則有
N=
N1+
N2
程序的詞匯表
Halstead定義程序的詞匯表為不同的運(yùn)算符種類數(shù)n1和不同的運(yùn)算對(duì)象種類數(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
10CONTINE
20CONTINE
RETURN
END
程序量程序量
V可用下式得到
V
=
N
log2n它表明了程序在詞匯上的復(fù)雜性。其最小值為
V*=(2+n2*)
log2(2+n2*)V這里,2表明程序中至少有兩個(gè)運(yùn)算符:賦值符=和函數(shù)調(diào)用符
f(),n2*表示輸入/輸出變量個(gè)數(shù)。
對(duì)于上面的例子,利用n1,N1,n2,N2,可以計(jì)算得H=10
log210+7
log27=52.87N=28+22=50
V=(28+22)log2(10+7)=204等效的匯編語言程序的V=328。這說明匯編語言比FORTRAN語言需要更多的信息量(以bit表示)。
程序量比率(語言的抽象級(jí)別)
L=V*/
V或L=(2/n1)(n2/N2)
它表明了一個(gè)程序的最緊湊形式的程序量與實(shí)際程序量之比,反映了程序的效率。其倒數(shù)
D=1/L表明了實(shí)現(xiàn)算法的困難程度。
程序員工作量
E=V/L
程序的潛在錯(cuò)誤
Halstead度量可以用來預(yù)測(cè)程序中的錯(cuò)誤。預(yù)測(cè)公式為
B
=(N1+N2)log2(n1+n2)/3000
B為該程序的錯(cuò)誤數(shù)。它表明程序中可能存在的差錯(cuò)B應(yīng)與程序量V成正比。
例如,一個(gè)程序?qū)?5個(gè)數(shù)據(jù)庫(kù)項(xiàng)共訪問1300次,對(duì)150個(gè)運(yùn)算符共使用了1200次,那么預(yù)測(cè)該程序的錯(cuò)誤數(shù):
B=(1200+1300)log2(75+150)/30006.5即預(yù)測(cè)該程序中可能包含6~7個(gè)錯(cuò)誤Halstead的重要結(jié)論程序的實(shí)際Halstead長(zhǎng)度N可以由詞匯表n算出。即使程序還未編制完成,也能預(yù)先算出程序的實(shí)際Halstead長(zhǎng)度N,雖然它沒有明確指出程序中到底有多少個(gè)語句。
這個(gè)結(jié)論非常有用。經(jīng)過多次驗(yàn)證,預(yù)測(cè)的Halstead長(zhǎng)度與實(shí)際的Halstead長(zhǎng)度是非常接近的。
Halstead度量的缺點(diǎn)沒有區(qū)別自己編的程序與別人編的程序。這是與實(shí)際經(jīng)驗(yàn)相違背的。這時(shí)應(yīng)將外部調(diào)用乘上一個(gè)大于1的的常數(shù)Kf
(應(yīng)在1~5之間,它與文檔資料的清晰度有關(guān))。沒有考慮非執(zhí)行語句。補(bǔ)救辦法:在統(tǒng)計(jì)n1、n2、N1、N2時(shí),可以把非執(zhí)行語句中出現(xiàn)的運(yùn)算對(duì)象,運(yùn)算符統(tǒng)計(jì)在內(nèi)。在允許混合運(yùn)算的語言中,每種運(yùn)算符與它的運(yùn)算對(duì)象相關(guān)。如果一種語言有整型、實(shí)型、雙精度型三種不同類型的運(yùn)算對(duì)象,則任何一種基本算術(shù)運(yùn)算符(+、-、×、/)實(shí)際上代表了=6種運(yùn)算符。在計(jì)算時(shí)應(yīng)考慮這種因數(shù)據(jù)類型而引起差異的情況。
沒有注意調(diào)用的深度。Halstead公式應(yīng)當(dāng)對(duì)調(diào)用子程序的不同深度區(qū)別對(duì)待。在計(jì)算嵌套調(diào)用的運(yùn)算符和運(yùn)算對(duì)象時(shí),應(yīng)乘上一個(gè)調(diào)用深度因子。這樣可以增大嵌套調(diào)用時(shí)的錯(cuò)誤預(yù)測(cè)率。沒有把不同類型的運(yùn)算對(duì)象,運(yùn)算符與不同的錯(cuò)誤發(fā)生率聯(lián)系起來,而是把它們同等看待。例如,對(duì)簡(jiǎn)單IF語句與WHILE語句就沒有區(qū)別。
忽視了嵌套結(jié)構(gòu)(嵌套的循環(huán)語句、嵌套IF語句、括號(hào)結(jié)構(gòu)等)。一般地,運(yùn)算符的嵌套序列,總比具有相同數(shù)量的運(yùn)算符和運(yùn)算對(duì)象的非嵌套序列要復(fù)雜得多。解決的辦法是對(duì)嵌套結(jié)果乘上一個(gè)嵌套因子。B3F6I9LdOgSjVmYq!t&w-z1D4G7JbMePhTkWoZr$u(x+A2E5H9KcNfRiUlXp#s&v)y0C3F6IaLdOgSjVnu*x+A2D5H8KcNfQiUlXo#s%v)y0B3F6I9LdOgSjVmYq!t&w-z1D4G7JbMePhTo#s%v(y0B3E6I9LcOgRjVmYp!t&w)z1C4G7JaMePhSkWnZr$u*x+A2D5H8KcNfQiUlXo#s%v)y0B3F6I9LdOgSjVmYq!t&w-z1D4G7JbMePhTkWnZr$u(x+A2E5H8KcNfRiUlXp#s%v)y0C3F6IaLdOgSjVnYq!t*w-z1D4G8JbMeQhTkWoZr%u(x+B2E5H9KcOfRiUmXp#s&v)z0C3F7IaLdPgSjVnYq$t*w-A1D4G8JbNeQhTlWoZr%u(y+B2E6H9KcOfRjUmXp!s&v)z0C4F7IaMdPgSkVnZq$t*x-A1D5G8KbNeQiTlWo#r%u(y+B3E6H9LcOfRjUmYp!s&w)z0C4F7NeQhTlWoZr%u(y+B2E6H9KcOfRjUmXp!s&v)z0C4F7IaMdPgSkVnZq$t*x-A1D5G8JbNeQiTlWo#r%u(y+B3E6H9LcOfRjUmYp!s&w)z0C4F7JaMdPhSkVnZq$u*x-A2D5G8KbNfQiTlXo#r%v(y0B3E6I9gSkVnYq$t*x-A1D5G8JbNeQiTlWo#r%u(y+B3E6H9LcOfRjUmYp!s&w)z0C4F7JaMdPhSkVnZq$u*x-A2D5G8KbNfQiTlXo#r%v(y+B3E6I9LcOgRjUmYp!t&w)z1C4F7JaMePhSkWnZq$u*x+A2D5H8KbNfQiUlXo#s%v(y0B3F6I9LdOgRjVmYq!t&w-z1C4G7JaMePhTkWnZr$u*x+A2E5H8KcNfQiUlXp#s%v)y0B3F6IaLdOgSjVmYq!t*w-zkWnZr$u*x+A2E5H8KcNfQiUlXp#s%v)y0B3F6IaLdOgSjVmYq!t*w-z1D4G7JbMeQhTkWoZr$u(x+B2E5H9KcNfRiUlXp#s&v)y0C3F6IaLdPgSjVnYq!t*w-A1D4G8JbMeQhTlWoZr%u(x+B2E6H9KcOfRiUmXp!s&v)z0C3F7IaMdPgSkVnYq$t*x-A1D5G8JbNeQhTlWo#r%u(y+B2E6H9LcOfRjUmXp!s&w)z0C4F7IaMdPhSkVnZq$t*x-A2D5H9KcOfRiUmXp!s&v)z0C3F7IaMdPgSkVnYq$t*x-A1D5G8JbNeQhTlWo#r%u(y+B2E6H9LcOfRjUmXp!s&w)z0C4F7IaMdPhSkVnZq$t*x-A2D9KcOfRiUmXp2E6H9LcOfRjUmXp!s&w)z0C4F7IaMdPhSkVnZq$t*x-A2D5G8KbNeQiTlXo#r%v(y+B3E6I9LcOgRjUmYp!t&w)z1C4F7JaMdPhSkWnZq$u*x-A2D5H8KbNfQiTlXo#s%v(y0B3E6I9LdOgRjVmYp!t&w-z1C4G7JaMePhTkWnZr$u*x+A2E5H8KcNfQiUlXp#s%v)y0B3F6I9LdOgSjVmYq!t&A2D5H8KbNfQiTlXo#s%v(y0B3E6I9LdOgRjVmYp!t&w-z1C4G7JaMePhTkWnZr$u*x+A2D5H8KcNfQiUlXo#s%v)y0B3F6I9LdOgSjVmYq!t&w-z1D4G7JbMePhTkWoZr$0B3E6I9LdOgRjVmYp!t&w-z1C4G7JaMePhSkWnZr$u*x+A2D5H8KcNfQiUlXo#s%v)y0B3F6I9LdOgSjVmYq!t&w-z1D4G7JbMePhTkWoZr$u(x+A2E5H9KcNfRiUlXp#s%v)y0C3F6IaLdOgSjVnYq!t*w-z1D4G8JbMeQhTkWoZr%u(x+B2E5H9KcOfRiUmXp#s&v)z0C3F7IaLdTkWoZr$u(x+A2E5H8KcNfRiUlXp#s%v)y0C3F6IaLdOgSjVnYq!t*w-z1D4G8JbMeQhTkWoZr%u(x+B2E5H9KcOfRiUmXp#s&v)z0C3F7MePhTkWnZr$u(x+A2E5H8KcNfRiUlXp#s%v)y0C3F6IaLdOgSjVnYq!t*w-z1D4G8JbMeQhTkWoZr%u(x+B2E5H9KcOfRiUmXp#s&v)y0C3F7IaLdPgSjVnYq$t*w-A1D4G8JbNeQhTlWoZr%u(y+B2E6H9KcOfRjUmXp!s&1D4G8JbMeQhTkWoZr$u(x+B2E5H9KcNfRiUmXp#s&v)y0C3F7IaLdPgSjVnYq$t*w-A1D4G8JbNeQhTlWo%v)y0C3F6IaLdOgSjVnYq!t*w-z1D4G7JbMeQhTkWoZr$u(x+B2E5H9KcNfRiUmXp#s&v)y07JbMePhTkWnZr$u(x+A2E5H8KcNfRiUlXp#s%v)y0B3F6IaLdOgSjVmYq!t*w-z1D4G7JbMeQhTkWoZr$u(x+B2E5H9KcNfRiUmXp#s&v)y0C3F7IaLdPgSjVnYq$t*w-A1D4G8JbNeQhTlWoZr%u(x+B2E6H9KcSjVmYq!t*w-z1D4G7JbMeQhTkWoZr$u(x+B2E5H9KcNfRiUmXp#s&v)y0C3F7IaLdPgSjVnYq!t*w-A1D4G8JbMeQhTlWoZr%u(x+B2E6H9KcOfRiUmXp!s&v)z0C3F7IaMdPgSkVnYq$t*x-A1DKcNfRiUmXp#s&v)y0C3F6IaLdPgSjVnYq!t*w-A1D4G8JbMeQhTlWoZr%u(x+B2E6H9KcOfRiUmXp!s&v)z0C3F7IaMdTkWoZr$u(x+A2E5H9KcNfRiUlXp#s&v)y0C3F6IaLdPgSjVnYq!t*w-A1D4G8JbMeQhTlWoZr%u(x+B2E6H9KcOfRiUmXp!s&v)z0C3F7IaLdPgSkVnYq$t*w-A1D5G8JbNeQhTlWo#r%u(y+B2E6H9LcOfRnYq!t*w-A1D4G8JbMeQhTlWoZr%u(x+B2E6H9KcOfRiUmXp#s&v)z0C3F7IaLdPgSkVnYq$t*w-AH9KcNfRiUlXp#s&v)y0C3F6IaLdPgSjVnYq!t*w-A1D4G8JbMeQhTlWoZr%u(x+B2E5H9KcOfRiUmXp#s&v)z0C3F7IaLdPgSkVnYq$t*w-A1D5G8JbNeQhTlWo#r%u(y+B2E6H9LcOfRjUmXp!s&w)z0C4F7IaMdPgS
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 無息貸款合同
- 工程服務(wù)外包合同
- 安裝工程分包合同協(xié)議書
- 學(xué)校租賃校舍合同書
- 接手項(xiàng)目合同協(xié)議
- 出讓合同解除協(xié)議
- 廣告播放合同協(xié)議
- 鋼材貿(mào)易合同協(xié)議
- 勞資協(xié)議雙向合同
- 品種轉(zhuǎn)讓協(xié)議合同
- 車隊(duì)事故分析報(bào)告總結(jié)
- 藥品追溯系統(tǒng)培訓(xùn)課件模板
- 化學(xué)藥品原料藥制造行業(yè)報(bào)告
- 工業(yè)園區(qū)的消防安全管理課件
- 2024信息安全意識(shí)培訓(xùn)ppt課件完整版含內(nèi)容
- 互聯(lián)網(wǎng)數(shù)據(jù)中心(IDC)業(yè)務(wù)介紹
- 數(shù)學(xué)模型姜啟源課件
- 法蘭快速接頭規(guī)格1
- 《中國(guó)傳統(tǒng)圖案》課件
- 手術(shù)體位經(jīng)典課件
- 【基于STM32單片機(jī)無線藍(lán)牙耳機(jī)設(shè)計(jì)5400字(論文)】
評(píng)論
0/150
提交評(píng)論