軟件工程第六講教案_第1頁
軟件工程第六講教案_第2頁
軟件工程第六講教案_第3頁
軟件工程第六講教案_第4頁
軟件工程第六講教案_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

教案首頁周次日期課時序課題軟件編碼教學目的要求了解相關(guān)程序設計語言;了解編碼風格;了解程序效率;掌握編碼安全概念重點程序效率、編碼安全難點程序效率、編碼安全教學過程設計及時間分配軟件編碼(2*45‘)程序設計語言(10‘)編碼風格(20‘)程序效率(30‘)編程安全(30‘)教學場所或教學方法使用教具作業(yè)課后記授課教師第六章軟件編碼用戶與計算機交流信息必須使用程序設計語言,這就涉及到編碼。所謂編碼就是把軟件設計的結(jié)果翻譯成計算機可以理解的形式,即用某種程序設計語言書寫的程序。作為軟件工程的一個步驟,編碼是軟件設計的結(jié)果,因此,程序的質(zhì)量主要取決于軟件設計的質(zhì)量。但是,程序設計語言的特性和編碼途徑也會對程序的可靠性、可讀性、可測試性和可維護性產(chǎn)生深遠的影響。6.1程序設計語言編碼的目的是為了指揮計算機按人的意志正確工作,即使用選定的程序設計語言,把模塊過程描述翻譯為用程序設計語言書寫的源程序。程序設計語言是人和計算機通信的最基本的工具,程序設計語言的特性不可避免地會影響人思維和解決問題的方式,會影響人和計算機通信的方式和質(zhì)量,也會影響其他人閱讀和理解程序的難易程度,因此,編碼之前的一項重要工作就是選擇一種適當?shù)某绦蛟O計語言。本節(jié)將從軟件工程的觀點,簡單介紹幾個和程序設計語言有關(guān)的問題以保證編碼階段工作的順利進行。6.1.1程序設計語言分類自1960年以來人們已經(jīng)設計和實現(xiàn)了數(shù)千種不同的程序設計語言,但是只有其中很少一部分得到了比較廣泛的應用。現(xiàn)有的程序設計語言雖然品種繁多,但它們基本上可以分為面向機器語言和高級語言(包括超高級語言4GL)兩大類。1.面向機器語言面向機器語言包括機器語言和匯編語言。這兩種語言的選擇依賴于相應的機器結(jié)構(gòu),其語句和計算機硬件操作相對應。每種匯編語言都是支持該語言的系列計算機所獨有的,因此,其指令系統(tǒng)因機器而異,難學難用。從軟件工程學觀點來看,生產(chǎn)率低,容易出錯,維護困難,所以現(xiàn)在的軟件開發(fā)一般不會使用匯編語言。但它的優(yōu)點是易于系統(tǒng)接口,編碼譯成機器語言效率高,因而在某些使用高級語言不能滿足用戶需要的個別情況下,可以使用匯編語言編碼。2.高級語言高級語言的出現(xiàn)大大提高了軟件生產(chǎn)率。高級語言使用的概念和符號與人們通常使用的概念和符號比較接近,它的一個語句往往對應若干條機器指令,一般說來,高級語言的特性不依賴于實現(xiàn)這種語言的計算機,通用性強。對于高級語言還應該進一步分類,以加深對它們的了解。我們可以分別從應用特點和語言內(nèi)在特點兩個不同角度對高級語言進行分類。從應用特點看,高級語言可以分為基礎(chǔ)語言、現(xiàn)代語言和專用語言三類。(1)基礎(chǔ)語言基礎(chǔ)語言是通用語言,它們的特點是出現(xiàn)早、應用廣泛,有大量軟件庫,為最廣泛的人所熟悉和接受。屬于這類語言的有:BASIC,F(xiàn)ORTRAN,COBOL和ALGOL等。這些語言創(chuàng)始于是乎20世紀50年代或60年代,部分性能已老化,但隨著版本的更新與性能的改進,至今仍被使用。FORTRAN是使用最早的高級語言,它適合于科學計算。其缺點是數(shù)據(jù)類型不豐富,對復雜數(shù)據(jù)結(jié)構(gòu)也缺乏支持。COBOL創(chuàng)建于50年代,是商業(yè)數(shù)據(jù)庫處理中應用最廣的高級語言。它廣泛的支持與事物數(shù)據(jù)處理有關(guān)的各種過程技術(shù)。其優(yōu)點是數(shù)據(jù)部、環(huán)境部、過程部分開,程序適應性強,可移植性強且使用近似于自然語言的語句,易于理解。但其缺點是計算功能弱、編譯速度慢、程序不夠緊湊等。BASIC是60年代為適應分時系統(tǒng)而設計一種交互式語言,用于一般數(shù)值計算與事務處理。優(yōu)點是簡單易學,具有交互功能,因此成為許多程序設計初學者的入門語言,對計算機的普及起了巨大作用。ALGOL語言包括ALGOL60和ALGOL68。是一種描述計算過程的算法語言。它對PASCAL語言的產(chǎn)生有強烈的影響,被認為是結(jié)構(gòu)化語言的前驅(qū)。其缺點是缺少標準的輸入輸出和結(jié)構(gòu)使用的換名參數(shù)。(2)現(xiàn)代語言現(xiàn)代語言又稱結(jié)構(gòu)化語言,也是通用語言。這類語言的特點是直接提供結(jié)構(gòu)化的控制結(jié)構(gòu),具有很強的過程能力和數(shù)據(jù)結(jié)構(gòu)能力。ALGOL是最早的結(jié)構(gòu)化語言(同時又是基礎(chǔ)語言),由它派生出來的PL/1,PASCAL,C以及Ada等語言正被應用在非常廣泛的領(lǐng)域中。PASCAL是第一個系統(tǒng)的體現(xiàn)結(jié)構(gòu)化程序設計概念的現(xiàn)代高級語言。它的優(yōu)點主要是模塊清晰,控制結(jié)構(gòu)完備,數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)類型豐富,且表達能力強,可移植性好。因此在科學計算、數(shù)據(jù)處理及系統(tǒng)軟件開發(fā)中應用廣泛。C語言最初是作為UNIX操作系統(tǒng)的主要語言開發(fā)的,現(xiàn)在已獨立于UNIX成為通用的程序設計語言,適用于多種微機與小型計算機系統(tǒng)。它具有結(jié)構(gòu)化語言的公共特征,表達簡潔,控制結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)完備,運行符和數(shù)據(jù)類型豐富,而且可移植性強,編譯質(zhì)量高。其改進型C++已成為面向?qū)ο蟮某绦蛟O計語言。Ada是迄今為止最完善的面向過程的現(xiàn)代語言。適用于“嵌入式”計算機系統(tǒng)。它支持并發(fā)處理與過程間通訊,支持異常處理的中斷處理,并且支持通常有匯編語言實現(xiàn)的低級操作。Ada是第一個充分體現(xiàn)軟件工程思想的語言,它既是編碼語言又可作為設計表達工具。(3)專用語言專用語言的特點是,具有為某種特殊應用而設計的獨特的語法形式。一般說來,這類語言的應用范圍比較狹窄。例如,APL是為數(shù)組和向量運算設計的簡潔而又功能很強的語言,然而它幾乎不提供結(jié)構(gòu)化的控制結(jié)構(gòu)和數(shù)據(jù)類型;BL1SS是為開發(fā)編譯程序和操作系統(tǒng)而設計的語言;FORTH是為開發(fā)微處理機軟件而設計的語言,它的特點是以面向堆棧的方式執(zhí)行用戶定義的函數(shù),因此能提高速度和節(jié)省存儲;L1SP和PROLOG兩種語言特別適合于人工智能領(lǐng)域的應用。從語言的內(nèi)在特點看,高級語言可以分為系統(tǒng)實現(xiàn)語言、靜態(tài)高級語言、塊結(jié)構(gòu)高級語言和動態(tài)高級語言等四類。1)系統(tǒng)實現(xiàn)語言是為了克服匯編程序設計的困難而從匯編語言發(fā)展起來的。這類語言提供控制語句和變量類型檢驗等功能,但是同時也容許程序員直接使用機器操作。例如,C語言就是著名的系統(tǒng)實現(xiàn)語言。2)靜態(tài)高級語言給程序員提供某些控制語句和變量說明的機制,但是程序員不能直接控制由編譯程序生成的機器操作。這類語言的特點是靜態(tài)地分配存儲。這種存儲分配方法雖然方便了編譯程序的設計和實現(xiàn),但是對使用這類語言的程序員施加了較多限制。因為這類語言是第一批出現(xiàn)的高級語言,所以使用非常廣泛。COBOL和FORTRAN是這類語言中最著名的例子。3)塊結(jié)構(gòu)高級語言的特點是提供有限形式的動態(tài)存儲分配,這種形式稱為塊結(jié)構(gòu)。存儲管理系統(tǒng)支持程序的運行,每當進入或退出程序塊時,存儲管理系統(tǒng)分配存儲或釋放存儲。程序塊是程序中界限分明的區(qū)域,每當進入一個程序塊時就中斷程序的執(zhí)行,以便分配存儲。ALGOL和PASCAL就屬于這類語言。4)動態(tài)高級語言的特點是動態(tài)地完成所有存儲管理,也就是說,執(zhí)行個別語句可能引起分配存儲或釋放存儲。一般地說,這類語言的結(jié)構(gòu)和靜態(tài)的或塊結(jié)構(gòu)的高級語言的結(jié)構(gòu)不同,實際上這類語言中任何兩種語言的結(jié)構(gòu)彼此間也很少類似。這類語言一般是為特殊應用而設計的,不屬于通用語言。綜上所述:從軟件工程的觀點來看,程序設計語言的分類可由圖6-1簡單表示。其中高級語言的分類可由圖6-2表示。圖6-1程序設計語言的分類圖6-2高級語言的分類6.1.2程序設計語言的特點程序設計語言是人與計算機交流的媒介。軟件工程師應該了解程序設計語言各方面的特點,以及這些特點對軟件質(zhì)量的影響,以便在需要為一個特定的開發(fā)項目選擇語言時,能做出合理的選擇。下面從幾個不同側(cè)面簡單討論程序設計語言的特點。(1)名字說明預先說明程序中使用的對象的名字,使編譯程序能檢查程序中出現(xiàn)的名字的合法性,從而能幫助程序員發(fā)現(xiàn)和改正程序中的錯誤。某些語言(例如FORTRAN和BASIC)并不要求用戶顯式地說明程序中所有對象的名字,第一次使用一個名字被看作是對這個名字的說明。然而在輸入源程序時如果拼錯了名字,特別是如果錯輸入的字符和預定要使用的字符非常相像(例如,字母o和數(shù)字0,小寫字母l和數(shù)字1),那么因此而造成的錯誤是較難診斷的。(2)類型說明類型說明和名字說明是緊密相聯(lián)的,通過類型說明用戶定義了對象的類型,從而確定了該對象的使用方式。編譯程序能夠發(fā)現(xiàn)程序中對某個特定類型的對象使用不當?shù)腻e誤,因此有助于減少程序錯誤。規(guī)定必須預先說明對象的類型還有助于減少閱讀程序時的歧義性。類型檢查的概念最早是在ALGOL60中引入的,以后又顯著地強化了這個概念,像PASCAL這樣的程序設計語言,還允許用戶定義與他們的特定應用有關(guān)的自己的類型,并且可以再用自己定義的類型說明其他程序?qū)ο?。用戶甚至可以定義記錄、鏈表和二叉樹等復雜的結(jié)構(gòu)類型。程序設計語言中的類型說明不僅僅是一種安全措施,它還是一種重要的抽象機制。對類型名字的定義使得用戶可以引用某些復雜的實體,而不必考慮這些實體的表示方法。(3)初始化程序設計中最常見的錯誤之一是在使用變量之前沒對變量初始化,為減少發(fā)生錯誤的可能性,應該使程序員對程序中說明的所有變量初始化。另一個辦法是在說明變量時由系統(tǒng)給變量賦一個特殊的、表明它尚未初始化的值,以后如果沒給這個變量賦值就企圖使用它的值,系統(tǒng)就會發(fā)出出錯信號。(4)程序?qū)ο蟮木植啃猿绦蛟O計的一般原理是,程序?qū)ο蟮拿謶撛诳拷褂盟鼈兊牡胤揭耄⑶覒撝挥谐绦蛑姓嬲枰鼈兊哪切┎糠植拍茉L問它們。通常有兩種提供局部變量的途徑,F(xiàn)ORTRAN等絕大多數(shù)系統(tǒng)實現(xiàn)語言提供單層局部性,塊結(jié)構(gòu)語言提供多層局部性。如果名字的特性在靠近使用這些名字的地方說明,程序的閱讀者就很容易獲得有關(guān)這些名字的信息,因此多層次的局部性有助于提高程序的可讀性,此外,具有多層次局部性的語言鼓勵程序員盡量使用局部的對象(變量或常量),這不僅有助于提高可讀性,而且有助于減少差錯和提高程序的可修改性。但是,在塊結(jié)構(gòu)語言中如果內(nèi)層模塊說明的名字和外層模塊中說明的名字相同,則在內(nèi)層模塊中這些外層模塊的對象變成不可訪問的。當模塊多層嵌套時,可能會由于疏忽在內(nèi)層模塊中說明了和外層模塊中相同的名字,從而引起差錯。特別在維護階段,維護人員往往不是原來寫程序的人,更容易出現(xiàn)這種差錯。雖然用單層局部性語言寫的程序可讀性不如多層局部性的,但是卻容易實現(xiàn)程序單元的獨立編譯。(5)程序模塊塊結(jié)構(gòu)語言提供了控制程序?qū)ο竺挚梢娦缘哪承┦侄?,主要是在較內(nèi)層程序塊中說明的名字不能被較外層的程序塊訪問。此外,由于動態(tài)存儲備配的緣故,在兩次調(diào)用一個程序塊的間隔中不能保存局部對象的值。因此,即使是只有一兩個子程序使用的對象。如果需要在兩次調(diào)用這些子程序的過程中保存這個對象的值,也必須把這個對象說明成全過程的,也就是程序中所有子程序都可以訪問的,然而這將增加維護時發(fā)生差錯的可能性。從控制名字的可見性這個角度來說,塊結(jié)構(gòu)語言提供的機制是不完善的,需要某種附加的機制,以允許用戶指定哪些局部名字可以從說明這些名字的程序塊外面訪問,還應該能夠要求某個局部變量在兩次調(diào)用包含它的程序塊的過程中保存它的值。(6)循環(huán)控制結(jié)構(gòu)最常見的循環(huán)控制結(jié)構(gòu)有FOR語句(循環(huán)給定次數(shù)),WHILE_DO語句(每次進入循環(huán)體之前測試循環(huán)結(jié)束條件)和REPEAT_UNTIL語句(每執(zhí)行完一次循環(huán)體測試循環(huán)結(jié)束條件)。但是,實際上有許多場合需要在循環(huán)體內(nèi)任意一點測試循環(huán)結(jié)束條件,如果使用IF_THEN_ELSE語句和附加的布爾變量實現(xiàn)這個要求,則將增加程序長度并降低程序的可讀性。(6)分支控制結(jié)構(gòu)IF型分支語句,通常并不存在什么實際問題,但是多分支的CASE型語句卻可能存在下述兩個問題:第一,如果CASE表達式取的值不在預先指定的范圍內(nèi),則不能決定應該做的動作;第二,在某些程序設計語言中,由CASE表達式選定執(zhí)行的語句,取決于所有可能執(zhí)行的語句的排列次序,如果語句次序排錯了,編譯和運行時系統(tǒng)并不能發(fā)現(xiàn)這類錯誤。PASCAL語言的CASE語句,用CASE表達式的值和CASE標號匹配的辦法,選擇應該執(zhí)行的語句,從而解決了上述第二個問題。Ada語言的CASE語句還進一步增加了補缺標號(OTHER),從而也解決了上述的第一個問題。(8)異常處理程序運行過程中發(fā)生的錯誤或意外事件稱為異常。多數(shù)程序設計語言在檢測和處理異常方面幾乎沒給程序員提供任何幫助,程序員只能使用語言提供的一般控制結(jié)構(gòu)檢測異常,并在發(fā)生異常時把控制轉(zhuǎn)移到處理異常的程序段。但是,當程序中包含一系列子程序的嵌套調(diào)用時,并沒有方便而又可靠的方法把出現(xiàn)異常的信息從一個子程序傳送到另外的子程序。使用一般控制結(jié)構(gòu)加布爾變量的方法,需要明顯增加程序長度并且使程序的邏輯變得更為復雜。(9)獨立編譯獨立編譯意味著能分別編譯各個程序單元,然后再把它們集成為一個完整的程序。典型的,一個大程序由許多不同的程序單元(過程、函數(shù)、子程序或模塊)組成。如果修改了其中任何一個程序單元都需要重新編譯整個程序,將大大增加程序開發(fā)、調(diào)試和維護的成本;反之,如果可以獨立編譯,則只需要重新編譯修改了的程序單元,然后重新連接整個程序即可。由此可見,一個程序設計語言如果沒有獨立編譯的機制,就不是適合軟件工程需要的優(yōu)秀語言。6.1.3程序設計語言的選擇在編寫程序時,程序員們都習慣于使用自己熟悉的語言。因而目前的計算機上所配備的程序設計語言越來越多。開發(fā)軟件系統(tǒng)時必須做出的一個重要抉擇是,使用什么樣的程序設計語言實現(xiàn)這個系統(tǒng)。適宜的程序設計語言能使根據(jù)設計去完成編碼時困難最少,可以減少需要的程序測試量,并且可以得。出更容易閱讀和更容易維護的程序。由于軟件系統(tǒng)的絕大部分成本用在生命周期的測試和維護階段,所以容易測試和容易維護是尤其重要的。使用匯編語言編碼需要把軟件設計翻譯成機器操作的序列,由于這兩種表示方法很不相同,因此匯編程序設計既困難又容易出差錯。一般說來,高級語言的源程序語句和匯編代碼指令之間有一句對多句的對應關(guān)系。統(tǒng)計資料表明,程序員在相同時間內(nèi)可以寫出的高級語言語句數(shù)和匯編語言指令數(shù)大體相同,因此用高級語言寫程序比用匯編語言寫程序生產(chǎn)率可以提高好幾倍。高級語言一般都容許用戶給程序變量和子程序賦予含義鮮明的名字,通過名字很容易把程序?qū)ο蠛退鼈兯淼膶嶓w聯(lián)系起來;此外,高級語言使用的符號和概念更符合人的習慣。因此,用高級語言書寫的程序可閱讀性,可測試性,可調(diào)試性和可維護性強。總的說來。高級語言明顯優(yōu)于匯編語言。因此,除了在很特殊的應用領(lǐng)域(例如,對程序執(zhí)行時間和使用的空間都有很嚴格限制的情況;需要產(chǎn)生任意的甚至非法的指令序列;體系結(jié)構(gòu)特殊的微處理機,以致在這類機器上通常不能實現(xiàn)高級語言編譯程序等)應該采用高級語言書寫。在選擇與評價語言時,首先要從問題人手,確定它的要求是什么,這些要求的相對重要性如何,再根據(jù)這些要求和相對重要性來衡量能采用的語言。在種類繁多的高級語言中究竟選擇哪一種,可以參照以下標準。1.理想標準1)所選用的高級語言應該有理想的模塊化機制,以及可讀性好的控制結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu),以使程序容易測試和維護,同時減少軟件生存周期的總成本。2)所選用的高級語言應該使編譯程序能夠盡可能多地發(fā)現(xiàn)程序中的錯誤,以便于調(diào)試和提高軟件的可靠性。3)所選用的高級語言應該有良好的獨立編譯機制,以降低軟件開發(fā)和維護的成本。2.實踐標準(1)語言自身的功能從應用領(lǐng)域角度考慮,各種語言都有自己的適用領(lǐng)域。如在科學計算領(lǐng)域FORTRAN占優(yōu)勢,PASCAL和BASIC也常用;在事務處理方面COBOL和BASIC占優(yōu)勢;在系統(tǒng)軟件開發(fā)方面C語言占優(yōu)勢,匯編語言也常用;在信息管理、數(shù)據(jù)庫操作方面SQL和VisualFoxpro、Oracol等占優(yōu)勢。從算法與計算復雜性角度考慮,F(xiàn)ORTRAN、TureBASIC及各種現(xiàn)代語言都能支持較復雜的計算與算法,而COBOL及大多數(shù)數(shù)據(jù)庫語言只能支持簡單的運算。從數(shù)據(jù)結(jié)構(gòu)的復雜性角度考慮,PASCAL和C語言都支持數(shù)組,記錄(在C語言中稱結(jié)構(gòu))與帶指針的動態(tài)數(shù)據(jù)結(jié)構(gòu),適合于書寫系統(tǒng)程序和需要復雜數(shù)據(jù)結(jié)構(gòu)的應用程序。而BASIC和FORTRAN等語言只能提供簡單的數(shù)據(jù)結(jié)構(gòu)——數(shù)組。從系統(tǒng)效率的角度考慮,有些實時應用要求系統(tǒng)具有快速的響應速度,此時可選用匯編語言或Ada語言或C語言。(2)系統(tǒng)用戶的要求如果所開發(fā)的系統(tǒng)由用戶自己負責維護,通常應該選擇他們熟悉的語言來編寫程序。(3)編碼和維護成本選擇合適的程序設計語言可大大降低程序的編碼量及日常維護工作中的困難程度,從而使編碼和維護成本降低。(4)軟件的兼容性雖然高級語言的適應性很強,但不同機器上所配備的語言可能不同。另外,在一個軟件開發(fā)系統(tǒng)中可能會出現(xiàn)各子系統(tǒng)之間或主系統(tǒng)與子系統(tǒng)之間所采用的機器類型不同的情況。(5)可以使用的軟件工具有些軟件工具,如文本編輯、交叉引用表、編碼控制系統(tǒng)及執(zhí)行流分析等工具,在支持程序過程中將起著重要作用,這類工具對于所選用的具體的程序設計語言是否可用,決定了目標系統(tǒng)是否容易實現(xiàn)和測試。(6)軟件可移植性如果系統(tǒng)的生存周期比較長,應選擇一種標準化程度高、程序可移植性好的程序設計語言,以使所開發(fā)的軟件將來能夠移植到不同的硬件環(huán)境下運行。(6)開發(fā)系統(tǒng)的規(guī)模如果開發(fā)系統(tǒng)的規(guī)模很大,而現(xiàn)有的語言又不完全適用,那么就要設計一個能夠?qū)崿F(xiàn)這個系統(tǒng)的專用的程序設計語言。(8)程序設計人員的知識水平在選擇語言時還要考慮程序設計人員的知識水平,亦即他們對語言掌握的熟練程度及實踐經(jīng)驗。6.2編碼風格編碼風格又稱程序設計風格或編程風格。風格原指作家、畫家在創(chuàng)作時喜歡和習慣使用的表達自己作品題材的方式,而編碼風格實際上指編程的原則。有相當長的一段時間,許多人認為程序只是給機器執(zhí)行的,而不是供人閱讀的,所以只要程序邏輯正確,能為機器理解并依次執(zhí)行就足夠了,至于“文體(即風格)”如何無關(guān)緊要。但隨著軟件規(guī)模增大,復雜性增加,人們逐漸看到,在軟件生存期中需要經(jīng)常閱讀程序,特別是在軟件測試階段和維護階段,編寫程序的人與參與測試、維護的人都要閱讀程序。人們認識到,閱讀程序是軟件開發(fā)和維護過程中的一個重要組成部分,而且讀程序的時間比寫程序的時間還要多。因此,程序?qū)嶋H上也是一種供人閱讀的文章。既然如此,就有一個文章的風格問題。60年代初,有人提出在編寫時,應該使程序具有良好的風格。這個想法很快就為人們所接受。人們認識到,程序員在編寫程序時,應當意識到今后會有人反復閱讀這個程序,井沿著自己的思路取理解程序的功能。所以應當在編寫程序時多花些工夫,講求程序的風格,這將大量地減少人們讀程序的時間,從整體上看,效率是高的。60年代以來,編碼的目標從強調(diào)效率轉(zhuǎn)變?yōu)閺娬{(diào)清晰。人們逐步意識到,良好的編碼風格能在一定程度上彌補語言存在的缺陷,而如果不注意風格就很難寫出高質(zhì)量的程序。尤其當多個程序員合作編寫一個很大的程序時,需要強調(diào)良好而一致的編碼風格,以便相互通訊,減少因不協(xié)調(diào)而引起的問題。總之,良好的編碼風格有助于編寫出可靠而又容易維護的程序,編碼的風格在很大程度上決定著程序的質(zhì)量。在這一節(jié),將從四個方面討論編碼風格,即源程序文檔化,數(shù)據(jù)說明的方法,語句結(jié)構(gòu)和輸入/輸出方法,進而從編碼原則探討提高程序的可讀性、改善程序質(zhì)量的方法。6.2.1源程序文檔化我們知道一句名言“軟件=程序+文檔”。雖然編碼的目的是產(chǎn)生程序,但是為了提高程序的可維護性,源代碼也需要實現(xiàn)文檔化,這些稱為內(nèi)部文檔編制。源程序文檔化包括選擇標識符(變量和標號)的名字、安排注釋以及程序的視覺組織等。1.符號名的命名符號名即標識符,包括模塊名、變量名、常量名、標號名、子程序名以及數(shù)據(jù)區(qū)名、緩沖區(qū)名等。這些名字應能反映它所代表的實際東西,應有一定實際意義,使其能夠見名知意,有助于程序功能的理解。如:平均值用Average表示,和用Sum表示,總量用Total表示。2.程序的注釋程序中的注釋是程序員與程序讀者之間通信的重要手段。正確的注釋能夠幫助讀者理解程序,并為后續(xù)測試和維護提供明確的指導信息。因此注釋是十分重要的,大多數(shù)程序設計語言提供了使用自然語言來寫注釋環(huán)境,這就給閱讀程序帶來很大的方便。注釋分為序言性注釋和功能性注釋。(1)序言性注釋序言性注釋通常位于每個程序模塊的開頭部分,它給出程序的整體說明,對于理解程序具有引導作用。有些軟件開發(fā)部門對序言性注釋做了明確而嚴格的規(guī)定,要求程序編制者逐項列出。有關(guān)項目包括:程序標題;有關(guān)該模塊功能和目的的說明;主要算法;接口說明:包括調(diào)用形式,參數(shù)描述,子程序清單;有關(guān)數(shù)據(jù)描述(重要的變量及其用途,約束或限制條件,以及其他有關(guān)信息);模塊位置(在哪一個源文件中,或隸屬于哪一個軟件包);開發(fā)簡歷:模塊設計者,復審者,復審日期,修改日期等。下面給出了一個序言性注釋的例子。CNameofmodule:PushCNameofauthor:PetterCDateofcomplition1999.9.11CFunctionsperformed:TOaddanitemintoastack,andreturnazerofornormaloprationCvariablenames:CITENisthestackvalueCINDEXisthestackpointerCSTACKisanarrayCERRFLAGistheerrorflagCCallingroutine:MAINCCalledroutine:noneCExceptionhanding:CERRFLAGreturns1whenstackisfull(2)功能性注釋功能性注釋嵌在源程序體中,用以描述其后的語句或程序段是在做什么工作,也就是解釋下面要“做什么”,或是執(zhí)行了下面的語句會怎么樣,而不要解釋下面怎么做,因為解釋怎么做常常是與程序重復的,并且對于閱讀者理解程序沒有什么幫助。例如,對于“ave=tal/num”的注釋應該是“總量除以人數(shù)求得均值”而不應該是“tal除以num得ave”。對于書寫功能性注釋,要注意以下幾點:1)用于描述一段程序,而不是每一個語句;2)用縮進和空行,使程序與注釋容易區(qū)別;3)注釋要正確。4)有合適的,有助于記憶的標識符和恰當?shù)淖⑨?,就能得到比較好的源程序內(nèi)部的文檔。5)有關(guān)設計的說明,也可作為注釋,嵌入源程序體內(nèi)。3.標準的書寫格式應用統(tǒng)一的、標準的格式來書寫源程序清單,有助于改善可讀性。常用的方法有:1)用分層縮進的寫法顯示嵌套結(jié)構(gòu)層次;2)在注釋段周圍加上邊框;3)注釋段與程序段、以及不同的程序段之間插入空行;4)每行只寫一條語句;5)書寫表達式時適當使用空格或圓括號作隔離符。一個程序如果寫得密密麻麻,分不出層次來常常是很難看懂的。優(yōu)秀的程序員在利用空格、空行和縮進的技巧上顯示了他們的經(jīng)驗。恰當?shù)乩每崭?,可以突出運算的優(yōu)先性,避免發(fā)生運算的錯誤。自然的程序段之間可用空行隔開??s進也叫做向右縮格或移行。它是指程序中的各行不必都在左端對齊,都從第一格起排列。因為這樣做使程序完全分不清層次關(guān)系。因此,對于選擇語句和循環(huán)語句,把其中的程序段語句向右做階梯式移行。這樣可使程序的邏輯結(jié)構(gòu)更加清晰,層次更加分明。下面的兩重選擇結(jié)構(gòu)嵌套例子,再常見不過了。但如果不這樣寫,一大堆IF、THEN、ELSE、ENDIF實在太容易使人混亂了。IF(...)ThenIF(...)THEN...ELSE...ENDIF...ELSE...ENDIF6.2.2數(shù)據(jù)說明雖然在設計階段,已經(jīng)確定了數(shù)據(jù)結(jié)構(gòu)的組織及其復雜性,但在編寫程序時,仍需要注意數(shù)據(jù)說明的風格。為了使程序中數(shù)據(jù)說明更易于理解和維護,必須注意以下幾點。1)數(shù)據(jù)說明的次序應當規(guī)范化。使數(shù)據(jù)屬性容易查找,也有利于測試,排錯和維護。2)說明的先后次序固定。例如,按常量說明、簡單變量類型說明、數(shù)組說明、公用數(shù)據(jù)塊說明、所有的文件說明的順序說明。在類型說明中還可進一步要求。例如,可按如下順序排列:整型量說明、實型量說明、字符量說明、邏輯量說明。3)當用一個語句說明多個變量名時,應當對這些變量按字母的順序排列。例如,把int,total,sum,num,amon,ave寫成amon,ave,int,num,sum,total。4)對于復雜數(shù)據(jù)結(jié)構(gòu),應利用注釋說明實現(xiàn)這個數(shù)據(jù)結(jié)構(gòu)的特點。例如對C中的鏈表結(jié)構(gòu)應當在注釋中做必要的說明,進而增強程序的可閱讀性。6.2.3語句結(jié)構(gòu)在設計階段確定軟件的邏輯結(jié)構(gòu),但編碼階段的任務是構(gòu)造單個語句。構(gòu)造的語句要力求簡單、直接,不能為了片面追求效率而使語句更為復雜。1.使用標準的控制結(jié)構(gòu)在編碼階段,要繼續(xù)遵循模塊邏輯中采用單入口、單出口標準結(jié)構(gòu)的原則,以確保源程序清晰可讀。在盡量使用標準結(jié)構(gòu)的同時,還要避免使用容易引起混淆的結(jié)構(gòu)和語句。如:ifa>bthenifx>ythenb=y;elsea=x;endif;elsea=b;endif;此例中,“then”后面僅接著又出現(xiàn)了“if”。這種結(jié)構(gòu)含義模糊,不易分清后面的“else”與哪一個“if”對應。下面改寫后的程序,不僅可以消除模糊含義,還可以提高可讀性。ifa>bthena=b;elseifx>ythenb=y;elsea=x;endif;endif;避免使用空的ELSE語句和IF…THENIF…的語句。在早期使用ALGOL語言時就發(fā)現(xiàn)這種結(jié)構(gòu)容易使讀者產(chǎn)生誤解。例如,寫出了這樣的BASIC語句:IF(CHAR>=“A”)THENIF(CHAR<=“Z”)THENPRINT“Thisisa1etter?!盓LSEPRINT“Thisisnotaletter?!边@里的ELSE到底是否定的哪一個IF?語言處理程序約定,否定離它最近的那個未帶ELSE的IF,但是不同的讀者可能會產(chǎn)生不同的理解,也出現(xiàn)了二義性問題。另外,在一行內(nèi)只寫一條語句,并采取適當?shù)目s進格式,使程序的邏輯和功能變得更加明確。例如,許多程序設計語言允許在一行內(nèi)寫多個語句。但這種方式會使程序可讀性變差。2.盡可能使用庫函數(shù)盡量用公共過程或子程序去代替重復的功能代碼段。要注意,這段代碼應具有一個獨立的功能,不要只因代碼形式一樣便將其抽出組成一個公共過程或子程序。用調(diào)用公共函數(shù)去代替重復使用的表達式。用邏輯表達式代替分支嵌套。盡量減少使用“否定”條件的條件語句。同時避免采用過于復雜的條件測試。3.程序編寫首先應當考慮可讀性以前,為了能在小容量的低速計算機上完成工作量很大的計算,必須考慮盡量節(jié)省存儲,提高運算速度。因此,對程序必須精心制作,注意程序設計技巧的研究。但是近年來由于硬件技術(shù)的發(fā)展,已為軟件人員提供了十分優(yōu)越的開發(fā)環(huán)境。在大容量和高速度的條件下,程序設計人員完全不必在程序中精心設置技巧。與此相反,軟件工程技術(shù)要求軟件生產(chǎn)工程化、規(guī)范化,為了提高程序的可讀性,減少出錯的可能性,提高測試與維護的效率,要求把程序的清晰性放在首位??聪旅鍯語言程序段:for(i=1to5)i++for(j=1to5)j++a[i][j]=(i/j)*(j/i);讀者可能化很大力氣也弄不明白其究竟是什么功能。執(zhí)行后可發(fā)現(xiàn),如打印a[i][j]則得到一個5*5的單位矩陣。再研究程序可發(fā)現(xiàn),整除運算“/”的結(jié)果i=j時a[i][j]=1,i≠j時a[i][j]=0。其功能確實是實現(xiàn)單位矩陣的。但是,這個程序雖然構(gòu)思巧妙,卻不易理解,從而給軟件維護帶來很大困難。寫成以下這樣的通常形式,就能讓讀者很容易的了解程序員的設計思想了。for(i=1to5)i++for(j=1to5)j++ifi==jthena[i][j]=1;elsea[i][j]=0;endif;程序編寫要做到可讀性第一,效率第二,不要為了追求效率而喪失了可讀性。事實上,程序效率的提高主要應通過選擇高效的算法來實現(xiàn)。通過對程序代碼的某些語句進行優(yōu)化,有時可提高一些效率,但與選擇好的算法來提高效率相比,在保持程序的清晰性的前提下,寧可選擇后者。程序編寫得要簡單清楚,直截了當?shù)卣f明程序員的用意。首先要保證程序正確,然后才要求提高速度。換句話說,在使程序高速運行時,首先要保證它是正確的。4.注意GOTO語句的使用GOTO語句不宜多使用,也不能完全禁止。事實上,在現(xiàn)代語言中,也可以用GOTO語句和IF語句組成用戶定義的新控制結(jié)構(gòu)。1)不要使GOTO語句相互交叉。2)避免不必要的轉(zhuǎn)移。同時如果能保持程序的可讀性,則不必用G0TO語句。3)程序應當簡單,不必過于深奧,避免使用GOTO語句繞來繞去。5.其他需要注意的問題1)避免使用ELSEGOTO和ELSERETURN結(jié)構(gòu)。2)避免過多的循環(huán)嵌套和條件嵌套;3)數(shù)據(jù)結(jié)構(gòu)要有利于程序的簡化。4)要模塊化,使模塊功能盡可能單一化,模塊間的耦合能夠清晰可見。5)對遞歸定義的數(shù)據(jù)結(jié)構(gòu)盡量使用遞歸過程。6)不要修補不好的程序,要重新編寫,也不要一味地追求代碼的復用,要重新組織。6)利用信息隱蔽,確保每一個模塊的獨立性。8)對太大的程序,要分塊編寫、測試,然后再集成。9)注意計算機浮點數(shù)運算的特點。尾數(shù)位數(shù)一定,則浮點數(shù)的精度受到限制。10)避免不恰當?shù)刈非蟪绦蛐?,在改進效率前,要作出有關(guān)效率的定量估計。11)確保所有變量在使用前都進行初始化。12)遵循國家標準。6.2.4輸入/輸出(I/O)輸入/輸出信息是與用戶的使用直接相關(guān)的。輸入/輸出的方式和格式應當盡量作到對用戶友好(UserFriendly),盡可能方便用戶的使用。一定要避免因設計不當給用戶帶來的麻煩。這就要求,源程序的輸入/輸出風格必須滿足人體工程學(Hunan-Engineering)的需要。因此,在軟件需求分析階段和設計階段,就應基本確定輸入/輸出的風格。輸入/輸出的風格隨著人工干預程度的不同而有所不同。例如,對于批處理的輸入/輸出,總是希望它能按邏輯順序要求組織輸入數(shù)據(jù),具有有效的輸入/輸出出錯檢查和出錯恢復功能,并有合理的輸出報告格式。而對于交互式的輸入/輸出來說,應是簡單而帶提示的輸入方式,完備的出錯檢查和出錯恢復功能,以及通過人機對話指定輸出格式和輸入/輸出格式的一致性。在設計和程序編碼時都應考慮下列原則:1)對所有的輸入數(shù)據(jù)都進行檢驗,從而識別錯誤的輸入,以保證每個數(shù)據(jù)的有效性;2)檢查輸入項的各種重要組合的合理性,必要時報告輸入狀態(tài)信息;3)使得輸入的步驟和操作盡可能簡單,并保持簡單的輸入格式;4)輸入數(shù)據(jù)時,應允許使用自由格式輸入;5)應允許缺省值;6)輸入一批數(shù)據(jù)時,最好使用輸入結(jié)束標志,而不要由用戶指定輸入數(shù)據(jù)數(shù)目;6)在以交互式輸入/輸出方式進行輸入時,要在屏幕上使用提示符明確提示交互輸入的請求,指明可使用選擇項的種類和取值范圍。同時,在數(shù)據(jù)輸入的過程中和輸入結(jié)束時,也要在屏幕上給出狀態(tài)信息;8)當程序語言對輸入格式有嚴格要求時,應保持輸入格式與輸入語句要求的一致性;9)給所有的輸出加注解,并設計輸出報表格式。輸入/輸出風格還受到許多其他因素的影響,如輸入/輸出設備、用戶的熟練程度以及通信環(huán)境等。在交互式系統(tǒng)中,這些要求應成為軟件需求的一部分,并通過設計和編碼,在用戶和系統(tǒng)之間建立良好的通信接口??傊?,要從程序編碼的實踐中,積累編制程序的經(jīng)驗,培養(yǎng)和學習良好的程序設計風格,進而使編寫出來的程序清晰易懂,易于測試和維護。6.3程序效率程序效率是指程序的執(zhí)行速度及程序占用的存儲空間。程序編碼是最后提高運行速度和節(jié)省存儲的機會,因此在此階段不能不考慮程序的效率。6.3.1討論程序效率的幾條準則1)效率是一個性能要求,目標值應當在需求分析階段給出。軟件效率以需求為準,不應以人力所及為準。2)好的設計可以提高效率。3)程序的效率與程序的簡單性相關(guān)。一般說來,任何對效率無重要改善,且對程序的簡單性、可讀性和正確性不利的程序設計方法都是不可取的。6.3.2算法對效率的影響源程序的效率與詳細設計階段確定的算法的效率直接有關(guān)。在詳細設計翻譯轉(zhuǎn)換成源程序代碼后,算法效率反映為程序的執(zhí)行速度和存儲容量的要求。轉(zhuǎn)換過程中的指導原則是:1)在編程序前,盡可能化簡有關(guān)的算術(shù)表達式和邏輯表達式;2)仔細檢查算法中的嵌套的循環(huán),盡可能將某些語句或表達式移到循環(huán)外面;3)盡量避免使用多維數(shù)組;4)盡量避免使用指針和復雜的表達式;5)采用“快速”的算術(shù)運算;6)不要混淆數(shù)據(jù)類型,避免在表達式中出現(xiàn)類型混雜;6)盡量采用整數(shù)算術(shù)表達式和布爾表達式;8)選用等效的高效率算法。許多編譯程序具有“優(yōu)化”功能,可以自動生成高效率的目標代碼。它可刪除重復的表達式計算,采用循環(huán)求值法、快速的算術(shù)運算,以及采用一些能夠提高目標代碼運行效率的算法來提高效率。對于效率至上的應用來說,這樣的編譯程序是很有效的。6.3.3影響存儲器效率的因素在大中型計算機系統(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)良的編譯程序,有時需采用匯編程序。通過程序員富有創(chuàng)造性的努力,提高軟件時間與空間效率。程序的簡單性是提高存儲器效率的關(guān)鍵。6.3.4影響輸入/輸出的因素輸入/輸出可分為兩種類型:一種是面向人(操作員)的輸入/輸出;一種是面向設備的輸入/輸出。如果操作員能夠十分方便、簡單地錄入輸入數(shù)據(jù),或者能夠十分直觀、一目了然地了解輸出信息,則可以說面向人的輸入/輸出是高效的。至于面向設備的輸入/輸出,分析起來比較復雜。從詳細設計和程序編碼的角度來說,可以提出一些提高輸入/輸出效率的指導原則:1)輸入/輸出的請求應當最小化;2)對于所有的輸入/輸出操作,安排適當?shù)木彌_區(qū),以減少頻繁的信息交換。3)對輔助存儲(例如磁盤),選擇盡可能簡單的,可接受的存取方法;4)對輔助存儲的輸入/輸出,應當成塊傳送;5)對終端或打印機的輸入/輸出,應考慮設備特性,盡可能改善輸入/輸出的質(zhì)量和速度;6)任何不易理解的,對改善輸入/輸出效果關(guān)系不大的措施都是不可取的;6)不應該為追求所謂“超高效”的輸入/輸出而損害程序的可理解性;8)良好的輸入/輸出程序設計風格對提高輸入/輸出效率會有明顯的效果。6.4編程安全提高軟件質(zhì)量和可靠性的技術(shù)大致可分為兩類,一類是避開錯誤技術(shù),即在開發(fā)的過程中不讓差錯潛入軟件的技術(shù);另一類是容錯技術(shù),即對某些無法避開的差錯,使其影響減至最小的技術(shù);避開錯誤技術(shù)是進行質(zhì)量管理,實現(xiàn)產(chǎn)品應有質(zhì)量所比不可少的技術(shù),也就是軟件工程中所討論的先進的軟件分析和開發(fā)技術(shù)和管理技術(shù)。但是,無論使用多么高明的避開錯誤技術(shù),也無法做到完美無缺和絕無錯誤,這就需要采用容錯技術(shù)。實現(xiàn)容錯的主要手段是冗余和防錯程序設計。6.4.1冗余程序設計冗余是改善系統(tǒng)可靠性的一種重要技術(shù)。在硬件系統(tǒng)中,采用冗余技術(shù)是指提供額外的元件或系統(tǒng),使其與主系統(tǒng)并行工作。這時有兩種情況:一種是讓連接的所有元件都并行工作,當有一個元件出現(xiàn)故障時,它就退出系統(tǒng),而由冗余元件接續(xù)它的工作,維護系統(tǒng)的運轉(zhuǎn),有時將這種結(jié)構(gòu)稱之為自動重組結(jié)構(gòu)。另一種情況是系統(tǒng)最初運行時,由原始元件工作,當該元件發(fā)生故障時,由檢測線路(有時由人工完成)把備用元件接上(或把開關(guān)撥向備用元件),使系統(tǒng)繼續(xù)運轉(zhuǎn)。第一種情況稱為“并行冗余”,也稱“熱備用”或“主動冗余”;第二種情況稱為“備用冗余”,也稱“冷冗余”或“被動冗余”。在軟件系統(tǒng)中,采用冗余技術(shù)是指要解決一個問題必須設計出兩個不同的程序,包括采用不同的算法和設計,而且編程人員也應該不同。例如,求解一個二次方程的實數(shù)根,可以在第一個程序中使用二次求根公式,而在第二個程

溫馨提示

  • 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

提交評論