軟件工程實踐編程_第1頁
軟件工程實踐編程_第2頁
軟件工程實踐編程_第3頁
軟件工程實踐編程_第4頁
軟件工程實踐編程_第5頁
已閱讀5頁,還剩139頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

軟件工程實踐編程第一頁,共一百四十四頁,2022年,8月28日第五講軟件實現(xiàn)第二頁,共一百四十四頁,2022年,8月28日內(nèi)容和目的編程語言的選擇編程風格程序效率編碼要求靜態(tài)分析代碼審查軟件調(diào)試第三頁,共一百四十四頁,2022年,8月28日編程(編碼)編程是設計的自然結(jié)果編程語言的特性和編程風格會深刻地影響軟件的重量和可維護性軟件實現(xiàn)是一個不斷變換的過程:設計——源程序——目標代碼——機器碼為了保證程序編碼的質(zhì)量,程序員必須深刻理解、熟練掌握并正確地運用程序設計語言的特性。此外,還要求源程序具有良好的結(jié)構(gòu)性和良好的程序設計風格。第四頁,共一百四十四頁,2022年,8月28日編程的目的編碼的目的是使用選定的程序設計語言,把模塊的過程性描述翻譯為用該語言書寫的源程序(源代碼)模塊的過程性描述(不可執(zhí)行的)源程序(可執(zhí)行的)編碼第五頁,共一百四十四頁,2022年,8月28日結(jié)構(gòu)化程序設計結(jié)構(gòu)化程序設計是一種設計程序的技術(shù)它采用自頂向下逐步細化的設計方法和單入口(Singleentry)單出口(Singleexit)的控制結(jié)構(gòu)這種控制結(jié)構(gòu)包括有:順序選擇循環(huán)第六頁,共一百四十四頁,2022年,8月28日結(jié)構(gòu)化程序設計的原則1、使用語言中的順序、選擇、重復等有限的基本控制結(jié)構(gòu)表示程序2、選用的控制結(jié)構(gòu)只準許有一個入口和一個出口3、程序語句組成容易識別的塊(Block),每塊只有一個入口和一個出口4、復雜結(jié)構(gòu)應該用基本控制結(jié)構(gòu)進行組合嵌套來實現(xiàn)5、嚴格控制GOTO語句第七頁,共一百四十四頁,2022年,8月28日編程語言的選擇應用領(lǐng)域算法及運算的復雜性軟件運行的環(huán)境性能數(shù)據(jù)結(jié)構(gòu)的復雜性軟件開發(fā)組成員對該語言的熟悉程度第八頁,共一百四十四頁,2022年,8月28日編程風格程序必須是可以理解的程序的風格應該強調(diào)簡單和清晰影響程序風格的因素有:源程序文檔化數(shù)據(jù)說明的方法語句的結(jié)構(gòu)I/O的方法第九頁,共一百四十四頁,2022年,8月28日源程序文檔化選擇好標識符(變量和標號)的名字挑選有意義的標識符名字安排注解序言式注解(頭文件)功能注解使程序的結(jié)構(gòu)一目了然縮進第十頁,共一百四十四頁,2022年,8月28日源程序文檔化

標識符的命名

安排注釋

程序的視覺組織第十一頁,共一百四十四頁,2022年,8月28日符號名的命名符號名即標識符,包括模塊名、變量名、常量名、標號名、子程序名、、數(shù)據(jù)區(qū)名以及緩沖區(qū)名等。這些名字應能反映它所代表的實際東西,應有一定實際意義。例如,表示次數(shù)的量用Times,表示總量的用Total,表示平均值的用Average,表示和的量用Sum等。第十二頁,共一百四十四頁,2022年,8月28日符號名的命名名字不是越長越好,應當選擇精煉的意義明確的名字。必要時可使用縮寫名字,但這時要注意縮寫規(guī)則要一致,并且要給每一個名字加注釋。同時,在一個程序中,一個變量只應用于一種用途。

NBALAP

N

第十三頁,共一百四十四頁,2022年,8月28日程序的注釋

夾在程序中的注釋是程序員與日后的程序讀者之間通信的重要手段。注釋決不是可有可無的。一些正規(guī)的程序文本中,注釋行的數(shù)量占到整個源程序的1/3到1/2,甚至更多。注釋分為序言性注釋和功能性注釋。第十四頁,共一百四十四頁,2022年,8月28日序言性注釋(頭文件)通常置于每個程序模塊的開頭部分,它應當給出程序的整體說明,對于理解程序本身具有引導作用。有些軟件開發(fā)部門對序言性注釋做了明確而嚴格的規(guī)定,要求程序編制者逐項列出。第十五頁,共一百四十四頁,2022年,8月28日頭文件的內(nèi)容

程序標題;有關(guān)本模塊功能和目的的說明;

主要算法;

接口說明:包括調(diào)用形式,參數(shù)描述,子程序清單;

有關(guān)數(shù)據(jù)描述:重要的變量及其用途,約束或限制條件,以及其它有關(guān)信息;

模塊位置:在哪一個源文件中,或隸屬于哪一個軟件包;

開發(fā)簡歷:模塊設計者,復審者,復審日期,修改日期及有關(guān)說明等。第十六頁,共一百四十四頁,2022年,8月28日功能性注釋功能性注釋嵌在源程序體中,用以描述其后的語句或程序段是在做什么工作,或是執(zhí)行了下面的語句會怎么樣。而不要解釋下面怎么做。例如,

/*ADDAMOUNTTOTOTAL*/

TOTAL=AMOUNT+TOTAL

不好。第十七頁,共一百四十四頁,2022年,8月28日功能性注釋如果注明把月銷售額計入年度總額,便使讀者理解了下面語句的意圖:

/*ADDMONTHLY-SALESTOANNUAL-TOTAL*/

TOTAL=AMOUNT+TOTAL要點描述一段程序,而不是每一個語句;用縮進和空行,使程序與注釋容易區(qū)別;注釋要正確。第十八頁,共一百四十四頁,2022年,8月28日視覺組織—空格、空行和移行恰當?shù)乩每崭瘢梢酝怀鲞\算的優(yōu)先性,避免發(fā)生運算的錯誤。例如,將表達式

(A<-17)ANDNOT(B<=49)ORC

寫成

(A<-17)ANDNOT(B<=49)ORC自然的程序段之間可用空行隔開;第十九頁,共一百四十四頁,2022年,8月28日視覺組織移行也叫做向右縮格。它是指程序中的各行不必都在左端對齊,都從第一格起排列。這樣做使程序完全分不清層次關(guān)系。對于選擇語句和循環(huán)語句,把其中的程序段語句向右做階梯式移行。使程序的邏輯結(jié)構(gòu)更加清晰。例如,兩重選擇結(jié)構(gòu)嵌套,寫成下面的移行形式,層次就清楚得多。第二十頁,共一百四十四頁,2022年,8月28日視覺組織

IF(…)

THEN

IF(…)

THEN

……

ELSE

……

ENDIF

……

ELSE

……

ENDIF第二十一頁,共一百四十四頁,2022年,8月28日數(shù)據(jù)說明數(shù)據(jù)說明的次序應該規(guī)范化多個變量說明時最好按字典數(shù)順序排列對復雜結(jié)構(gòu)用注解說明第二十二頁,共一百四十四頁,2022年,8月28日數(shù)據(jù)說明在設計階段已經(jīng)確定了數(shù)據(jù)結(jié)構(gòu)的組織及其復雜性。在編寫程序時,則需要注意數(shù)據(jù)說明的風格。為了使程序中數(shù)據(jù)說明更易于理解和維護,必須注意以下幾點:

1.數(shù)據(jù)說明的次序應當規(guī)范化

2.說明語句中變量安排有序化

3.使用注釋說明復雜數(shù)據(jù)結(jié)構(gòu)第二十三頁,共一百四十四頁,2022年,8月28日數(shù)據(jù)說明的次序應當規(guī)范化數(shù)據(jù)說明次序規(guī)范化,使數(shù)據(jù)屬性容易查找,也有利于測試,排錯和維護。原則上,數(shù)據(jù)說明的次序與語法無關(guān),其次序是任意的。但出于閱讀、理解和維護的需要,最好使其規(guī)范化,使說明的先后次序固定。第二十四頁,共一百四十四頁,2022年,8月28日數(shù)據(jù)說明的次序應當規(guī)范化在FORTRAN程序中數(shù)據(jù)說明次序①常量說明②簡單變量類型說明③數(shù)組說明④公用數(shù)據(jù)塊說明⑤所有的文件說明在類型說明中還可進一步要求按如下順序排列①整型量說明②實型量說明③字符量說明④邏輯量說明第二十五頁,共一百四十四頁,2022年,8月28日說明語句中變量安排有序化當多個變量名在一個說明語句中說明時,應當對這些變量按字母的順序排列。帶標號的全程數(shù)據(jù)(如FORTRAN的公用塊)也應當按字母的順序排列。例如,把

integersize,length,width,cost,price

寫成

integer

cost,length,price,size,width

第二十六頁,共一百四十四頁,2022年,8月28日使用注釋說明復雜數(shù)據(jù)結(jié)構(gòu)如果設計了一個復雜的數(shù)據(jù)結(jié)構(gòu),應當使用注釋來說明在程序?qū)崿F(xiàn)時這個數(shù)據(jù)結(jié)構(gòu)的固有特點。例如,對PL/1的鏈表結(jié)構(gòu)和Pascal中用戶自定義的數(shù)據(jù)類型,都應當在注釋中做必要的補充說明。第二十七頁,共一百四十四頁,2022年,8月28日語句結(jié)構(gòu)每個語句應該簡單直接,不應該為提高效率而把語句復雜化使程序簡單易懂避免采用復雜的條件語句不要用“否定”條件的條件語句避免多重的循環(huán)嵌套或條件嵌套用括號使邏輯表達式或算術(shù)表達式更為清晰用空格及有意義的符號使語句內(nèi)容清晰明確反問自己“如果這程序不是我編的,我能看懂嗎?”第二十八頁,共一百四十四頁,2022年,8月28日語句結(jié)構(gòu)在設計階段確定了軟件的邏輯流結(jié)構(gòu),但構(gòu)造單個語句則是編碼階段的任務。語句構(gòu)造力求簡單,直接,不能為了片面追求效率而使語句復雜化。第二十九頁,共一百四十四頁,2022年,8月28日語句結(jié)構(gòu)1.在一行內(nèi)只寫一條語句在一行內(nèi)只寫一條語句,并且采取適當?shù)囊菩懈袷?,使程序的邏輯和功能變得更加明確。許多程序設計語言允許在一行內(nèi)寫多個語句。但這種方式會使程序可讀性變差。因而不可取。第三十頁,共一百四十四頁,2022年,8月28日語句結(jié)構(gòu)例如,有一段排序程序

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),使其可讀性變得很差。第三十一頁,共一百四十四頁,2022年,8月28日語句結(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;第三十二頁,共一百四十四頁,2022年,8月28日語句結(jié)構(gòu)2.程序編寫首先應當考慮清晰性程序編寫首先應當考慮清晰性,不要刻意追求技巧性,使程序編寫得過于緊湊。例如,有一個用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;

就能讓讀者一目了然了。第三十三頁,共一百四十四頁,2022年,8月28日語句結(jié)構(gòu)3.程序要能直截了當?shù)卣f明程序員的用意。程序編寫得要簡單,寫清楚,直截了當?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ù)部分,而得到整型量。第三十四頁,共一百四十四頁,2022年,8月28日語句結(jié)構(gòu)當i<j

時,i/j=0

當j<i

時,j/i=0

得到的數(shù)組V

是一個單位矩陣當i≠j時V[i][j]=(i/j)*(j/i)=0

當i=j時V[i][j]=(i/j)*(j/i)=1寫成以下的形式,就能讓讀者直接了解程序編寫者的意圖。

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;第三十五頁,共一百四十四頁,2022年,8月28日第三十六頁,共一百四十四頁,2022年,8月28日語句結(jié)構(gòu)4.除非對效率有特殊的要求,程序編寫要做到清晰第一,效率第二。不要為了追求效率而喪失了清晰性。事實上,程序效率的提高主要應通過選擇高效的算法來實現(xiàn)。5.首先要保證程序正確,然后才要求提高速度。反過來說,在使程序高速運行時,首先要保證它是正確的。第三十七頁,共一百四十四頁,2022年,8月28日語句結(jié)構(gòu)6.避免使用臨時變量而使可讀性下降。例如,有的程序員為了追求效率,往往喜歡把表達式

A[I]+1/A[I];寫成AI=A[I];X=AI+1/AI;這樣將一句分成兩句寫,會產(chǎn)生意想不到的問題。第三十八頁,共一百四十四頁,2022年,8月28日語句結(jié)構(gòu)7.讓編譯程序做簡單的優(yōu)化。8.盡可能使用庫函數(shù)9.避免不必要的轉(zhuǎn)移。同時如果能保持程序可讀性,則不必用GOTO語句。第三十九頁,共一百四十四頁,2022年,8月28日求三個數(shù)中最小值的程序

IF(X<Y)GOTO30

IF(Y<Z)GOTO50

SMALL=ZGOTO7030IF(X<Z)GOTO60

SMALL=ZGOTO7050SMALL=Y(jié)GOTO7060SMALL=X70CONTINUE第四十頁,共一百四十四頁,2022年,8月28日求三個數(shù)中最小值的程序

程序只需編寫成:

small=x;

if(y<small)small=y(tǒng);

if(z<small)small=z;

所以程序應當簡單,不必過于深奧,避免使用GOTO語句繞來繞去。第四十一頁,共一百四十四頁,2022年,8月28日語句結(jié)構(gòu)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)生二義性問題。第四十二頁,共一百四十四頁,2022年,8月28日語句結(jié)構(gòu)12.避免采用過于復雜的條件測試。13.盡量減少使用“否定”條件的條件語句。例如,如果在程序中出現(xiàn)

if(!(char<‘0’||char>‘9’))……

改成

if(char>='0’&&char<='9’)……

不要讓讀者繞彎子想。第四十三頁,共一百四十四頁,2022年,8月28日語句結(jié)構(gòu)14.盡可能用通俗易懂的偽碼來描述程序的流程,然后再翻譯成必須使用的語言。15.數(shù)據(jù)結(jié)構(gòu)要有利于程序的簡化。16.要模塊化,使模塊功能盡可能單一化,模塊間的耦合能夠清晰可見。17.利用信息隱蔽,確保每一個模塊的獨立性。18.從數(shù)據(jù)出發(fā)去構(gòu)造程序。第四十四頁,共一百四十四頁,2022年,8月28日語句結(jié)構(gòu)19.不要修補不好的程序,要重新編寫。也不要一味地追求代碼的復用,要重新組織。20.對太大的程序,要分塊編寫、測試,然后再集成。21.對遞歸定義的數(shù)據(jù)結(jié)構(gòu)盡量使用遞歸過程。第四十五頁,共一百四十四頁,2022年,8月28日輸入/輸出對批處理I/O符合邏輯地組織輸入I/O出錯檢查好的I/O出錯恢復功能清晰的輸出報告格式對交互式I/O簡單而有提示的輸入方式完備的出錯處理及出錯恢復人機對話輸出I/O格式的一致性原則:檢查所有輸入數(shù)據(jù)的合法性檢查輸入項的各種重要組合是否合理輸入格式要簡單最好采用數(shù)據(jù)結(jié)尾指示符,而不應要求用戶規(guī)定“輸入項目的數(shù)量”交互式I/O要求用戶輸入時,標明交互輸入可選擇的種類和范圍輸出時保持格式的一致性設計和標明所有的輸出第四十六頁,共一百四十四頁,2022年,8月28日輸入和輸出輸入和輸出信息是與用戶的使用直接相關(guān)的。輸入和輸出的方式和格式應當盡可能方便用戶的使用。一定要避免因設計不當給用戶帶來的麻煩。因此,在軟件需求分析階段和設計階段,就應基本確定輸入和輸出的風格。系統(tǒng)能否被用戶接受,有時就取決于輸入和輸出的風格。第四十七頁,共一百四十四頁,2022年,8月28日輸入和輸出設計和編碼原則1.

對所有的輸入數(shù)據(jù)都要進行檢驗,識別錯誤的輸入,以保證每個數(shù)據(jù)的有效性;2.

檢查輸入項的各種重要組合的合理性,必要時報告輸入狀態(tài)信息;3.

使得輸入的步驟和操作盡可能簡單,并保持簡單的輸入格式;4.

輸入數(shù)據(jù)時,應允許使用自由格式輸入;5.

應允許缺省值;6.

輸入一批數(shù)據(jù)時,最好使用輸入結(jié)束標志,而不要由用戶指定輸入數(shù)據(jù)數(shù)目;第四十八頁,共一百四十四頁,2022年,8月28日輸入和輸出設計和編碼原則7.

在交互式輸入輸入時,要在屏幕上使用提示符明確提示交互輸入的請求,指明可使用選擇項的種類和取值范圍。同時,在數(shù)據(jù)輸入的過程中和輸入結(jié)束時,也要在屏幕上給出狀態(tài)信息;8.

當程序設計語言對輸入/輸出格式有嚴格要求時,應保持輸入格式與輸入語句的要求的一致性;9.

給所有的輸出加注解,并設計輸出報表格式。

輸入/輸出風格還受到許多其它因素的影響。如輸入/輸出設備(例如終端的類型,圖形設備,數(shù)字化轉(zhuǎn)換設備等)、用戶的熟練程度、以及通信環(huán)境等。

第四十九頁,共一百四十四頁,2022年,8月28日Wasserman交互系統(tǒng)設計原則原則把計算機的內(nèi)部特性掩蓋起來不讓用戶看到使程序“穿上防彈衣”,保證程序不被用戶破壞如果用戶的請求會產(chǎn)生重大的后果,就要提醒用戶在使用此程序時提供聯(lián)機的幫助條件按照用戶的水平設計輸入要求按照輸出設備的速度設計輸出信息區(qū)別對待不同類型的用戶保持一致的響應時間應盡量減少用戶處理出錯的工作量第五十頁,共一百四十四頁,2022年,8月28日效率要求有效地利用臨界資源是自然的CPU周期和內(nèi)存單元常被看作臨界資源有關(guān)效率的三個格言:效率是一種性能需求。軟件的效率應根據(jù)需要,而不是盡可能地高!好的設計必然提高效率。程序的簡單性與程序的效率往往是一致的??傊灰奚绦虻那逦?、可讀性或正確性去追求效率的非本質(zhì)的提高第五十一頁,共一百四十四頁,2022年,8月28日源程序的效率源程序的效率與算法效率直接相關(guān)編程風格會影響運行速度及所需內(nèi)存的大小編譯器的“優(yōu)化”特性是提高效率的一種手段原則:在具體編程前應簡化算術(shù)表達式及邏輯表達式細心地分析多層嵌套循環(huán)以確定能否把一些語句或表達式移到循環(huán)之外盡量避免采用多維數(shù)組盡量避免采用指針及復雜的表采用“快”的算術(shù)運算不要把不同的數(shù)據(jù)類型混在一起只要可能就采用整型數(shù)的算術(shù)運算和布爾表達式第五十二頁,共一百四十四頁,2022年,8月28日內(nèi)存效率大機器領(lǐng)域內(nèi)存幾乎無限制,虛存使“內(nèi)存效率”不等同于“占用最小的內(nèi)存”微機領(lǐng)域內(nèi)存的限制仍是很現(xiàn)實的問題采用匯編語言可以節(jié)省內(nèi)存提高運行效率的技術(shù)往往可以同時節(jié)省內(nèi)存使程序簡單是提高內(nèi)存效率的關(guān)鍵第五十三頁,共一百四十四頁,2022年,8月28日輸入輸出效率提高I/O效率的指導原則:全部I/O應有緩沖以避免過于頻繁的信息交換對外存應該選用最簡單的可接收的存取方式與外存聯(lián)系的I/O操作應成塊地傳送數(shù)據(jù)與終端及行式打印機聯(lián)系的I/O操作應考慮設備的特性,以改進質(zhì)量與速度如果“超高效率”的I/O無法被人們理解,則是毫無意義的第五十四頁,共一百四十四頁,2022年,8月28日程序效率:討論效率的準則程序的效率是指程序的執(zhí)行速度及程序所需占用的內(nèi)存的存儲空間。程序編碼是最后提高運行速度和節(jié)省存儲的機會,因此在此階段不能不考慮程序的效率。讓我們首先明確討論程序效率的幾條準則效率是一個性能要求,應當在需求分析階段給出。軟件效率以需求為準,不應以人力所及為準。好的設計可以提高效率。程序的效率與程序的簡單性相關(guān)。一般說來,任何對效率無重要改善,且對程序的簡單性、可讀性和正確性不利的程序設計方法都是不可取的。第五十五頁,共一百四十四頁,2022年,8月28日程序效率:算法對效率的影響源程序的效率與詳細設計階段確定的算法的效率直接有關(guān)。在詳細設計翻譯轉(zhuǎn)換成源程序代碼后,算法效率反映為程序的執(zhí)行速度和存儲容量的要求。第五十六頁,共一百四十四頁,2022年,8月28日設計向程序轉(zhuǎn)換的指導原則①在編程序前,盡可能化簡有關(guān)的算術(shù)表達式和邏輯表達式;②仔細檢查算法中的嵌套的循環(huán),盡可能將某些語句或表達式移到循環(huán)外面;③盡量避免使用多維數(shù)組;④盡量避免使用指針和復雜的表;⑤采用“快速”的算術(shù)運算;⑥不要混淆數(shù)據(jù)類型,避免在表達式中出現(xiàn)類型混雜;⑦盡量采用整數(shù)算術(shù)表達式和布爾表達式;⑧選用等效的高效率算法;編譯程序的“優(yōu)化”功能可自動生成高效率的目標代碼第五十七頁,共一百四十四頁,2022年,8月28日程序效率:影響存儲器效率的因素在大中型計算機系統(tǒng)中,存儲限制不再是主要問題。在這種環(huán)境下,對內(nèi)存采取基于操作系統(tǒng)的分頁功能的虛擬存儲管理。存儲效率與操作系統(tǒng)的分頁功能直接有關(guān)。采用結(jié)構(gòu)化程序設計,將程序功能合理分塊,使每個模塊或一組密切相關(guān)模塊的程序體積大小與每頁的容量相匹配,可減少頁面調(diào)度,減少內(nèi)外存交換,提高存儲效率。微型計算機系統(tǒng)中,存儲器的容量對軟件設計和編碼的制約很大。因此要選擇可生成較短目標代碼且存儲壓縮性能優(yōu)良的編譯程序,有時需采用匯編程序。提高存儲器效率的關(guān)鍵是程序的簡單性。第五十八頁,共一百四十四頁,2022年,8月28日程序效率:影響輸入/輸出的因素輸入/輸出可分為兩種類型:面向人(操作員)的輸入/輸出面向設備的輸入/輸出如果操作員能夠十分方便、簡單地錄入輸入數(shù)據(jù),或者能夠十分直觀、一目了然地了解輸出信息,則可以說面向人的輸入/輸出是高效的。第五十九頁,共一百四十四頁,2022年,8月28日提高輸入/輸出效率的指導原則輸入/輸出的請求應當最小化;對于所有的輸入/輸出操作,安排適當?shù)木彌_區(qū),以減少頻繁的信息交換。對輔助存儲(例如磁盤),選擇盡可能簡單的,可接受的存取方法;對輔助存儲的輸入/輸出,應當成塊傳送;

對終端或打印機的輸入/輸出,應考慮設備特性,盡可能改善輸入/輸出的質(zhì)量和速度;任何不易理解的,對改善輸入/輸出效果關(guān)系不大的措施都是不可取的;任何不易理解的所謂“超高效”的輸入/輸出是毫無價值的;第六十頁,共一百四十四頁,2022年,8月28日Kernighan和Plauger給出的好的程序設計風格的規(guī)則寫得清晰——而不是太靈巧簡單而直接地說明你的用意使用庫功能避免使用臨時變量寫清晰——不要為了“效率”而犧牲清晰讓機器干苦活用調(diào)用一個公共的例程去代替重復的表示選用不易混淆的變量名避免使用不必要的轉(zhuǎn)移第六十一頁,共一百四十四頁,2022年,8月28日Kernighan和Plauger給出的好的程序設計風格的規(guī)則不使用條件轉(zhuǎn)移代替一個邏輯表達式假如一個邏輯表達式難以理解,則試著對其進行變換使用數(shù)組,避免重復的控制序列選用使程序簡單的數(shù)據(jù)表示法先用一個容易理解的偽語言寫程序,然后再翻譯成你所用的語言

使用IF…ELSEIF…ELSEIF…ELSE…ENDIF實施多路選擇模塊化,使用子例程第六十二頁,共一百四十四頁,2022年,8月28日Kernighan和Plauger給出的好的程序設計風格的規(guī)則確保注釋與代碼一致不要用注釋去精確地重復代碼——使每一個注釋有價值不要注釋或修補壞代碼——重寫使用有意義的變量名使用有意義的語句標號程序格式應有助于讀者理解程序為你的數(shù)據(jù)設計提供文檔僅使用GOTO去實施一個基本的結(jié)構(gòu)第六十三頁,共一百四十四頁,2022年,8月28日Kernighan和Plauger給出的好的程序設計風格的規(guī)則假如你能保持程序的可讀性,則完全不必使用GOTO以小片段的方式寫和測試一個大程序?qū)σ讯x的遞歸數(shù)據(jù)結(jié)構(gòu)使用遞歸過程檢測輸入的合理性和合法性確保輸入沒有違反程序的限制使用文件的結(jié)尾或標記終止輸入,而不是用計數(shù)來終止輸入識別錯誤的輸入(若有可能要恢復輸入)第六十四頁,共一百四十四頁,2022年,8月28日Kernighan和Plauger給出的好的程序設計風格的規(guī)則輸入簡易,輸出自明使用一致的輸入格式使輸入容易校對若可能,使用自由格式輸入使用自標識的輸入,允許缺省,輸出時反映這兩者確保在使用之前,所有變量已被置初值在出現(xiàn)故障時不要停機使用排錯編譯程序第六十五頁,共一百四十四頁,2022年,8月28日Kernighan和Plauger給出的好的程序設計風格的規(guī)則用DATA語句或INITIAL屬性置常數(shù)用可執(zhí)行的代碼置變量初值盡量注意由錯誤引起的分岔注意在相等時轉(zhuǎn)移的正確性當一個循環(huán)從邊上或底上退出到同一個地方時,必須十分小心確保你的代碼“沒有做什么優(yōu)美方面的事情”在邊值處測試程序人工核查某些答案第六十六頁,共一百四十四頁,2022年,8月28日Kernighan和Plauger給出的好的程序設計風格的規(guī)則10.0乘以0.1很少是1.0不要單獨地進行浮點數(shù)相等比較先保證正確,再提高速度在提高速度之前,做好自動防止故障的措施先保證清晰,再提高速度不要為謀求“效率”上的少量增益而犧牲清晰讓你的編譯程序做簡單的優(yōu)化不要濫用再使用代碼,取而代之的是改組確保特殊情況是確實的特殊第六十七頁,共一百四十四頁,2022年,8月28日Kernighan和Plauger給出的好的程序設計風格的規(guī)則保持簡單,以提高速度不要浪費代碼而提高速度——找一個較好的算法使用工具裝備你的程序,在“效率”改變以前測量(END)第六十八頁,共一百四十四頁,2022年,8月28日程序編碼結(jié)構(gòu)要求采用結(jié)構(gòu)化編碼方法按以下22個特性構(gòu)造第六十九頁,共一百四十四頁,2022年,8月28日(1)完整性任何程序或控制段的開始和結(jié)束,必須包含在單一的結(jié)構(gòu)化模塊中。第七十頁,共一百四十四頁,2022年,8月28日(2)功能每個模塊必須完成單一的定義良好的功能,模塊的全部元素都是為了實現(xiàn)唯一的功能。此外,模塊實現(xiàn)的細節(jié)對其它模塊來說應該是隱蔽的。如果實現(xiàn)的細節(jié)改變,直接受影響的只是實現(xiàn)功能的那個模塊,并且只有該模塊需要修改。第七十一頁,共一百四十四頁,2022年,8月28日(3)入口/出口每個模塊一般要求單一入口和單一出口。處理完成后,模塊必須返回到調(diào)用它的程序而不是其它模塊。接口(入口與出口條件和參數(shù))必須明確表示和定義。第七十二頁,共一百四十四頁,2022年,8月28日(4)說明模塊的說明語句和數(shù)據(jù)語句應放在程序首部之后和第一個可執(zhí)行語句之前,雖然允許每行可有多個數(shù)據(jù)說明,但應保證清晰地定義復雜的數(shù)據(jù)結(jié)構(gòu)。第七十三頁,共一百四十四頁,2022年,8月28日(5)常量常量必須在程序的說明中定義,常量通常有數(shù)組規(guī)模、π值、DO和FOR循環(huán)中的循環(huán)數(shù)、數(shù)組下標、記錄規(guī)模和行長度等。第七十四頁,共一百四十四頁,2022年,8月28日(6)變元在調(diào)用語句中的變元一般不得包含算術(shù)或邏輯表達式。每個變元必須由單一變量來表示。在調(diào)用一個模塊的過程中,變元的類型和個數(shù)必須與模塊的形參相一致。此外,必須標明調(diào)用過程中使用的形參。第七十五頁,共一百四十四頁,2022年,8月28日(7)冪冪的指數(shù)必須用整數(shù)表示,即A**3而不是A**3.0。第七十六頁,共一百四十四頁,2022年,8月28日(8)混合方式運算應避免使用混合運算的算術(shù)表達式,不能避免時應仔細計算表達式的值,以保證類型轉(zhuǎn)換得到預期的結(jié)果,應對轉(zhuǎn)換進行適當?shù)淖⑨?。第七十七頁,共一百四十四頁?022年,8月28日(9)轉(zhuǎn)移盡量少用無條件轉(zhuǎn)移語句。如需使用,必須在同一程序單元內(nèi)轉(zhuǎn)移,并應向轉(zhuǎn)移語句所在點的前方轉(zhuǎn)移。允許使用為實現(xiàn)結(jié)構(gòu)化程序設計所必需的轉(zhuǎn)移指令。第七十八頁,共一百四十四頁,2022年,8月28日(10)錯誤處理a.必須記錄所有錯誤的發(fā)生及處理情況,保存系統(tǒng)發(fā)生錯誤的全部記錄,以利于后續(xù)錯誤情況的處理和分析;b.必須預先了解錯誤的潛在影響,并且在它們出現(xiàn)之前確定如何處理;c.應盡可能使錯誤不擴散,不引起連鎖反應;d.當程序不能執(zhí)行時,必須在中止前釋放已取得的全部資源和結(jié)果。第七十九頁,共一百四十四頁,2022年,8月28日(11)范圍檢查為保證變量值落在預期的范圍內(nèi),必須進行范圍檢查。如果變量值不在規(guī)定范圍內(nèi),則必須進行適當?shù)腻e誤處理。變量的定義域必須在設計時規(guī)定,在實現(xiàn)時聲明,并在運行時檢查。必須進行范圍檢查的變量應包括:參數(shù);數(shù)值下標;CASE結(jié)構(gòu)中的變量參數(shù);循環(huán)結(jié)構(gòu)中用作初值、增量和終值的變量。第八十頁,共一百四十四頁,2022年,8月28日(12)序標和下標循環(huán)序標參數(shù)和數(shù)值下標必須表示為整型的常量或變量。第八十一頁,共一百四十四頁,2022年,8月28日(13)循環(huán)終止必須保證循環(huán)終止,終止條件不能靠對循環(huán)參數(shù)所作假設的正確性,而是靠對循環(huán)入口事前直接的驗證。第八十二頁,共一百四十四頁,2022年,8月28日(14)標號和名字的使用標號和名字必須有意義、一致并明顯、唯一,不易混淆。第八十三頁,共一百四十四頁,2022年,8月28日(15)全局變量和共享變量應避免使用全局或共享變量。當一個變量由兩個或多個模塊共享時,每個模塊都必須正確地使用該變量。由多個模塊使用的變量應作為變元進行通信。限制變量的范圍有助于掌握變量的準確含義。當有明確的技術(shù)根據(jù)需要使用公共數(shù)據(jù)時,應有下列限制:a.僅使用可由名字訪問的公用域;b.公用數(shù)據(jù)域的長度和說明,對于使用它的每個模塊都是相同的;c.可能時,應僅保留公用塊的一個副本,而且必須用“INCLUDE”語句包容在每一個模塊中而不是在模塊中各自編碼描述。第八十四頁,共一百四十四頁,2022年,8月28日(16)連接約定如果模塊是用匯編語言實現(xiàn)的,則必須定義和使用模塊間通信的標準約定。目的是構(gòu)造獨立的、自包容的模塊,它可以用良好定義的方法與其它模塊通信。應考慮的約定有:a.在將控制轉(zhuǎn)給其它模塊之前必須保護寄存器的內(nèi)容,并在控制返回時恢復;b.通信必須通過變元素;c.必須有一個與調(diào)用模塊返回地址進行通信的標準方法。第八十五頁,共一百四十四頁,2022年,8月28日(17)輸入與輸出輸入例程和輸出例程必須集中在有限幾個模塊內(nèi)。將這些例程匯集到少數(shù)幾個模塊中有利于輸入和輸出數(shù)據(jù)的監(jiān)控。此外,將這些例程限制在有限范圍內(nèi)可使修改更容易。第八十六頁,共一百四十四頁,2022年,8月28日(18)命名代碼和數(shù)據(jù)單元的名字必須體現(xiàn)它們的功能和內(nèi)容。第八十七頁,共一百四十四頁,2022年,8月28日(19)程序首部每個代碼模塊必須包含一個標準化的程序首部注釋語句塊,作為每個程序模塊的內(nèi)部源文檔。它放在模塊的首部,描述模塊的功能、用途和操作要求。程序首部應包括下面的信息:a.名稱:包含用于標識模塊的名稱、版本標識符和入口。b.目的:包含模塊目的/功能的簡要說明。第八十八頁,共一百四十四頁,2022年,8月28日程序首部程序首部應包括下面的信息:

c.輸入/輸出,包含該模塊所使用的每個I/O文件名,并指明是向模塊輸入、還是輸出、還是兩者兼有。使用交互式屏幕I/O的模塊也應提供屏幕功能的說明。d.參數(shù):提供模塊所需的全部變元的定義以及模塊的返回值(輸出參數(shù))。參數(shù)定義必須包括:名字、數(shù)據(jù)類型、大小和功能。e.調(diào)用:提供該模塊調(diào)用的全部例程的清單和調(diào)用該模塊的全部例程的清單。f.全局數(shù)據(jù):提供模塊中使用的全部公用或全局數(shù)據(jù)的清單。第八十九頁,共一百四十四頁,2022年,8月28日程序首部程序首部應包括下面的信息:g.限制:包含約束或限制模塊性能特點的任何特殊或非常規(guī)因素的清單。h.異常結(jié)束:包含異常返回條件和動作的清單。i.方法:包含為實現(xiàn)模塊的功能而使用的方法的詳細說明。j.編程者:代碼編制人名及所屬機構(gòu)。k.版本號及完成日期:當前的模塊版本號和它的完成日期。l.修改記錄:包含對該模塊的修改人、所屬機構(gòu)、日期及對應的版本號。第九十頁,共一百四十四頁,2022年,8月28日(20)行間注釋源程序體內(nèi)的注釋必須解釋程序執(zhí)行的處理,必須指明每一個控制語句(有條件地更改一個數(shù)據(jù)值或語句的執(zhí)行順序的語句)的目的。a.IF語句:說明條件滿足時執(zhí)行動作的理由。b.I/O語句:標明處理的記錄或文件的性質(zhì)。c.DO語句:說明執(zhí)行動作的理由。d.CALL語句:說明調(diào)用過程的理由。第九十一頁,共一百四十四頁,2022年,8月28日(21)注釋比例注釋行數(shù)不得少于源程序總行數(shù)的1/5。

第九十二頁,共一百四十四頁,2022年,8月28日(22)縮進和分段源代碼必須清楚地縮進表達,以表明結(jié)構(gòu)化程序段外形的控制范圍,使編碼的邏輯關(guān)系對應于程序列表的實際位置??蓤?zhí)行語句限于每行一條。超過一行的語句的后續(xù)部分應縮進該語句的第一行下面。一行允許有多個數(shù)據(jù)說明。數(shù)據(jù)說明應使用某種邏輯順序(例如字母順序)排列。第九十三頁,共一百四十四頁,2022年,8月28日(23)模塊規(guī)模每個軟件單元的源代碼行數(shù)(不含注釋行),平均不應超過60行,最大不應超過200行。第九十四頁,共一百四十四頁,2022年,8月28日程序復雜性度量程序復雜性主要指模塊內(nèi)程序的復雜性。它直接關(guān)聯(lián)到軟件開發(fā)費用的多少,開發(fā)周期的長短和軟件內(nèi)部潛伏錯誤的多少。減少程序復雜性,可提高軟件的簡單性和可理解性,并使軟件開發(fā)費用減少,開發(fā)周期縮短,軟件內(nèi)部潛藏錯誤減少。第九十五頁,共一百四十四頁,2022年,8月28日復雜性度量需要滿足的假設為了度量程序復雜性,要求:

它可以用來計算任何一個程序的復雜性;對于不合理的程序,例如對于長度動態(tài)增長的程序,或者對于原則上無法排錯的程序,不應當使用它進行復雜性計算;如果程序中指令條數(shù)、附加存儲量、計算時間增多,不會減少程序的復雜性。第九十六頁,共一百四十四頁,2022年,8月28日代碼行度量法源代碼行數(shù)度量法基于兩個前提:

程序復雜性隨著程序規(guī)模的增加不均衡地增長;控制程序規(guī)模的方法最好是采用分而治之的辦法。將一個大程序分解成若干個簡單的可理解的程序段。方法的基本考慮是統(tǒng)計一個程序模塊的源代碼行數(shù)目,并以源代碼行數(shù)做為程序復雜性的度量。第九十七頁,共一百四十四頁,2022年,8月28日代碼行與出錯率的關(guān)系設每行代碼的出錯率為每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)的。隨著程序的增大,出錯率以非線性方式增長。第九十八頁,共一百四十四頁,2022年,8月28日McCabe度量法McCabe度量法,又稱環(huán)路復雜性度量,是一種基于程序控制流的復雜性度量方法。它基于一個程序模塊的程序圖中環(huán)路的個數(shù),因此計算它先要畫出程序圖。程序圖是退化的程序流程圖。流程圖中每個處理都退化成一個結(jié)點,流線變成連接不同結(jié)點的有向弧。程序圖僅描述程序內(nèi)部的控制流程,完全不表現(xiàn)對數(shù)據(jù)的具體操作,以及分支和循環(huán)的具體條件。第九十九頁,共一百四十四頁,2022年,8月28日McCabe計算計算環(huán)路復雜性的方法:根據(jù)圖論,在一個強連通的有向圖G中,環(huán)的個數(shù)由以下公式給出:

V(G)=m-n+p

其中,V(G)是有向圖G中環(huán)路個數(shù),m是圖G中弧數(shù),n是圖G中結(jié)點數(shù),p是圖G中的強連通分量個數(shù)。Myers建議,對于復合判定,例如,(A=0)∩(C=D)∪(X=‘A’)算做三個判定。為使圖成為強連通圖,從圖的入口點到出口點加一條用虛線表示的有向邊,使圖成為強連通圖。這樣就可以使用上式計算環(huán)路復雜性。第一百頁,共一百四十四頁,2022年,8月28日第一百零一頁,共一百四十四頁,2022年,8月28日圈復雜度—程序復雜性度量McCabe圈復雜度V(G)≤7將程序流程圖退化為程序圖,將程序流程圖中每個處理符號都退化為一個點,箭頭變成有向弧,調(diào)整使成為強連通圖V(G)=m-n+pm=弧數(shù)n=節(jié)點數(shù)p=分離部分的數(shù)目(連通圖p=1)第一百零二頁,共一百四十四頁,2022年,8月28日計算示例在例示中,結(jié)點數(shù)n=11,弧數(shù)m=13,p=1,則有

V(G)=m-n+p=13-11+1=3.等于程序圖中弧所封閉的區(qū)域數(shù)。第一百零三頁,共一百四十四頁,2022年,8月28日McCabe幾點說明環(huán)路復雜度取決于程序控制結(jié)構(gòu)的復雜度。當程序的分支數(shù)目或循環(huán)數(shù)目增加時其復雜度也增加。環(huán)路復雜度與程序中覆蓋的路徑條數(shù)有關(guān)。環(huán)路復雜度是可加的。例如,模塊A的復雜度為3,模塊B的復雜度為4,則模塊A與模塊B的復雜度是7。McCabe建議,對于復雜度超過10的程序,應分成幾個小程序,以減少程序中的錯誤。Walsh用實例證實了這個建議的正確性。在McCabe復雜度為10的附近,存在出錯率的間斷躍變。McCabe環(huán)路復雜度隱含的前提是:錯誤與程序的判定加上例行子程序的調(diào)用數(shù)目成正比。加工復雜性、數(shù)據(jù)結(jié)構(gòu)、錄入與打亂輸入卡片的錯誤可以忽略不計。第一百零四頁,共一百四十四頁,2022年,8月28日McCabe度量的缺點對于不同種類的控制流的復雜性不能區(qū)分

簡單IF語句與循環(huán)語句的復雜性同等看待

嵌套IF語句與簡單CASE語句的復雜性是一樣的

模塊間接口當成一個簡單分支一樣處理一個具有1000行的順序程序與一行語句的復雜性相同第一百零五頁,共一百四十四頁,2022年,8月28日Halstead的軟件科學Halstead軟件科學研究確定計算機軟件開發(fā)中的一些定量規(guī)律,它采用以下一組基本的度量值。這些度量值通常在程序產(chǎn)生之后得出,或者在設計完成之后估算出。程序長度(預測的Halstead長度)

令n1表示程序中不同運算符(包括保留字)的個數(shù),令n2表示程序中不同運算對象的個數(shù),令H表示“程序長度”,則有

H=n1log2n1+n2

log2n2這里,H是程序長度的預測值,它不等于程序中語句個數(shù)。第一百零六頁,共一百四十四頁,2022年,8月28日Halstead的軟件科學在定義中,運算符包括:算術(shù)運算符;賦值符(=或:=);邏輯運算符;分界符(,或;或:);關(guān)系運算符;括號運算符;子程序調(diào)用符;數(shù)組操作符;循環(huán)操作符等。特別地,成對的運算符,例如“begin…end”、“for…to”、“repeat…until”、“while…do”、“if…then…else”、“(…)”等都當做單一運算符。運算對象包括變量名和常數(shù)。第一百零七頁,共一百四十四頁,2022年,8月28日Halstead的軟件科學實際的Halstead長度:設N1為程序中實際出現(xiàn)的運算符總個數(shù),N2為程序中實際出現(xiàn)的運算對象總個數(shù),N為實際的Halstead長度,則有:N=N1+N2程序的詞匯表:Halstead定義程序的詞匯表為不同的運算符種類數(shù)n1和不同的運算對象種類數(shù)n2的總和。若令n為程序的詞匯表,則有:n=n1+n2程序量:

V=N

log2n

它表明了程序在詞匯上的復雜性。其最小值為

V*=(2+n2*)log2(2+n2*)

這里,2表明程序中至少有兩個運算符:賦值符=

和函數(shù)調(diào)用符

f()

,n2*表示輸入/輸出變量個數(shù)。第一百零八頁,共一百四十四頁,2022年,8月28日示例程序

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第一百零九頁,共一百四十四頁,2022年,8月28日第一百一十頁,共一百四十四頁,2022年,8月28日示例計算H=10log210+7log27=52.87N=28+22=50V=(28+22)log2(10+7)=204等效的匯編語言程序的V=328。這說明匯編語言比FORTRAN語言需要更多的信息量(以bit表示)第一百一十一頁,共一百四十四頁,2022年,8月28日Halstead的軟件科學程序量比率(語言的抽象級別)

L=V*/V

或L=(2/n1)(n2/N2)

它表明了一個程序的最緊湊形式的程序量與實際程序量之比,反映了程序的效率。其倒數(shù)D=1/L

表明了實現(xiàn)算法的困難程度。程序員工作量

E=V/L

程序的潛在錯誤Halstead度量可以用來預測程序中的錯誤。預測公式為

B=(N1+N2)log2(n1+n2)/3000

B為該程序的錯誤數(shù)。它表明程序中可能存在的差錯B應與程序量V成正比。第一百一十二頁,共一百四十四頁,2022年,8月28日示例例如,一個程序?qū)?5個數(shù)據(jù)庫項共訪問1300次,對150個運算符共使用了1200次,那么預測該程序的錯誤數(shù):B=(1200+1300)log2(75+150)/30006.5即預測該程序中可能包含6~7個錯誤第一百一十三頁,共一百四十四頁,2022年,8月28日Halstead的重要結(jié)論程序的實際Halstead長度N可以由詞匯表n算出。即使程序還未編制完成,也能預先算出程序的實際Halstead長度N,雖然它沒有明確指出程序中到底有多少個語句。這個結(jié)論非常有用。經(jīng)過多次驗證,預測的Halstead長度與實際的Halstead長度是非常接近的。第一百一十四頁,共一百四十四頁,2022年,8月28日Halstead度量的缺點沒有區(qū)別自己編的程序與別人編的程序。這是與實際經(jīng)驗相違背的。這時應將外部調(diào)用乘上一個大于1的的常數(shù)Kf(應在1~5之間,它與文檔資料的清晰度有關(guān))。沒有考慮非執(zhí)行語句。補救辦法:在統(tǒng)計n1、n2、N1、N2時,可以把非執(zhí)行語句中出現(xiàn)的運算對象,運算符統(tǒng)計在內(nèi)。在允許混合運算的語言中,每種運算符與它的運算對象相關(guān)。如果一種語言有整型、實型、雙精度型三種不同類型的運算對象,則任何一種基本算術(shù)運算符(+、-、×、/)實際上代表了6種運算符。在計算時應考慮這種因數(shù)據(jù)類型而引起差異的情況。第一百一十五頁,共一百四十四頁,2022年,8月28日Halstead度量的缺點沒有注意調(diào)用的深度。Halstead公式應當對調(diào)用子程序的不同深度區(qū)別對待。在計算嵌套調(diào)用的運算符和運算對象時,應乘上一個調(diào)用深度因子。這樣可以增大嵌套調(diào)用時的錯誤預測率。沒有把不同類型的運算對象,運算符與不同的錯誤發(fā)生率聯(lián)系起來,而是把它們同等看待。例如,對簡單if語句與while語句就沒有區(qū)別。忽視了嵌套結(jié)構(gòu)(嵌套的循環(huán)語句、嵌套IF語句、括號結(jié)構(gòu)等)。一般地,運算符的嵌套序列,總比具有相同數(shù)量的運算符和運算對象的非嵌套序列要復雜得多。解決的辦法是對嵌套結(jié)果乘上一個嵌套因子。第一百一十六頁,共一百四十四頁,2022年,8月28日靜態(tài)分析靜態(tài)分析是通過分析、但不執(zhí)行軟件的程序,找出其中的錯誤和疑點靜態(tài)分析手段之一,就是使用工具對軟件單元甚至軟件所有成分的源代碼進行分析,獲得以下主要信息:語法錯誤信息;每個語句中標識符的引用分析,如變量、參數(shù)等;每個模塊調(diào)用的子模塊;未給初值的變量;已定義的但未使用的變量;未經(jīng)說明或無用的標號;對任何一組輸入數(shù)據(jù)均不可能執(zhí)行到的代碼段可以根據(jù)所獲信息對程序進行分析,發(fā)現(xiàn)其中可能存在的缺陷還可以通過靜態(tài)分析確定程序的分支、路徑、轉(zhuǎn)移等結(jié)構(gòu)關(guān)系,為進行動態(tài)測試產(chǎn)生測試數(shù)據(jù)提供方便第一百一十七頁,共一百四十四頁,2022年,8月28日代碼審查代碼審查是由代碼審查員根據(jù)軟件詳細設計說明,按照規(guī)定的代碼審查單,對被審查的程序代碼逐條進行審查,以確保編碼與設計的一致并確保編碼的正確性代碼審查應著重審查錯誤代碼而不是多余代碼或代碼的遺漏各軟件開發(fā)機構(gòu)應根據(jù)自身情況和所開發(fā)的軟件的特點,形成并不斷補充完善自己使用的代碼審查單第一百一十八頁,共一百四十四頁,2022年,8月28日通用的代碼審查單格式:—嵌套的IF是否已正確地縮進?——注釋準確并有意義嗎?——是否使用了有意義的標號?——代碼是否基本上與開始時的模塊模式一致?——是否遵循全套的編程標準?第一百一十九頁,共一百四十四頁,2022年,8月28日通用的代碼審查單入口和出口的連接:——初始入口的最終出口正確嗎?——對另一個模塊的每一次調(diào)用:

全部所需的參數(shù)是否已傳送給每一個被調(diào)用的模塊?

被傳送的參數(shù)值是否正確地設置?第一百二十頁,共一百四十四頁,2022年,8月28日通用的代碼審查單程序語言的使用:——是否使用一個或一組最佳的動詞?——模塊中是否使用完整定義的語言的有限子集?存儲器使用:——每一個域在第一次使用前正確地初始化了嗎?——規(guī)定的域正確嗎?——每個域是否已由正確的變量類型聲明?第一百二十一頁,共一百四十四頁,2022年,8月28日通用的代碼審查單測試和轉(zhuǎn)移:——測試條件正確嗎?——用于測試的是正確變量嗎?——每個轉(zhuǎn)移目標正確并至少執(zhí)行一次嗎?性能:——邏輯是否被最佳地編碼?——提供的是一般的錯誤還是異常的例程?第一百二十二頁,共一百四十四頁,2022年,8月28日通用的代碼審查單維護性:——所提供的列表控制是否有利于提高可讀性?——標號和子程序名符合代碼的意義嗎?邏輯:——全部設計是否均已實現(xiàn)?——編碼是否做了設計所規(guī)定的內(nèi)容?——每個循環(huán)是否執(zhí)行正確的次數(shù)?(END)第一百二十三頁,共一百四十四頁,2022年,8月28日調(diào)試調(diào)試的任務:診斷和改正程序中的錯誤調(diào)試的活動:根據(jù)跡象確定錯誤的正確位置仔細分析研究以確定問題的原因并進行改正確定錯誤位置占調(diào)試95%的工作量調(diào)試工作是一個具有很強技巧性的工作軟件運行失效或出現(xiàn)問題,往往只是潛在錯誤的外部表現(xiàn)調(diào)試是通過現(xiàn)象,找出原因的一個思維分析

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論