《軟件工程》課件第8章 程序編碼_第1頁
《軟件工程》課件第8章 程序編碼_第2頁
《軟件工程》課件第8章 程序編碼_第3頁
《軟件工程》課件第8章 程序編碼_第4頁
《軟件工程》課件第8章 程序編碼_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

【本章引言】

完成系統(tǒng)設(shè)計后,進(jìn)入到系統(tǒng)實現(xiàn)階段。系統(tǒng)實現(xiàn)階段的主要任務(wù)是根據(jù)系統(tǒng)設(shè)計規(guī)格說明書的內(nèi)容編寫程序代碼,這個階段稱為程序編碼。程序編碼就是把軟件設(shè)計階段的成果(主要是詳細(xì)設(shè)計規(guī)格說明書)使用某種計算機(jī)程序編程語言轉(zhuǎn)換成計算機(jī)能夠理解的形式――程序代碼的過程。作為軟件工程生命周期的一個階段,程序編碼的實質(zhì)就是對軟件設(shè)計的翻譯,翻譯過程所使用的計算機(jī)程序設(shè)計語言及程序員的編程風(fēng)格對程序的可靠性、可讀性、可測試性、可維護(hù)性等方面都將產(chǎn)生很大的影響,從而最終影響到計算機(jī)軟件系統(tǒng)的質(zhì)量。程序編碼階段的目標(biāo)是編寫出滿足系統(tǒng)功能要求的、正確的代碼?!颈菊轮攸c】

程序設(shè)計語言的特點;程序設(shè)計語言的選擇?!緦W(xué)習(xí)目標(biāo)】掌握程序設(shè)計語言選擇的方法;了解軟件復(fù)雜性的度量方法?!緦W(xué)習(xí)內(nèi)容】

8.1程序設(shè)計語言8.2結(jié)構(gòu)化程序設(shè)計8.3程序設(shè)計風(fēng)格8.4程序設(shè)計效率8.5程序復(fù)雜性度量8.6小結(jié)8.7習(xí)題8.1程序設(shè)計語言

作為程序設(shè)計的工具,不同的計算機(jī)編程語言具有不同的語言特性和適用范圍,程序設(shè)計語言的選擇不僅決定了目標(biāo)系統(tǒng)的完成效率,還會決定目標(biāo)系統(tǒng)的功能完善程度,還會影響程序員的思維和解決問題的方式,也會影響維護(hù)人員閱讀和理解程序的難易程度。所以,程序編碼之前的一項重要工作就是選擇一種適合的程序設(shè)計語言。8.1.1程序設(shè)計語言的分類

編程語言經(jīng)過多年的發(fā)展,從機(jī)器語言直到今天最流行的面向?qū)ο笳Z言,已經(jīng)有上千種之多,但能被廣泛使用的語言卻不多。不同的時代有不同的與計算機(jī)硬件技術(shù)和操作系統(tǒng)相匹配的編程語言。根據(jù)編程語言的特點和發(fā)展的進(jìn)程,將程序設(shè)計語言分為5大類。

1.第一代語言――機(jī)器語言(MachineLanguage)機(jī)器語言由二進(jìn)制的1、0指令代碼組成的字符串構(gòu)成,機(jī)器語言屬于低級語言。不同的CPU具有不同的指令系統(tǒng)。由于機(jī)器語言是二進(jìn)制代碼,這些代碼不需要翻譯,可以直接被計算機(jī)識別和執(zhí)行,因此用機(jī)器語言編寫的程序占用內(nèi)存少,執(zhí)行效率高。但機(jī)器語言不直觀,具有很多缺點,如難編寫、難修改、難維護(hù),需要用戶直接對存儲空間進(jìn)行分配,編程效率極低。此外,由于不同的機(jī)器有相應(yīng)的一套機(jī)器語言,所以程序的可移植性很差。2.第二代語言――匯編語言(AssemblyLanguage)匯編語言指令是機(jī)器指令的符號化,與機(jī)器語言有直接的對應(yīng)關(guān)系,將機(jī)器指令對應(yīng)成為人們易讀的助記符,如ADD、LDA和MOV等。同機(jī)器語言一樣,匯編語言也屬于低級語言。匯編語言又稱符號語言,它把計算機(jī)所能識別的機(jī)器指令用符號表示出來,從而比二進(jìn)制表示的機(jī)器語言更直觀,更方便閱讀和排錯。雖然匯編語言比機(jī)器語言容易理解,容易記憶,但還是有難掌握、容易出錯、維護(hù)困難等缺點。不同指令集的處理器系統(tǒng)能夠有自己相應(yīng)的匯編語言。但是匯編語言也有自己的優(yōu)點:可直接訪問系統(tǒng)接口,匯編程序翻譯成的機(jī)器語言程序的效率較高。因此,在某些使用高級語言不能滿足要求用戶需求的情況下,如要求實時性較高,可以使用匯編語言編碼?,F(xiàn)在,程序員主要使用匯編語言編寫系統(tǒng)程序,如編譯器、操作系統(tǒng)和設(shè)備驅(qū)動程序等。3.第三代語言――高級語言(High-levelLanguage)高級程序設(shè)計語言起始于20世紀(jì)50年代中期。高級語言的出現(xiàn)比前兩代語言有顯著的進(jìn)步。從語句結(jié)構(gòu)看,它比較接近人類的自然語言,程序中所用的運算符和運算表達(dá)式也與數(shù)學(xué)中的形式差不多,因此,高級語言也稱算法語言。和機(jī)器語言及匯編語言相比,高級語言比較容易掌握和理解,并且通用性強(qiáng),可以在不同的機(jī)器上運行,便于維護(hù),極大地提高了程序設(shè)計的效率和可靠性。從軟件工程的角度看,高級語言可以分為基礎(chǔ)語言、結(jié)構(gòu)化語言和專用語言三類。(1)基礎(chǔ)語言這類語言開發(fā)于20世紀(jì)50年代至60年代。其特點是出現(xiàn)早、應(yīng)用廣泛、有大量軟件庫,為早期的程序員廣泛接受和熟悉,所以稱為基礎(chǔ)語言。BASIC、FORTRAN、COBOL和ALGOL等語言是這種語言的代表。BASIC,是Beginner’sAll-purposeSymbolicInstructionCode的縮寫,翻譯為初學(xué)者通用符號指令代碼,是為是一種典型的交互式語言,用于一般數(shù)值計算于事物處理,具有簡單易學(xué)、交互性好等優(yōu)點,式是初學(xué)者比較好的入門語言。隨著語言的發(fā)展,基礎(chǔ)語言的部分性能已經(jīng)老化,很難適應(yīng)現(xiàn)代軟件開發(fā)的需要。但有些語言隨著版本的更新與性能的改進(jìn),至今仍被使用。(2)結(jié)構(gòu)化語言結(jié)構(gòu)化語言的特點是直接提供結(jié)構(gòu)化的控制結(jié)構(gòu)語句及數(shù)據(jù)類型定義語句,具有很強(qiáng)的過程描述能力和數(shù)據(jù)結(jié)構(gòu)描述能力。其主要優(yōu)點是模塊清晰、控制結(jié)構(gòu)完備、數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)類型豐富、表達(dá)能力強(qiáng)及可移植性好。20世紀(jì)70年代以來,出現(xiàn)了以Pascal、C、PL/1和Ada等為代表的一批結(jié)構(gòu)化程序設(shè)計語言。C語言是使用較多的一種結(jié)構(gòu)化語言,于1973年由美國著名的Bell實驗室Ritchie研制成功并作為UNIX操作系統(tǒng)的主要語言,后成功移植到各種機(jī)型上,成為一種通用的程序設(shè)計語言。它具有結(jié)構(gòu)化語言的公共特征,如表達(dá)簡潔、控制結(jié)構(gòu)與數(shù)據(jù)結(jié)構(gòu)完備,運算符和數(shù)據(jù)類型豐富,而且可移植性強(qiáng),編譯質(zhì)量高。用C語言編譯程序產(chǎn)生的目標(biāo)程序,其質(zhì)量可以與匯編語言產(chǎn)生的目標(biāo)程序相媲美,廣泛用于系統(tǒng)程序設(shè)計及嵌入式系統(tǒng)開發(fā)。(3)專用語言專用語言是為特殊的應(yīng)用而設(shè)計的語言,通常具有自己特殊的語法形式,面對特定的問題,輸入結(jié)構(gòu)及詞匯表與該問題的相應(yīng)范圍密切相關(guān)。由代表性的專用語言有APL、PROLOG等。從軟件工程的角度來看,專用語言支持了特殊的應(yīng)用,將特定的設(shè)計要求翻譯成可執(zhí)行的代碼。但是它們的可移植性和可維護(hù)性比較差。4.第四代語言――4GL語言(FourthGenerationLanguage)第三代語言是過程化語言,編碼時,要詳細(xì)描述問題求解的過程,告訴計算機(jī)每一步應(yīng)該怎么做。為了把程序員從繁重的編碼中解放出來,還需要尋求進(jìn)一步提高編碼效率的新語言,這就是第四代語言產(chǎn)生的背景。從1969年開始計算機(jī)科學(xué)家們開始開發(fā)第四代語言,這類語言比第三代語言更象人類的語言或自然語言。第四代語言刪除了很多在第三代語言中出現(xiàn)的嚴(yán)格的語法規(guī)則。第四代語言的出現(xiàn)將語言的抽象層次又提高到一個新的高度。同其它語言一樣,第四代語言也用不同的文法表示程序結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu),但是它是在更高一級抽象的層次上表示這些結(jié)構(gòu),它不需要規(guī)定太多的算法細(xì)節(jié)。第四代語言是面向應(yīng)用的,只需說明做什么就可以了,不比關(guān)心怎么做。4GL兼有過程性和非過程性兩重特性。程序員規(guī)定條件和相應(yīng)的動作――這是過程性的部分;并且指出想要的結(jié)果――這是非過程性的部分,然后由4GL語言系統(tǒng)運用它的專門領(lǐng)域的知識來填充過程細(xì)節(jié)。Martin把第四代語言分為以下幾種類型:(1)

查詢語言:通常查詢語言是為與數(shù)據(jù)庫有關(guān)的應(yīng)用而開發(fā)的。用戶可利用查詢語言對預(yù)先定義在數(shù)據(jù)庫中的信息進(jìn)行較復(fù)雜的操作。例如一些目前可用的查詢語言提供了自然語言接口,允許用戶給出的描述如“對東北地區(qū)和華北地區(qū),使用最近3年的實際銷售額預(yù)測明年的銷售前景”。絕大部分用戶都喜歡這種接口方式。(2)

程序生成器:程序生成器代表更為復(fù)雜的一類4GL,它只需很少的語句就能生成完整的第三代語言程序,甚至是第五代程序語言,目前一般用于MIS系統(tǒng)、菜單生成等方面。(3)

其它4GL:如判定支持語言、原型語言、形式化規(guī)格說明語言等。第四代語言第典型代表有SQL(StructuredQueryLanguage)和RPG(ReportProgramGenerator)?,F(xiàn)在第四代語言主要用于數(shù)據(jù)庫應(yīng)用。5.第5代語言――面向?qū)ο笳Z言(ObjectOrientedLanguage)面向?qū)ο笳Z言的形成借鑒了歷史上很多程序語言的特點,從中汲取了豐富的營養(yǎng)。Simula是第一個面向?qū)ο蟮某绦蛟O(shè)計語言,它是20世紀(jì)60年代中后期在挪威開發(fā)的。在Simula語言中引進(jìn)了類的概念和繼承機(jī)制。Smalltalk是20世紀(jì)70年代初期開發(fā)的將面向?qū)ο蟮母拍钣枰云占暗恼Z言。美國的人工智能研究協(xié)會采納了面向?qū)ο蟮某绦蛟O(shè)計技術(shù),開發(fā)出了LISP(ListProcessing)語言,在其中引進(jìn)了動態(tài)聯(lián)編的概念。80年代以來,面向?qū)ο笳Z言象雨后春筍一樣大量涌現(xiàn),出現(xiàn)了很多面向?qū)ο笳Z言,如C++、VisualBasic、Objective-C、Eiffel、System和Actor等,最近幾年出現(xiàn)了VB.NET、Java、C#等時下最流行的面向?qū)ο笳Z言。VisualBasic.NET(簡稱為VB.NET)語言使一種可視化的編程語言,程序員能夠很容易完成基于面向?qū)ο蟪绦虻娜蝿?wù)。VB.NET語言基于微軟在二十世紀(jì)九十年代初期開發(fā)的VisualBasic語言,這種語言與BASIC在語法上非常相似,并且易學(xué)易用。VB.NET對初學(xué)者來說是非常理想的入門學(xué)習(xí)語言。C++語言是從C語言進(jìn)化而來的,后來得到了高速的發(fā)展。它保留了C語言的特征,同時又融合了面向?qū)ο蟮哪芰?。這就維護(hù)了大量已開發(fā)的C語言庫、C語言工具以及C語言源程序的完整性,使C語言程序員不必放棄自己已經(jīng)十分熟悉的C語言,而只需補(bǔ)充學(xué)習(xí)C++提供的那些面向?qū)ο蟮母拍罴纯?。C++既可以進(jìn)行過程化程序設(shè)計,又可以進(jìn)行面向?qū)ο蟪绦蛟O(shè)計。

C#語言也是一種可視化的編程語言,它融合了C++的編程元素與方便的開發(fā)環(huán)境的優(yōu)點。C#將C++語言中的復(fù)雜內(nèi)容進(jìn)行了簡化和拋棄,仍舊保持面向?qū)ο箝_發(fā)程序的特點。熟悉C++的程序員經(jīng)過簡單的了解就可將C++的程序移植到C#上來。Java語言是于1995年由SUN公司推出的,是當(dāng)今最流行的新興網(wǎng)絡(luò)編程語言。Java是一種簡單的、面向?qū)ο蟮摹⒎植际降?、功能?qiáng)大的、安全的、解釋的、高效的、平臺無關(guān)的、易移植的、多線程的、動態(tài)的編程語言。Java語法接近C++,但做了許多重大的修改。它適用于Internet環(huán)境并具有較強(qiáng)的交互性和實時性。它提供了對網(wǎng)絡(luò)應(yīng)用的支持和多媒體應(yīng)用的支持,推動了Internet和企業(yè)網(wǎng)絡(luò)化應(yīng)用的進(jìn)步。8.1.2程序設(shè)計語言的特點

程序語言是程序員與計算機(jī)溝通的橋梁。程序員應(yīng)該了解程序設(shè)計語言各方面的特點,以及這些特點對軟件質(zhì)量的影響,以便在需要為一個目標(biāo)軟件系統(tǒng)開發(fā)選用語言時,能夠做出恰當(dāng)?shù)倪x擇。以下從幾個不同的方面對程序設(shè)計語言的特點進(jìn)行說明。1.變量命名方式對編程時使用的變量進(jìn)行命名,名字的聲明確定了一個對象的名字。某些語言要求在使用一個對象前,必須“先聲明,后使用”,如C語言。這樣編譯系統(tǒng)在編譯時,就能檢查程序中出現(xiàn)的名字的合法性,從而幫助程序員及時發(fā)現(xiàn)并改正出現(xiàn)中相應(yīng)的錯誤(bug)。但有的語言不是這樣的,如BASIC語言,它不要求編程人員顯式地聲明程序中所有對象的名字,第一次遇到某個名字,編譯系統(tǒng)就認(rèn)為是編程人員對該對象的名字的聲明。這樣如果在輸入源程序時,程序員輸錯了對象的名字,特別是如果錯誤輸入的字符和預(yù)想使用的名字的字符非常相像(如,小寫字母o和數(shù)字0,大寫字母I和數(shù)字1,大寫字母I和小寫字母l等),那么由此產(chǎn)生的錯誤是很難發(fā)現(xiàn)的。2.類型聲明

通過類型聲明,程序員定義了對象的類型,從而確定了該對象的使用方式和存儲方式。類型聲明和變量命名是緊密相聯(lián)的,一般在聲明對象的名字時,同時聲明對象類型。這樣編譯系統(tǒng)在編譯時能發(fā)現(xiàn)對一個對象的使用是否合法,從而減少程序錯誤。另外,某些程序設(shè)計語言還允許程序員在設(shè)計過程中定義與特定應(yīng)用有關(guān)的自己的數(shù)據(jù)類型,以適應(yīng)自己的編程需要。當(dāng)然,面向?qū)ο蟮某绦蛟O(shè)計語言在這方面具有更大的優(yōu)勢,不僅允許定義傳統(tǒng)意義上的數(shù)據(jù)類型,甚至允許把新的數(shù)據(jù)類型及對其進(jìn)行的操作封裝成一個整體(稱為類),供程序繼承或?qū)嵗褂谩S行┱Z言允許用戶不對變量的類型進(jìn)行顯式的聲明,給程序的安全性留下了隱患。在VisualBasic程序中默認(rèn)的變量類型是Variant,而在VisualBasic.NET中則沒有Variant類型,默認(rèn)的變量類型是Object。為保證變量類型的一致性,應(yīng)該對所有的變量使用類型聲明。3.變量初始化

程序中最常見的錯誤之一是在使用變量前沒有對它進(jìn)行初始化。為減少程序發(fā)生錯誤,應(yīng)該使程序員對程序中聲明的所有變量初始化,但不會強(qiáng)制程序員一定要這樣做。一個有效的解決辦法是,在用戶聲明變量時,由系統(tǒng)給變量賦一個特殊的、表明變量還沒被初始化的特殊的值,以后沒對這個變量賦值就企圖使用它的值,系統(tǒng)應(yīng)能發(fā)出出錯信號。一般的系統(tǒng)都會有變量默認(rèn)的初始值,如數(shù)值型的變量的默認(rèn)初值是0,字符型變量的默認(rèn)初值是空字符串。4.程序?qū)ο蟮木植炕绦蛟O(shè)計的一般原理是,程序?qū)ο蟮拿謶?yīng)該在需要時引用,并且在程序真正需要它們的地方才能看見它們。如果不想讓外部的其它模塊訪問它們,就使用局部化進(jìn)行處理,限定變量的訪問范圍。通常有兩種提供局部變量的途徑:單層局部性,如FORTRAN語言等;多層局部性,如塊結(jié)構(gòu)語言。多層局部性語言寫出的程序可讀性強(qiáng),但是在塊結(jié)構(gòu)語言中,內(nèi)層結(jié)構(gòu)和外層結(jié)構(gòu)使用了相同的變量的名字,外層名字在內(nèi)層是不可見的,即內(nèi)層不能訪問外層的同名變量,這樣往往由于疏忽而引起錯誤。特別是在維護(hù)時,往往由于維護(hù)人員不是程序的開發(fā)人員,更容易出現(xiàn)這種差錯。雖然用單層設(shè)計語言寫出的程序的可讀性不如多層局部性語言,但是卻容易實現(xiàn)程序單元的獨立編譯。5.程序?qū)ο蟮墓蚕硇?/p>

程序模塊之間往往要共享一些數(shù)據(jù)。有些語言通過全局變量來提供共享,然而這降低了程序的安全性,同時也增加了程序維護(hù)時發(fā)生錯誤的可能性。有些語言通過靜態(tài)變量來提供共享則很好地解決了這個問題,如C語言、C++語言等。6.循環(huán)控制結(jié)構(gòu)常見的循環(huán)控制結(jié)構(gòu)有For循環(huán)語句、Do…While循環(huán)和Do…Until循環(huán)等。但實際上,在很多情況下,需要在循環(huán)體內(nèi)增加條件判斷語句,滿足一定的條件后退出循環(huán)體,如果在循環(huán)體的內(nèi)層增加If…Then…Else判定結(jié)構(gòu)的條件表達(dá)式,增程序的長度會增加,并且程序的可讀性會降低。在Do循環(huán)語句的選擇上,盡量使用Do…While循環(huán),而不要選擇Do…Until循環(huán)。Do…While循環(huán)是先判斷條件,然后才執(zhí)行循環(huán)體語句,而Do…Until循環(huán)是先執(zhí)行循環(huán)體,然后再去判定是否滿足條件,如果直接執(zhí)行循環(huán)體語句就產(chǎn)生了錯誤的結(jié)果,后面的判斷將不起任何作用,因為事實已經(jīng)發(fā)生了。7.分支控制結(jié)構(gòu)

分支控制結(jié)構(gòu)主要有兩種:IF型和CASE型。IF型分支語句通常不存在什么實際問題,但是多分支的CASE型語句卻可能存在下述兩個問題:第一,如果CASE表達(dá)式的取值不在預(yù)先指定的范圍內(nèi),則不能決定應(yīng)該做的動作;第二,在某些程序設(shè)計語言中,由CASE表達(dá)式選定執(zhí)行的語句,取決于所有可能執(zhí)行的語句的排列次序,如果語句次序排錯了,編譯和運行時系統(tǒng)并不能發(fā)現(xiàn)錯誤??沙绦驁?zhí)行結(jié)果卻是錯誤的,不同的語言針對這兩個問題有不同的解決方法。8.異常處理程序運行過程中發(fā)生的錯誤或意外事件稱為異常。多數(shù)程序設(shè)計語言在檢測和處理異常方面幾乎沒有給程序員提供任何幫助,程序員只能使用語言提供的一般控制結(jié)構(gòu)檢測異常事件,并在發(fā)生異常事件時把控制轉(zhuǎn)移到處理異常的程序段。VB.NET和C#語言很好地解決了這個問題,能夠捕獲一般的異常,并給出相應(yīng)的錯誤指示,根據(jù)這些指示,程序員很容易判斷異常的原因,并找出錯誤。9.獨立編譯獨立編譯是指能分別編譯各個程序單元,然后再把它們集成為一個完整的程序。一個大程序由許多程序單元組成。如果修改其中一個單元都必須重新編譯整個程序,就會大大增加程序開發(fā)、調(diào)試和維護(hù)的成本;相反如果各個單元可以獨立編譯,假如修改了某個程序單元,只有整個程序單元需要重新編譯,然后重新連接整個程序即可,則說這個語言是支持獨立編譯的。一個程序語言如果沒有獨立編譯的機(jī)制,就不是適合軟件工程的優(yōu)秀的編程語言。8.1.3程序設(shè)計語言的選擇

目前有上百種的編程語言,而每一種都有自己的優(yōu)點和缺點。為某個特定開發(fā)項目選擇程序設(shè)計語言時,既要從技術(shù)角度評價和比較各種語言的適用范圍,又必須考慮現(xiàn)實可行性。有時需要作出某種合理的折衷考慮,不一定要選功能最強(qiáng)大的編程語言。有實際經(jīng)驗的軟件開發(fā)人員經(jīng)常有這樣的感受,他們在選擇哪種編程語言時經(jīng)常遇到的是矛盾的選擇。 適合的程序設(shè)計語言能夠使根據(jù)設(shè)計規(guī)格說明書去完成編碼設(shè)計時遇到的困難最少,可以減少需要的程序測試量,并且可以得出更容易閱讀和更容易維護(hù)的程序。由于軟件系統(tǒng)的大部分成本費用是在軟件生命周期的測試和維護(hù)階段,因此易測試性和易維護(hù)性也是極其重要的。選擇編程語言有理想的標(biāo)準(zhǔn),包含以下幾個方面:

(1)理想的模塊化機(jī)制。

(2)良好的控制結(jié)構(gòu)、豐富的數(shù)據(jù)結(jié)構(gòu)、健壯的數(shù)據(jù)安全性。

(3)較好的可閱讀性、可移植性、可維護(hù)性。

(4)良好的開發(fā)環(huán)境和功能強(qiáng)大的開發(fā)工具。

(5)編譯程序能盡可能多地發(fā)現(xiàn)程序中的錯誤,有良好的獨立編譯機(jī)制。上述這些要求是選擇程序設(shè)計語言的理想標(biāo)準(zhǔn),但在實際選擇編程語言時不能僅考慮理想的標(biāo)準(zhǔn),還考慮實際情況,從實際出發(fā),綜合考慮技術(shù)、經(jīng)濟(jì)、程序員水平及開發(fā)周期等多方面因素,選擇適當(dāng)?shù)木幊陶Z言。下面是選擇程序設(shè)計語言時的實用標(biāo)準(zhǔn):

(1)系統(tǒng)用戶的要求。如果所開發(fā)的軟件系統(tǒng)又用戶負(fù)責(zé)維護(hù),用戶在后期要進(jìn)行二次開發(fā),用戶通常要求用他們最熟悉的編程語言。

(2)可以得到的軟件開發(fā)工具。如果某種語言有支持程序開發(fā)的軟件工具可以利用,則目標(biāo)系統(tǒng)的實現(xiàn)和驗證都會變得比較容易。

(3)工程規(guī)模。如果工程規(guī)模很龐大,現(xiàn)有的語言又不完全適用,那么選擇一種適合這個工程項目特定的程序設(shè)計語言,可能是一個正確的選擇。

(4)軟件開發(fā)人員的知識。雖然對于有經(jīng)驗的程序員來講,學(xué)習(xí)一種新語言并不困難,但是完全掌握一種新語言卻需要一個過程,并且還需要實踐的檢驗。如果與其它標(biāo)準(zhǔn)不矛盾,那么應(yīng)該選擇一種程序員最擅長的語言。(5)軟件可移植性要求。如果目標(biāo)系統(tǒng)將在幾臺不同的計算機(jī)上運行,或者預(yù)期的使用壽命很長,那么選擇一種標(biāo)準(zhǔn)化程度高,程序可移植性好的語言就是很重要的。例如,如果目標(biāo)系統(tǒng)要求可在不同的平臺上都可運行,最好選擇平臺無關(guān)性的Java。

(6)與數(shù)據(jù)庫管理軟件的配合。不同的編程語言與數(shù)據(jù)庫管理軟件的配合是不同的。如選用MicrosoftSQLServer數(shù)據(jù)庫,最好選擇VB.NET和C#語言;若選用Sybase數(shù)據(jù)庫,最好采用PowerBuilder來進(jìn)行開發(fā)。

(7)軟件的應(yīng)用領(lǐng)域。每種軟件都有自己適合的應(yīng)用領(lǐng)域,最強(qiáng)大的語言不一定適合目標(biāo)系統(tǒng)所在的領(lǐng)域,有的適合科學(xué)計算,有的適合商業(yè)領(lǐng)域,有的適合實時應(yīng)用領(lǐng)域,有的適合表達(dá)知識和推理等。8.2結(jié)構(gòu)化程序設(shè)計

為保證編碼產(chǎn)生的源代碼正確可靠、簡明清晰,自1963年開始,很多軟件方面的學(xué)者圍繞著在編程語言中是否使用goto語句進(jìn)行了多年的爭論。經(jīng)過論證,人們認(rèn)識到,不是簡單地去掉goto語句的問題,而是要創(chuàng)立一種新的程序設(shè)計思想、方法和風(fēng)格,以顯著提高軟件生產(chǎn)率和軟件質(zhì)量,降低軟件維護(hù)的成本。于是形成了結(jié)構(gòu)化程序設(shè)計的概念。結(jié)構(gòu)化程序設(shè)計技術(shù)是60年代中期提出來的,它主要包括兩個方面:

在編寫程序時,強(qiáng)調(diào)使用幾種基本控制結(jié)構(gòu)(順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)),通過組合嵌套,形成程序的控制結(jié)構(gòu)。盡可能避免使用會使程序質(zhì)量受到影響的GOTO語句。

在程序設(shè)計過程中,盡量采用自頂向下和逐步細(xì)化的原則,由粗到細(xì),一步步展開。1.結(jié)構(gòu)化程序設(shè)計的原則使用語言中的順序、選擇、循環(huán)等有限的基本控制結(jié)構(gòu)表示程序邏輯。選用的控制結(jié)構(gòu)只準(zhǔn)許有一個入口和一個出口。程序語句組成容易識別的塊(block),每塊只有一個入口和一個出口。復(fù)雜結(jié)構(gòu)應(yīng)該用基本控制結(jié)構(gòu)進(jìn)行組合嵌套來實現(xiàn)。語言中沒有的控制結(jié)構(gòu),可用一段等價的程序段模擬,但要求該程序段在整個系統(tǒng)中應(yīng)前后一致。嚴(yán)格控制GOTO語句,僅在用一個非結(jié)構(gòu)化的程序設(shè)計語言去實現(xiàn)一個結(jié)構(gòu)化的構(gòu)造,或者在某種可以改善而不是損害程序可讀性的情況下才可以使用GOTO語句。如果無限制地采用GOTO語句實現(xiàn)控制路徑,將會使程序路徑變得復(fù)雜而且混亂,因此要控制GOTO語句的使用。但有時完全不用GOTO語句進(jìn)行程序編碼,比用GOTO語句編出的程序可讀性差。例如,在查找結(jié)束時,文件訪問結(jié)束時,出現(xiàn)錯誤情況要從循環(huán)中轉(zhuǎn)出時,使用布爾變量和條件結(jié)構(gòu)來實現(xiàn)就不如用GOTO語句來得簡潔易懂。2.程序設(shè)計自頂向下,逐步求精關(guān)于逐步細(xì)化的方法,著名學(xué)者N.Wirth曾做過如下說明:“我們對付一個復(fù)雜問題的最重要的方法就是抽象。所以,對于一個復(fù)雜的問題,不要急于馬上用計算機(jī)指令、數(shù)字和邏輯符號來表示它,而應(yīng)該先用較自然的抽象的語句來表示,從而得到抽象的程序。抽象程序?qū)Τ橄蟮臄?shù)據(jù)類型進(jìn)行某些特定的運算,并用一些合適的記號(可以是自然語言)來表示。下一步對抽象程序再做分解,進(jìn)入下一個抽象的層次。這樣的細(xì)化過程一直進(jìn)行下去,直到程序能被計算機(jī)接受為止。此時的程序已經(jīng)是某種高級語言或機(jī)器指令書寫的了?!痹诳傮w設(shè)計階段,已經(jīng)采用自頂向下、逐步細(xì)化的方法把一個復(fù)雜問題的解法分解和細(xì)化成了一個由許多功能模塊組成的層次結(jié)構(gòu)的軟件系統(tǒng)。在詳細(xì)設(shè)計和編碼階段,還應(yīng)當(dāng)采取自頂向下,逐步求精的方法,把一個模塊的功能逐步分解,細(xì)化為一系列具體的步驟,進(jìn)而翻譯成一系列用某種程序設(shè)計語言寫成的程序。自頂向下,逐步求精方法有如下的的優(yōu)點:(1)自頂向下,逐步求精方法符合人們解決復(fù)雜問題的普遍規(guī)律。可提高軟件開發(fā)的成功率和生產(chǎn)率。(2)用先全局后局部,先整體后細(xì)節(jié),先抽象后具體的逐步求精的過程開發(fā)出來的程序具有清晰的層次結(jié)構(gòu),因此程序容易閱讀和理解。(3)程序自頂向下,逐步細(xì)化,分解成一個樹形結(jié)構(gòu)(如圖8-1所示)。在同一層的節(jié)點上做的細(xì)化工作相互獨立。在任何一步發(fā)生錯誤,一般只影響它下層的節(jié)點,同一層其它結(jié)點不受影響。在以后的測試中,也可以先獨立地一個節(jié)點一個節(jié)點地做,最后再集成。(4)程序清晰和模塊化,使得在修改和重新設(shè)計一個軟件時,可復(fù)用的代碼量最大。(5)每一步工作僅在上層結(jié)點的基礎(chǔ)上做不多的設(shè)計擴(kuò)展,便于檢查。(6)有利于設(shè)計的分工和組織工作。圖8-1程序的樹形結(jié)構(gòu)3.數(shù)據(jù)結(jié)構(gòu)的合理化著名學(xué)者H.Mills指出,結(jié)構(gòu)化程序設(shè)計主要是想從程序的控制結(jié)構(gòu)入手,消除不適應(yīng)的、容易引起混亂的GOTO語句。這只是問題的一個方面,而問題的另一方面,過去沒有注意到的是數(shù)據(jù)結(jié)構(gòu)的合理化問題,即數(shù)據(jù)結(jié)構(gòu)訪問的規(guī)范化和標(biāo)準(zhǔn)化問題。假如數(shù)據(jù)結(jié)構(gòu)中常使用數(shù)組、指針等數(shù)據(jù)類型,則對它們必須采取隨機(jī)訪問,這樣勢必產(chǎn)生訪問上的混亂。例如,要訪問數(shù)組元素A[i][j],必須先對下標(biāo)i,j訪問,造成訪問忽前忽后,這與GOTO語句造成的混亂類似,同樣是有害的。H.Mills指出,解決這一問題的辦法是用棧和隊列去代替數(shù)組和指針。棧與隊列分別是按后進(jìn)先出(LIFO)和先進(jìn)先出(FIFO)的原則進(jìn)行存取的。在程序中用棧和隊列代替數(shù)組和指針,用合理的規(guī)范的順序存取代替隨機(jī)存取,會避免隨機(jī)存取帶來的麻煩。而且有人做了證明,所有使用數(shù)組和指針的程序,都可以使用棧和隊列的程序等價替換。8.3程序設(shè)計風(fēng)格

程序設(shè)計風(fēng)格又稱編碼風(fēng)格,正如作家、畫家在創(chuàng)作中喜歡和習(xí)慣使用的表達(dá)作品題材的方式。在軟件生存期中,人們經(jīng)常要閱讀程序。特別是在軟件測試階段和維護(hù)階段,編寫程序的人與參與測試、維護(hù)的人都要閱讀程序。因此,閱讀程序是軟件開發(fā)和維護(hù)過程中的一個重要組成部分,而且讀程序的時間比寫程序的時間還要多。難以閱讀的程序必然會給測試、調(diào)試和維護(hù)帶來一定的困難,甚至使這個程序無法維護(hù)。有些軟件維護(hù)人員經(jīng)常會感到,與其讀懂別人非常費解的源程序代碼,有時還不如自己從頭開始重新編寫來得快。70年代初,有人提出在編寫程序時,應(yīng)使程序具有良好的風(fēng)格。這樣使得今后其他的維護(hù)人員讀這個程序時能夠比較方便地沿著彼此都熟悉的思路去理解程序的功能,從而使程序的可讀性增強(qiáng),方便程序的測試與維護(hù)。程序設(shè)計風(fēng)格包括4個方面:源程序文檔化,數(shù)據(jù)說明方式,語句構(gòu)造方法和輸入/輸出技術(shù),力圖從編碼原則的角度提高程序的可讀性,改善程序質(zhì)量。8.3.1源程序文檔化

1.符號名的命名符號名即標(biāo)識符,包括模塊名、變量名、常量名、子程序名、數(shù)據(jù)區(qū)名、緩沖區(qū)名等。這些名字應(yīng)能反映它所代表的實際東西,應(yīng)有一定實際意義。名字不是越長越好,過長的名字會使程序的邏輯流程變得模糊,給修改帶來困難。所以應(yīng)當(dāng)選擇精煉的意義明確的名字,改善對程序功能的理解。必要時可使用縮寫名字,但縮寫規(guī)則要一致,并且要給每一個名字加注釋。在一個程序中,一個變量只應(yīng)用于一種用途。就是說,在同一個程序中一個變量不能身兼幾種工作。例如對于變量的命名,一般由兩部分組成,前面的部分用小寫的字母表示變量的數(shù)據(jù)類型,可以用int代表整型,float代表浮點型;后面的部分要用有意義的詞匯表示,如用Sum表示總和,Sale代表銷售,Amount代表數(shù)量。兩部分合起來,如intNumber、floatAmount等,既表明了該變量具有的含義,又顯示了該變量的數(shù)據(jù)類型,給人一目了然的感覺。對于面向?qū)ο蟪绦蛑械膶ο?,命名的?guī)則也類似。如txtName,一看便知是文本框控件,用于輸入姓名;lblPassword也容易聯(lián)想到,這是密碼框旁邊的標(biāo)簽;btnSubmit同樣能夠猜出這是提交按鈕的標(biāo)識。2.程序的注釋放置在程序中的注釋是程序員與日后的程序讀者之間溝通的重要手段。正確的注釋能夠幫助讀者理解程序,可為后續(xù)階段進(jìn)行測試和維護(hù),提供明確的指導(dǎo)。因此,注釋決不是可有可無的,大多數(shù)程序設(shè)計語言允許使用自然語言來寫注釋,這就給閱讀程序帶來很大的方便。一些正規(guī)的程序文本中,注釋行的數(shù)量占到整個源程序的1/3到1/2,甚至更多。

(1)

序言性注釋:通常置于每個程序模塊的開頭部分,它應(yīng)當(dāng)給出程序的整體說明,對于理解程序本身具有引導(dǎo)作用。有些軟件開發(fā)部門對序言性注釋做了明確而嚴(yán)格的規(guī)定,要求程序編制者逐項列出的有關(guān)項目包括:程序標(biāo)題、有關(guān)本模塊功能和目的的說明、主要算法、接口說明、有關(guān)數(shù)據(jù)描述、模塊位置、開發(fā)簡歷等。

(2)

功能性注釋:嵌在源程序主體代碼中,用以描述其后的語句或程序段是在做什么工作,不要解釋下面怎么做,因為解釋怎么做常常是與程序本身重復(fù)的,并且對于閱讀者理解程序沒有什么幫助。書寫功能性注釋,要注意:·用于描述一段程序,而不是每一個語句;·用縮進(jìn)和空行,使程序與注釋容易區(qū)別;·注釋要正確。3.視覺組織利用空格、空行和縮進(jìn),提高程序的可視化程度。恰當(dāng)?shù)乩每崭瘢梢酝怀鲞\算的優(yōu)先性,避免發(fā)生運算的錯誤。自然的程序段之間可用空行隔開;對于選擇語句和循環(huán)語句,把其中的程序段語句向右做階梯式縮進(jìn)。這樣可使程序的邏輯結(jié)構(gòu)更加清晰,層次更加分明。8.3.2數(shù)據(jù)說明方式

在編寫程序時,需注意數(shù)據(jù)說明的風(fēng)格。為了使程序中數(shù)據(jù)說明更易于理解和維護(hù),必須注意以下幾點。(1)

數(shù)據(jù)說明的前后順序應(yīng)當(dāng)規(guī)范化,使數(shù)據(jù)屬性容易查找,從而有利于測試、調(diào)試與維護(hù)。例如按常量說明、類型說明、全局變量說明和局部變量說明的順序。(2)

當(dāng)多個變量名用一個語句說明時,應(yīng)當(dāng)對這些變量按字母的順序排列。(3)

如果設(shè)計了一個復(fù)雜的數(shù)據(jù)結(jié)構(gòu),應(yīng)當(dāng)使用注釋來說明在程序?qū)崿F(xiàn)時這個數(shù)據(jù)結(jié)構(gòu)的固有特點。8.3.3語句構(gòu)造方法

在設(shè)計階段確定了軟件的邏輯流結(jié)構(gòu),但構(gòu)造單個語句則是編碼階段的任務(wù)。語句構(gòu)造力求簡單,直接,不能為了片面追求效率而使語句復(fù)雜化。下述的規(guī)則有助于使語句簡單明了。(1)在一行內(nèi)只寫一條語句,并且采取適當(dāng)?shù)目s進(jìn)格式,使程序的邏輯和功能變得更加明確。(2)程序編寫首先應(yīng)當(dāng)考慮清晰性,不要刻意追求技巧性,使程序編寫得過于緊湊。(3)程序編寫得要簡單,寫清楚,直截了當(dāng)?shù)卣f明程序員的用意。(4)除非對效率有特殊的要求,程序編寫要做到清晰第一,效率第二。不要為了追求效率而喪失了清晰性。事實上,程序效率的提高主要應(yīng)通過選擇高效的算法來實現(xiàn)。(5)首先要保證程序正確,然后才要求提高速度。反過來說,在使程序高速運行時,首先要保證它是正確的。(6)讓編譯程序做簡單的優(yōu)化。(7)盡可能使用庫函數(shù)。(8)避免使用臨時變量而使可讀性下降。(9)盡量用公共過程或子程序去代替重復(fù)的功能代碼段。(10)用調(diào)用公共函數(shù)去代替重復(fù)使用的表達(dá)式。(11)使用括號來清晰地表達(dá)算術(shù)表達(dá)式和邏輯表達(dá)式的運算順序。(12)避免不必要的轉(zhuǎn)移。同時如果能保持程序的可讀性,則不必用GOTO語句。(13)盡量只采用三種基本的控制結(jié)構(gòu)來編寫程序。(14)用邏輯表達(dá)式代替分支嵌套。(15)避免使用空的ELSE語句和IF…THENIF…的語句。(16)避免使用ELSEGOTO和ELSERETURN結(jié)構(gòu)。(17)使與判定相聯(lián)系的動作盡可能地緊跟著判定。(18)避免采用過于復(fù)雜的條件測試。(19)盡量減少使用“否定”條件的條件語句。不要讓讀者繞彎子想。(20)避免過多的循環(huán)嵌套和條件嵌套;(21)不要使GOTO語句相互交叉。(22)避免循環(huán)的多個出口。(23)使用數(shù)組,以避免重復(fù)的控制序列。(24)盡可能用通俗易懂的偽碼來描述程序的流程,然后再翻譯成必須使用的語言。(25)數(shù)據(jù)結(jié)構(gòu)要有利于程序的簡化。(26)要模塊化,使模塊功能盡可能單一化,模塊間的耦合能夠清晰可見。(27)利用信息隱蔽,確保每一個模塊的獨立性。(28)從數(shù)據(jù)出發(fā)去構(gòu)造程序。(29)不要修補(bǔ)不好的程序,要重新編寫。也不要一味地追求代碼的復(fù)用,要重新組織。(30)對太大的程序,要分塊編寫、測試,然后再集成。(31)對遞歸定義的數(shù)據(jù)結(jié)構(gòu)盡量使用遞歸過程。(32)注意計算機(jī)浮點數(shù)運算的特點,例如,浮點數(shù)運算10.0*0.1通常不等于1.0。(33)不要單獨進(jìn)行浮點數(shù)的比較。用它們做比較,其結(jié)果常常發(fā)生異常情況。(34)避免不恰當(dāng)?shù)刈非蟪绦蛐?,在改進(jìn)效率前,要做出有關(guān)效率的定量估計。(35)在程序中應(yīng)有出錯處理功能,一旦出現(xiàn)故障時不要讓機(jī)器進(jìn)行干預(yù),導(dǎo)致停工。此外,對于程序中的變量,標(biāo)號,注釋等,還需要給予一些注意。例如,變量名中盡量不用數(shù)字。顯式說明所有的變量。確保所有變量在使用前都被初始化。確保注釋與代碼完全一致。不僅對代碼做注釋,而且對每條注釋都加以編號。不注釋不好的代碼,要重新編寫。程序格式的安排應(yīng)有助于讀者理解程序。注釋不要過于繁瑣。遵循國家標(biāo)準(zhǔn)。經(jīng)常反復(fù)想想:“如果我是今后維護(hù)這段代碼的人,我能看懂它嗎?”考慮它的可理解性達(dá)到什么程度。8.3.4輸入/輸出技術(shù)

絕大多數(shù)計算機(jī)系統(tǒng)都是人-機(jī)交互系統(tǒng),輸入和輸出信息是與用戶的使用直接相關(guān)的。輸入和輸出的方式和格式應(yīng)當(dāng)盡可能方便用戶的使用。因此,在軟件需求分析階段和設(shè)計階段,就應(yīng)基本確定輸入和輸出的風(fēng)格。系統(tǒng)能否被用戶接受,有時就取決于輸入和輸出的風(fēng)格。不論是批處理的輸入/輸出方式,還是交互式的輸入/輸出方式,在設(shè)計和程序編碼時都應(yīng)考慮下列原則:(1)

輸入方面對所有的輸入數(shù)據(jù)都進(jìn)行檢驗,從而識別錯誤的輸入,以保證每個數(shù)據(jù)的有效性;檢查輸入項的各種重要組合的合理性,必要時報告輸入狀態(tài)信息;使得輸入的步驟和操作盡可能簡單,并保持簡單的輸入格式;輸入數(shù)據(jù)時,應(yīng)允許使用自由格式輸入;應(yīng)允許缺省值;輸入一批數(shù)據(jù)時,最好使用輸入結(jié)束標(biāo)志,而不要由用戶指定輸入數(shù)據(jù)數(shù)目;在以交互式輸入/輸出方式進(jìn)行輸入時,要在屏幕上使用提示符明確提示交互輸入的請求,指明可使用選擇項的種類和取值范圍。同時,在數(shù)據(jù)輸入的過程中和輸入結(jié)束時,也要在屏幕上給出狀態(tài)信息;當(dāng)程序設(shè)計語言對輸入/輸出格式有嚴(yán)格要求時,應(yīng)保持輸入格式與輸入語句的要求的一致性;(2)輸出方面

給所有的輸出數(shù)據(jù)加注解;

設(shè)計輸出報表、報告格式;

輸出信息中不要有文字錯誤,要保證輸出結(jié)果的正確性。輸入/輸出風(fēng)格還受到許多其它因素的影響。如輸入/輸出設(shè)備(例如終端的類型,圖形設(shè)備,數(shù)字化轉(zhuǎn)換設(shè)備等)、用戶的熟練程度、以及通信環(huán)境等。Wasserman為“用戶軟件工程及交互系統(tǒng)的設(shè)計”提供了一組指導(dǎo)性原則,可供軟件設(shè)計和編程參考。把計算機(jī)系統(tǒng)的內(nèi)部特性隱蔽起來不讓用戶看到;有完備的輸入出錯檢查和出錯恢復(fù)措施,在程序執(zhí)行過程中盡量排除由于用戶的原因而造成程序出錯的可能性;如果用戶的請求有了結(jié)果,應(yīng)隨時通知用戶;充分利用聯(lián)機(jī)幫助手段,對于不熟練的用戶,提供對話式服務(wù),對于熟練的用戶,提供較高級的系統(tǒng)服務(wù),改善輸入/輸出的能力;使輸入格式和操作要求與用戶的技術(shù)水平相適應(yīng)。對于不熟練的用戶,充分利用菜單系統(tǒng)逐步引導(dǎo)用戶操作;對于熟練的用戶,允許繞過菜單,直接使用命令方式進(jìn)行操作;按照輸出設(shè)備的速度設(shè)計信息輸出過程;區(qū)別不同類型的用戶,分別進(jìn)行設(shè)計和編碼;保持始終如一的響應(yīng)時間;在出現(xiàn)錯誤時應(yīng)盡量減少用戶的額外工作。在交互式系統(tǒng)中,這些要求應(yīng)成為軟件需求的一部分,并通過設(shè)計和編碼,在用戶和系統(tǒng)之間建立良好的通信接口。8.4程序設(shè)計效率

效率指對處理時間和存儲空間的使用。1.討論效率的準(zhǔn)則程序的效率是指程序的執(zhí)行速度及程序所需占用的內(nèi)存的存儲空間。討論程序效率的幾條準(zhǔn)則為:效率是一個性能要求,應(yīng)當(dāng)在需求分析階段給出。軟件效率以需求為準(zhǔn),不應(yīng)以人力所及為準(zhǔn)。好的設(shè)計可以提高效率。程序的效率與程序的簡單性相關(guān)。一般說來,任何對效率無重要改善,且對程序的簡單性、可讀性和正確性不利的程序設(shè)計方法都是不可取的。2.算法對效率的影響源程序的效率與詳細(xì)設(shè)計階段確定的算法的效率直接有關(guān)。在詳細(xì)設(shè)計翻譯轉(zhuǎn)換成源程序代碼后,算法效率反映為程序的執(zhí)行速度和存儲容量的要求。轉(zhuǎn)換過程中的指導(dǎo)原則是:在編程序前,盡可能化簡有關(guān)的算術(shù)表達(dá)式和邏輯表達(dá)式;仔細(xì)檢查算法中的嵌套的循環(huán),盡可能將某些語句或表達(dá)式移到循環(huán)外面;盡量避免使用多維數(shù)組;盡量避免使用指針和復(fù)雜的表;采用“快速”的算術(shù)運算;不要混淆數(shù)據(jù)類型,避免在表達(dá)式中出現(xiàn)類型混雜;盡量采用整數(shù)算術(shù)表達(dá)式和布爾表達(dá)式;選用等效的高效率算法;許多編譯程序具有“優(yōu)化”功能,可以自動生成高效率的目標(biāo)代碼。它可剔除重復(fù)的表達(dá)式計算,采用循環(huán)求值法、快速的算術(shù)運算,以及采用一些能夠提高目標(biāo)代碼運行效率的算法來提高效率。對于效率至上的應(yīng)用來說,這樣的編譯程序是很有效的。3.影響存儲效率的因素在大中型計算機(jī)系統(tǒng)中,存儲限制不再是主要問題。在這種環(huán)境下,對內(nèi)存采取基于操作系統(tǒng)的分頁功能的虛擬存儲管理,給軟件提供了巨大的邏輯地址空間。這時,存儲效率與操作系統(tǒng)的分頁功能直接有關(guān),并不是指要使所使用的存儲空間達(dá)到最少。采用結(jié)構(gòu)化程序設(shè)計,將程序功能合理分塊,使每個模塊或一組密切相關(guān)模塊的程序體積大小與每頁的容量相匹配,可減少頁面調(diào)度,減少內(nèi)外存交換,提高存儲效率。在微型計算機(jī)系統(tǒng)中,存儲容量對軟件設(shè)計和編碼的制約很大。因此要選擇可生成較短目標(biāo)代碼且存儲壓縮性能優(yōu)良的編譯程序,有時需采用匯編程序。通過程序員富有創(chuàng)造性的努力,提高軟件時間與空間效率。提高存儲效率的關(guān)鍵是程序的簡單性。4.影響輸入/輸出的因素輸入/輸出可分為兩種類型:一種是面向人(操作員)的輸入/輸出;一種是面向設(shè)備的輸入/輸出。從詳細(xì)設(shè)計和程序編碼的角度來說,可以提出一些提高輸入/輸出效率的指導(dǎo)原則:輸入/輸出的請求應(yīng)當(dāng)最小化;對于所有的輸入/輸出操作,安排適當(dāng)?shù)木彌_區(qū),以減少頻繁的信息交換。對輔助存儲(例如磁盤),選擇盡可能簡單的,可接受的存取方法;對輔助存儲的輸入/輸出,應(yīng)當(dāng)成塊傳送;對終端或打印機(jī)的輸入/輸出,應(yīng)考慮設(shè)備特性,盡可能改善輸入/輸出的質(zhì)量和速度;任何不易理解的,對改善輸入/輸出效果關(guān)系不大的措施都是不可取的;任何不易理解的所謂“超高效”的輸入/輸出是毫無價值的;好的輸入/輸出程序設(shè)計風(fēng)格對提高輸入/輸出效率會有明顯的效果。總之,在程序設(shè)計階段,要善于積累編程經(jīng)驗,培養(yǎng)和學(xué)習(xí)良好的程序設(shè)計風(fēng)格,使編出的程序清晰易懂,易于測試、調(diào)試與維護(hù),從而提高軟件的質(zhì)量。8.5程序復(fù)雜性度量

軟件的外部質(zhì)量屬性很難進(jìn)行度量,我們常常被迫考慮對軟件的內(nèi)部屬性進(jìn)行度量。程序復(fù)雜性主要指模塊內(nèi)程序的復(fù)雜性。它直接關(guān)聯(lián)到軟件開發(fā)費用的多少,開發(fā)周期的長短和軟件內(nèi)部潛伏錯誤的多少。同時它也是軟件可理解性的另一種度量。對軟件項目考慮其復(fù)雜性,就是要達(dá)到減少程序復(fù)雜性,提高軟件的簡單性和可理解性,并使軟件開發(fā)費用減少,開發(fā)周期縮短,軟件內(nèi)部隱藏錯誤減少。8.5.1代碼行度量法

度量程序的復(fù)雜性,最簡單的方法就是統(tǒng)計程序的源代碼行數(shù)。此方法基于兩個前提:程序復(fù)雜性隨著程序規(guī)模的增加不均衡地增長;控制程序規(guī)模的方法最好是采用化繁為簡、分而治之的辦法。將一個大程序分解成若干個簡單的可理解的程序段。方法的基本考慮是統(tǒng)計一個程序模塊的源代碼行數(shù)目,并以源代碼行數(shù)做為程序復(fù)雜性的度量。若設(shè)每行代碼的出錯率為每100行源程序中可能有的錯誤數(shù)目,例如每行代碼的出錯率為1%,則是指每100行源程序中可能有一個錯誤。Thayer曾指出,程序出錯率的估算范圍是從0.04%~7%之間,即每100行源程序中可能存在0.04~7個錯誤。他還指出,每行代碼的出錯率與源程序行數(shù)之間不存在簡單的線性關(guān)系。Lipow進(jìn)一步指出,對于小程序,每行代碼的出錯率為1.3%~1.8%;對于大程序,每行代碼的出錯率增加到2.7%~3.2%之間,但這只是考慮了程序的可執(zhí)行部分,沒有包括程序中的說明部分。Lipow及其他研究者得出一個結(jié)論:對于少于100個語句的小程序,源代碼行數(shù)與出錯率是線性相關(guān)的。隨著程序的增大,出錯率以非線性方式增長。所以,代碼行度量法只是一個簡單的,估計得很粗糙的方法。8.5.2McCabe度量法

McCabe度量法是一種基于程序控制流的復(fù)雜性度量方法。McCabe定義的程序復(fù)雜性度量值又稱環(huán)路復(fù)雜度,它基于一個程序模塊的程序圖中環(huán)路的個數(shù)。如果把程序流程圖中每個處理符號都退化成一個結(jié)點,原來聯(lián)結(jié)不同處理符號的流線變成連接不同結(jié)點的有向弧,這樣得到的有向圖就叫做程序圖。計算有向圖G的環(huán)路復(fù)雜性的公式:V(G)=m-n+2其中,V(G)是有向圖G中的環(huán)路個數(shù),m是圖G中有向弧個數(shù),n是圖G中結(jié)點個數(shù)。以圖8-2為例,其中,結(jié)點數(shù)n=11,弧數(shù)m=12,則有V(G)=m-n+2=12-11+2=3。即McCabe環(huán)路復(fù)雜度度量值為3。它也可以看做由程序圖中的有向弧所封閉的區(qū)域個數(shù)。當(dāng)分支或循環(huán)的數(shù)目增加時,程序中的環(huán)路也隨之增加,因此McCabe環(huán)路復(fù)雜度度量值實際上是為軟件測試的難易程度提供了一個定量度量的方法,同時也間接地表示了軟件的可靠性。實驗表明,源程序中存在的錯誤數(shù)以及為了診斷和糾正這些錯誤所需的時間與McCabe環(huán)路復(fù)雜度度量值有明顯的關(guān)系。Myers建議,對于復(fù)合判定,例如(A=0)∩(C=D)∪(X='A')算做三個判定。利用McCabe環(huán)路復(fù)雜度度量時,有幾點說明。環(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。McCabe建議,對于復(fù)雜度超過10的程序,應(yīng)分成幾個小程序,以減少程序中的錯誤。Walsh用實例證實了這個建議的正確性。他發(fā)現(xiàn),在McCabe復(fù)雜度為10的附近,存在出錯率的間斷躍變。McCabe環(huán)路復(fù)雜度隱含的前提是:錯誤與程序的判定加上例行子程序的調(diào)用數(shù)目成正比。而加工復(fù)雜性、數(shù)據(jù)結(jié)構(gòu)、錄入與打亂輸入卡片的錯誤可以忽略不計。8.5.3HalStead方法

Halstead軟件科學(xué)研究確定計算機(jī)軟件開發(fā)中的一些定量規(guī)律,它采用以下一組基本的度量值,這些度量值通常在程序產(chǎn)生之后得出,或者在設(shè)計完成之后估算出。①程序長度,即預(yù)測的Halstead長度令n1表示程序中不同運算符(包括保留字)的個數(shù),令n2表示程序中不同運算對象的個數(shù),令H表示“程序長度”,則有H=n1

log2n1+n2

log2n2

這里,H是程序長度的預(yù)測值,它不等于程序中語句個數(shù)。在定義中,運算符包括:算術(shù)運算符 賦值符(=或:=) 數(shù)組操作符邏輯運算符 分界符(,或;或:) 子程序調(diào)用符關(guān)系運算符 括號運算符 循環(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ù)和不同的運算對象種類數(shù)的總和。若令n為程序的詞匯表,則有n=n1+n2表8-1是用FORTRAN語言寫出的交換排序的例子。

SUBROUTINESORT(X,N)表8-1一個交換排序程序的例子

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ù)測的詞匯量H=n1

log2n1+n2

log2n2=10

log210

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論