《軟件系統(tǒng)開發(fā)技術(shù)》課件第5章_第1頁
《軟件系統(tǒng)開發(fā)技術(shù)》課件第5章_第2頁
《軟件系統(tǒng)開發(fā)技術(shù)》課件第5章_第3頁
《軟件系統(tǒng)開發(fā)技術(shù)》課件第5章_第4頁
《軟件系統(tǒng)開發(fā)技術(shù)》課件第5章_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

5.1編程階段的基本概念5.2程序設(shè)計(jì)語言5.3SP方法與編程5.4程序內(nèi)部文檔5.5編程風(fēng)格5.6程序的效率習(xí)題五

Mills說過:“(軟件人員)應(yīng)該克制急于去編程的欲望”。在開發(fā)軟件系統(tǒng)的過程中,必須先經(jīng)過分析階段確定用戶要求,再經(jīng)過設(shè)計(jì)階段為編程制訂一個周密的計(jì)劃(包括概要

設(shè)計(jì)確定系統(tǒng)的模塊結(jié)構(gòu),詳細(xì)設(shè)計(jì)決定每個模塊內(nèi)部的控制流程),至此編程的條件才具備了,于是可以進(jìn)入編程階段。編程階段相當(dāng)于機(jī)械工程中圖紙?jiān)O(shè)計(jì)完成后的“制造”階段。5.1編程階段的基本概念編程(Coding)的任務(wù)是為每個模塊編寫程序,也就是說將詳細(xì)設(shè)計(jì)的結(jié)果轉(zhuǎn)換成用某種編程語言寫的程序。編程階段應(yīng)交付的結(jié)果就是程序,程序此時應(yīng)不再含有語法錯誤,

程序內(nèi)部必須含有一些必要的稱之為“內(nèi)部文檔”的說明性材料。交付這樣的程序就是編程階段完成的里程碑。

在軟件生命期各階段中,相對地說,編程是最容易也是人們已掌握得較好的一個階段,有了用SP方法設(shè)計(jì)的詳細(xì)設(shè)計(jì)方案,又有了高級語言,編程已是比較機(jī)械的了,所以

為數(shù)較多的初級程序員可以參加這一階段的工作。例如,根據(jù)圖4.58的流程圖(或圖4.62的NS圖,或4.11.4節(jié)的一段PDI。描述),運(yùn)用我們已有的編程知識,不難編寫出相應(yīng)的PASCAL或COBOI一程序。

但是,不同的程序設(shè)計(jì)語言有著不同的應(yīng)用范圍。因此,怎樣選擇一種合適的程序設(shè)計(jì)語言,是編碼階段首先遇到的問題。5.2將介紹程序設(shè)計(jì)語言的分類和選擇。

事實(shí)上,編程的絕大部分工作是可以由計(jì)算機(jī)自動完成的,近年來已出現(xiàn)了一些從PAD或從PDI。產(chǎn)生程序的自動工具,l0.4將作簡單介紹。考慮到讀者已經(jīng)具備編程的知識和經(jīng)驗(yàn),本章不打算再討論怎樣編程,而是討論在軟件工程背景下,怎樣編寫“良好的”程序。

有相當(dāng)長一段時期,多數(shù)人認(rèn)為程序只是給機(jī)器執(zhí)行而不是供人閱讀的,所以程序只要邏輯正確,能被機(jī)器理解并依次執(zhí)行就足夠了,至于程序是否容易讀、容易理解則是完

全不必介意的,所以程序員中有一種很嚴(yán)重的低估編程方法的傾向,他們認(rèn)為可以隨意編寫,只要能湊出一份結(jié)果正確的程序就行了’。但是隨著軟件規(guī)模和復(fù)雜性的增加,人們逐步觀察到在軟件生命期中,程序經(jīng)常需要被人閱讀,例如設(shè)計(jì)測試用例、排錯、修改擴(kuò)充時都需要由程序的作者或其他人來閱讀程

序,讀程序仍是發(fā)現(xiàn)錯誤的有效手段。人們意識到讀程序是軟件開發(fā)工作中的一個重要的組成部分,而且讀程序的時間恐怕比寫程序的時間還要多。在這樣的背景下,人們開始認(rèn)識到:程序?qū)嶋H上也是一種供人閱讀的“文章”,只不過:它不是用自然語言而是用程序設(shè)計(jì)語言編寫而已。一個邏輯上正確但雜亂無章的程序是沒有什么價值的,因?yàn)樗鼰o法供人閱讀,所以難以測試、排錯和維護(hù)。

70年代初,有人提出了“可讀性”(Readability)這一新的觀念,主張程序應(yīng)使人們易于閱讀,所以編程的目標(biāo)是編寫出邏輯上正確又易于閱讀的程序,這個觀念很快得到了大家的接受。具有良好可讀性的程序,自然易于理解、易于維護(hù),而且隱含錯誤的可能性也將大大降低,因而可靠性也就高了,因此程序的可讀性對軟件質(zhì)量有深遠(yuǎn)的影響。

為了使程序具有良好的“可讀性”,一個稱職的程序員應(yīng)具有一定的寫作表達(dá)能力,他應(yīng)該能編寫出結(jié)構(gòu)良好、層次分明、思路清晰的文章,一個連文章都寫不好的人是難以編

寫出好的程序的,所以有人說:“對程序員來說,最重要的不是學(xué)習(xí)程序設(shè)計(jì)語言FoR—TRAN、PL/1等,而是英語(日語、漢語)”。同寫文章一樣,程序員在為一個軟件系統(tǒng)編寫程序時應(yīng)該記著:今后會有人(包括你本人)反復(fù)閱讀這個程序,并試圖沿著你現(xiàn)在的思路理解程序的功能及其正確性。我們寧

可在編寫時多化些精力,使程序具有良好的“可讀性”,這將大大節(jié)省人們讀程序的時間。從整體來看,這樣做是值得的。

如何使程序的可讀性較高呢?總的哲學(xué)就是使程序“簡單”和“清晰”。70年代以來,人們已總結(jié)出從章法、句法、修辭等多方面采取措施,使程序簡單和清晰的種種技巧和方法,它們包括:

·用SP方法進(jìn)行詳細(xì)設(shè)計(jì)。

·程序中包含說明性材料。

·良好的程序書寫格式。

·編程風(fēng)格等。

5.3至5.5將介紹這些技術(shù)。程序設(shè)計(jì)是設(shè)計(jì)和描述解決一類問題的過程。從理論上來說,任何一種程序設(shè)計(jì)語言均可作為工具用來完成上述過程,但是,它們對問題的解卻大為不同。因此,我們不僅需

要了解某種語言,而且還應(yīng)該了解不同語言之間的關(guān)系。

程序設(shè)計(jì)語言可以分為機(jī)器語言、匯編語言和高級語言三類。機(jī)器語言和匯編語言又稱為面向機(jī)器的語言,一般來說,它們隨計(jì)算機(jī)型號不同而不同。5.2程序設(shè)計(jì)語言機(jī)器語言是計(jì)算機(jī)硬件系統(tǒng)能夠識別、執(zhí)行的一組指令。指令的全體稱為計(jì)算機(jī)的指令系統(tǒng)。因?yàn)橛?jì)算機(jī)只能識別二進(jìn)制數(shù)碼,所以指令系統(tǒng)中的所有指令均必須以二進(jìn)制編

碼形式來表示,也就是由一串0或1排列組合而成。機(jī)器語言通常分為操作碼和操作數(shù)兩大部分。操作碼表示計(jì)算機(jī)執(zhí)行什么操作,操作數(shù)表示參加操作的數(shù)本身或操作數(shù)所在的

地址。機(jī)器語言程序不易編制也不易理解。匯編語言是用助記符來代替操作碼,用地址符號來代替地址碼的語言。這些助記符通常使用指令功能的英文單詞的縮寫。這樣,每條指令都有明顯的特征,易于理解和記憶。

匯編語言的語句基本上是與機(jī)器指令一一對應(yīng)的。匯編語言通常還提供定義常數(shù)、條件匯編、宏匯編等廣義指令,并允許在程序中加上注釋。雖然編制匯編語言程序不必用二進(jìn)制

來編程,比起機(jī)器語言來說要方便,但是程序的代碼量卻和機(jī)器語言程序差不多。

把匯編語言程序翻譯成機(jī)器語言程序的程序稱為匯編程序,翻譯的過程稱為匯編。相應(yīng)地,把機(jī)器語言程序轉(zhuǎn)換成匯編語言程序叫做反匯編。高級語言是在50年代中期開始發(fā)展起來的。高級語言有相應(yīng)的語法,它獨(dú)立于具體的機(jī)器。為了使計(jì)算機(jī)能讀懂高級語言源程序,需要把源程序翻譯成相應(yīng)的機(jī)器語言程序。這種翻譯程序有兩種類型:一種是編譯程序,另一種是解釋程序。

編譯程序是將源程序翻譯成相應(yīng)的機(jī)器語言的目標(biāo)程序,然后,通過連接裝配程序?qū)⒛繕?biāo)程序連接成可執(zhí)行程序,再直接運(yùn)行可執(zhí)行程序得到運(yùn)行結(jié)果。編譯之后的目標(biāo)程序和連接之后的可執(zhí)行程序可以保存起來,以后要運(yùn)行只要直接運(yùn)行可執(zhí)行程序,不必對源程序重新編譯和連接。解釋程序是將送入計(jì)算機(jī)中的源程序逐條解釋,逐條執(zhí)行。執(zhí)行后即得到運(yùn)行結(jié)果,但不保存執(zhí)行后的機(jī)器碼。這樣,下次運(yùn)行時,還要重新對源程序解釋執(zhí)行。

使用編譯方式,直接運(yùn)行可執(zhí)行程序比運(yùn)行解釋程序要快得多。

一般來說,可以把程序設(shè)計(jì)語言分為四代。第一代是機(jī)器語言,第二代是匯編語言,第三代是面向過程的語言,如FOR.TRAN、PASCAL、C等第四代即新型程序設(shè)計(jì)語言,如lASP、FORTH等。

下面,將幾種常用的程序設(shè)計(jì)語言作一簡單介紹。

1.BASIC語言

BA_SIC是“Beginner,sAll—purposesymbolicInstruc。tionCode”的縮寫。它是由兩位美國學(xué)者JohnG.Kemeng和Thoma.sE.Kurtz于1964年開發(fā)的。

目前的BASIC語言大體上分為三類:基本BASIC、擴(kuò)展BASIC、多用戶分時BASIC。

B.ASIc語言是一種會話式語言,簡單易學(xué)?;綛ASIC只有17條基本語句,兒個標(biāo)準(zhǔn)函數(shù)。擴(kuò)展BAslC功能很強(qiáng),如圖形功能、音樂功能等。除此之外,在實(shí)時控制系統(tǒng)中,

用BASIC加上實(shí)時控制的擴(kuò)展部分可以構(gòu)成過程控制程序。

BAsIc語言還便于和其它程序語言接口,使用方便。

2.COBOL語言

COBOL是“CommonBusinessOrientedLanguage”的縮寫。它是一種適用于商業(yè)、金融業(yè)等數(shù)據(jù)處理的程序設(shè)計(jì)語言。

COBOL語言是由美國國防部組織,并由政府機(jī)構(gòu)、企業(yè)和私人咨詢機(jī)構(gòu)的專家組成的一個團(tuán)體于l959年設(shè)計(jì)的。

COBOL語言源程序由標(biāo)識部分、環(huán)境部分、,數(shù)據(jù)部分和過程部分組成。其中引入了不依賴于機(jī)器的數(shù)據(jù)描述方法,將數(shù)據(jù)的描述和數(shù)據(jù)的操作分離開來。

COBOL語言的另一個特點(diǎn)是采用自然語言的程序設(shè)計(jì)風(fēng)格,其書寫格式接近英語表達(dá)

形式,這對于英語流行的國家和地區(qū)是十分容易推廣的。

60年代和70年代中,大多數(shù)用高級語言編寫的軟件都是用COBOL語言編寫的。

3.FORTRAN語言

FORTRAN是“Formula?!盕ranslator”的縮寫。它是一種適用于科學(xué)和工程計(jì)算的程序設(shè)計(jì)語言。

IBM公司于1956年發(fā)表了FORTRAN語言。目前計(jì)算機(jī)上使用的FORTRAN語言大多數(shù)為FORTRANⅣ和FORTRAN77。其中FORTRAN77是美國國家標(biāo)準(zhǔn)協(xié)會于1978年正式公布的新版本,它引入了字符類型和結(jié)構(gòu)化成份,使FOR.TRAN77能方便地用于非數(shù)值計(jì)算領(lǐng)域。

FORTRAN語言由一個主程序和一組子程序(包括函數(shù))組成。主程序和各個子程序是獨(dú)立編譯的,運(yùn)行前必須把獨(dú)立編譯所得到的各個目標(biāo)程序用連接程序連接起來。

全世界流行的科學(xué)和工程計(jì)算軟件包中,大約90%是用FORTRAN語言寫的。許多計(jì)算方法都有FORTRAN子程序庫,可以直接使用。

FORTRAN語言語法規(guī)定嚴(yán)格并作了許多限制。這樣,編譯過程容易優(yōu)化。因此,使用FOR.TR-AN程序算題較快,又有數(shù)據(jù)的精度保證,適宜于大型的科學(xué)與工程計(jì)算。

4.PASCAL語言

PASCAL語言是1971年由瑞士蘇黎世聯(lián)邦技術(shù)學(xué)院N.Wirth教授開發(fā)的一種結(jié)構(gòu)化程序設(shè)計(jì)語言。它是以歷史上著名的法國數(shù)學(xué)家.PASCAL的名字來命名的。

PASCAL語言的程序結(jié)構(gòu)由程序首部、說明部分和程序體等幾部分組成。它提供了較豐富的數(shù)據(jù)類型和構(gòu)造數(shù)據(jù)結(jié)構(gòu)的方法,同時,它可以滿足結(jié)構(gòu)化程序設(shè)計(jì)的要求。用

PASCAL語言書寫的程序易讀、易懂,并易于進(jìn)行程序驗(yàn)證。所以,PASCAL程序具有較好的可靠性。

PASCA-L語言提供了一種系統(tǒng)的、精確的、合理的方式來表達(dá)程序設(shè)計(jì)的基本概念和結(jié)構(gòu),所以,它特別適合作為程序設(shè)計(jì)課程的教學(xué)語言。

PASCAL語言也具備編制系統(tǒng)和應(yīng)用軟件的各種語法成分,甚至可以編寫PA.SCAL語言本身的編譯程序,即自編譯程序。

5.C語言

1969年,英國劍橋大學(xué)與美國貝爾實(shí)驗(yàn)室的科學(xué)家先后設(shè)計(jì)并實(shí)現(xiàn)了BCPL(即“BasicCornbinedProgrammingLanguage”的縮寫)語言和B語言。l972年~1973年,貝爾實(shí)驗(yàn)室的科學(xué)家們在B語言的基礎(chǔ)上重新設(shè)計(jì)了一種取名為C的語言,它是一種適用于編寫系統(tǒng)軟件的程序設(shè)計(jì)語言。

貝爾實(shí)驗(yàn)室的科學(xué)家用C語言重寫了UNIX操作系統(tǒng)第五版,為UNIX的移植和發(fā)展奠定了基礎(chǔ)。l975年用C語言完成的UNIX第六版公諸于世,C語言逐漸被重視。

C語言程序具有模塊化和良好的程序結(jié)構(gòu)。它對硬件控制能力強(qiáng),具有直接訪問物理地址和直接操作硬件的功能。同時,它可以完成與匯編語言相同的功能,克服了匯編語言

不可移植和可讀性差等缺點(diǎn)。此外,C語言書寫簡單、易學(xué),程序設(shè)計(jì)自由、靈活。它的目標(biāo)程序執(zhí)行效率接近于低級語言的效率。

6.LISP語言

LISP是“ListProcessor”的縮寫。它是1958年由J.McCarthy設(shè)計(jì)出來的一種符號處理語言。這種語言主要用來解決人工智能領(lǐng)域的問題,例如專家系統(tǒng)、自然語言理解、模式識別、計(jì)算機(jī)輔助學(xué)習(xí)和系統(tǒng)程序設(shè)計(jì)等。在計(jì)算機(jī)應(yīng)用方面有一個非常有意義的領(lǐng)域叫做非數(shù)值處理。LISP就是一種處理非數(shù)值數(shù)據(jù)的程序設(shè)計(jì)語言。它有兩種基本數(shù)據(jù)類型:表和原子。首先,原子是表,其次,兩個表可以構(gòu)造一個復(fù)合表。表又是遞歸定義的,也就是在表的定義中又用到了表。在LISP語言中,對于表還定義了一組簡單而又實(shí)用的操作。如兩個表構(gòu)造一個復(fù)合表,從一個表中選出其第一個分量的運(yùn)算和從一個表中去掉其第一個分量而取余下部分的運(yùn)算,以及一些其它運(yùn)算等。這些運(yùn)算均是非數(shù)值處理語言中最基本的運(yùn)算。通過原子、表和表的運(yùn)算以及定義一些LISP函數(shù),就可以進(jìn)行種種非數(shù)值處理工作。

LISP語言的理論基礎(chǔ)是數(shù)理邏輯,它屬于函數(shù)型語言。因此,它比較適用于知識處理,成為最常用的知識工程語言。

7.其他語言

ADA語言是由美國國防部研制的。ADA中的對象概念是指數(shù)據(jù)類型中的對象。ADA語言有相當(dāng)強(qiáng)的表達(dá)能力,能廣泛應(yīng)用于數(shù)值計(jì)算、系統(tǒng)程序設(shè)計(jì)、實(shí)時并行處理等領(lǐng)域。

PROLOG語言以一階謂詞理論及關(guān)系理論為基礎(chǔ)。它是一種陳述性語言,只描述要計(jì)算機(jī)做什么,而并不告訴計(jì)算機(jī)怎樣一步步去運(yùn)算。PROLOG語言可用于人工智能、專家

系統(tǒng)、辦公室自動化、關(guān)系數(shù)據(jù)庫及CAD等領(lǐng)域。

SMALLTALK語言和c++均屬于面向?qū)ο笮驼Z言,它們適用于面向?qū)ο蟮某绦蛟O(shè)計(jì)。

綜上所述可以看出,每一種程序設(shè)計(jì)語言都有其自身的特點(diǎn)。因此,選擇語言時要根據(jù)它們的特點(diǎn)慎重進(jìn)行。語言選擇的一般準(zhǔn)則是:

1)項(xiàng)目的應(yīng)用領(lǐng)域:這是選擇語言的關(guān)鍵因素。在其它條件都具備的情況下,盡量選取適合某個應(yīng)用領(lǐng)域的語言。例如,在科學(xué)工程領(lǐng)域中,F(xiàn)ORlTRAN語言仍然作為一種最流行的語言,也可以選取PASCAL等語言。在商用數(shù)據(jù)處理領(lǐng)域,通常使用COBOI。語言或第四代語言。在實(shí)時處理或系統(tǒng)程序中,通常使用匯編語言、C或ADA等語言。在人工智能領(lǐng)域主要采用LISP或PROLOG語言。

2)算法和計(jì)算復(fù)雜性:一般來說,商用數(shù)據(jù)處理和系統(tǒng)軟件的算法要簡單一些,而科學(xué)工程計(jì)算和模擬、實(shí)時計(jì)算機(jī)系統(tǒng)以及人工智能算法要復(fù)雜得多。要根據(jù)不同語言的特點(diǎn),選取能夠適應(yīng)軟件項(xiàng)目算法和計(jì)算復(fù)雜性的語言,這與工程特點(diǎn)也是密切相關(guān)的。

3)軟件的執(zhí)行環(huán)境:很顯然,要選取機(jī)器上能運(yùn)行且具有相應(yīng)支持軟件的語言。

4)性能因素:這是結(jié)合工程具體性能來考慮的準(zhǔn)則。例如,對于實(shí)時系統(tǒng),要求時間快,當(dāng)然最好選取匯編語言。

5)數(shù)據(jù)結(jié)構(gòu)的復(fù)雜性:一般來說,商用數(shù)據(jù)處理和系統(tǒng)軟件的數(shù)據(jù)結(jié)構(gòu)復(fù)雜??茖W(xué)工程計(jì)算和模擬、實(shí)時計(jì)算機(jī)系統(tǒng)等數(shù)據(jù)結(jié)構(gòu)較為簡單。要根據(jù)不同語言構(gòu)造數(shù)據(jù)結(jié)構(gòu)類型的能力選取合適的語言。

6)軟件開發(fā)人員的水平:人們一般習(xí)慣于使用過去熟練使用過的語言。要選取新的語言,不僅存在軟件開發(fā)人員學(xué)習(xí)和使用問題,而且還要克服心理上對新語言的抵制。提高程序可讀性的關(guān)鍵是使程序結(jié)構(gòu)簡單清晰,SP方法是達(dá)到這一目標(biāo)的根本手段。

4.10對SP方法作了簡介,SP方法的基本精神是按由頂向下逐步細(xì)化的方式用三種標(biāo)準(zhǔn)控制結(jié)構(gòu)反復(fù)嵌套來構(gòu)造一個程序。大多數(shù)高級語言都支持sP方法,其語法中含有表示三種基本結(jié)構(gòu)的語句,所以從SP方法設(shè)計(jì)的方案到程序間的過渡是直截了當(dāng)?shù)?,只需用對?yīng)的語言結(jié)構(gòu)代替標(biāo)準(zhǔn)的控制結(jié)構(gòu)就行了。例如4.11.3中,按“走樹”規(guī)則,從圖4.44的PAD可直接得到一段PASCAL程序。5.3

SP方法與編程用SP方法產(chǎn)生的程序是簡單清晰的,它由許多塊組成,每塊只有一個入口和一個出口,程序中一般沒有GOTO語句。這種程序稱為結(jié)構(gòu)化程序(StructuredProgram),同過去不加限制地使用GOTO語句相比較,結(jié)構(gòu)化程序具有易于閱讀、易于驗(yàn)證的優(yōu)點(diǎn)。無限制地使用GOTO語句編寫的程序是“面條狀”的,其結(jié)構(gòu)雜亂無章,而且空間順序同執(zhí)行時間順序完全不對應(yīng),所以難以閱讀、難以理解,還容易隱含一些錯誤。結(jié)構(gòu)化程序則相反,它只有三種基本結(jié)構(gòu),程序的空間順序與時間順序基本上是一致的,因此可以從頭至尾順序閱讀,這樣的程序也就易于測試、排錯和修改。

閱讀結(jié)構(gòu)化的程序可采用“自頂向下”或“由底向上”的方式。如果程序帶有較詳細(xì)的注釋或其他說明材料,可用“自頂向下逐步細(xì)化”的方式來閱讀,此時可以充分利用中間各層的注釋或說明幫助理解,直至最底層。

如果程序的注釋很少,則宜采用“由底向上逐步抽象”的方式閱讀,此時可以逐層補(bǔ)寫出中間備層次的抽象說明,直至最上層。

由于只有三種基本結(jié)構(gòu),對結(jié)構(gòu)化程序就有可能驗(yàn)證其正確性。人在70年代初開發(fā)的紐約時報情報檢索系統(tǒng)和空間實(shí)驗(yàn)室的飛行模擬系統(tǒng),在開發(fā)過程中他們以SP方法為指導(dǎo),還配合了一些管理技術(shù),這兩個大型系統(tǒng)獲得了成功,統(tǒng)計(jì)數(shù)

字說明軟件生產(chǎn)率比傳統(tǒng)的做法提高了一倍,而且在系統(tǒng)中沒有發(fā)現(xiàn)嚴(yán)重的錯誤。早期的程序基本上沒有說明,這種程序是難以閱讀的,因此也就難以維護(hù)。

大型軟件系統(tǒng)的程序內(nèi)部必須帶有說明性材料,即“內(nèi)部文檔”內(nèi)部文檔可用注釋語,句書寫,程序中適當(dāng)?shù)丶由献⑨尯?,可以使程序成為一篇“自我解釋”的文章,讀程序時就不必再翻閱其他說明材料了,因而使用注釋是提高程序可讀性的有力手段。

注釋原則上可以出現(xiàn)在程序中的任何位置,但是如果使注釋與程序的結(jié)構(gòu)配合起來,則效果更好。目前習(xí)慣的做法是將注釋分為兩類:序言性注釋和描述性注釋。5.4程序內(nèi)部文檔序言性注釋出現(xiàn)在模塊的首部,其內(nèi)容一般包括:

1)有關(guān)模塊功能的說明。

2)界面描述,包括調(diào)用語句格式、所有參數(shù)的解釋和該模塊需調(diào)用的模塊名等。

3)一些重要變量的使用、限制及其它信息。

4)開發(fā)歷史,如作者、復(fù)查者、復(fù)查日期、修改的日期和敘述等。

圖5.1是一個序言性注釋的例子,NGON是某大型圖示系統(tǒng)中的一個模塊,它用FOR-TRAN語言編寫。描述性注釋嵌在程序之中,描述性注釋又有功能性的和狀態(tài)性的,功能性注釋說明程序段的功能,通??煞旁诔绦蚨沃?,狀態(tài)性注釋說明數(shù)據(jù)的狀態(tài),通??煞旁诔绦蚨?/p>

之后。

下面兩段程序中,用方括號括起來的是注釋。

[sETxTOMIN(A,B,c)]

IFA<B

THENESETxToMIN(A,c)]

IFA<cTHENx:=AEI,SEx:=cFI

ELSEESETxToMIN(B,c)]lFB<CTHENX:=BELSEX:=CFI

FI[X=MIN(A,B,C)]

I=1

[抹去N中高位的零]

WHILEN(I)='0'

DO[抹去N中第1個字符,準(zhǔn)備查第J+1個字符]

N(I):='BLANK'

I:一I+l

OD[N中高位的零已抹去]圖5.1第一個例子是選擇結(jié)構(gòu),這里第一個注釋說明整個程序的功能,第二個注釋說明THEN后語句段的功能,第三個注釋說明ELSE后語句段的功能,最后的注釋指出這段程序

執(zhí)行之后的數(shù)據(jù)狀態(tài)。

第二個例子是循環(huán)結(jié)構(gòu),這里第一個注釋說明整個循環(huán)句的功能,第二個注釋說明循環(huán)體內(nèi)語句段的功能,最后一個注釋說明程序執(zhí)行之后的數(shù)據(jù)狀態(tài)。

這兩個例子都是很簡單的程序,實(shí)際上并不需要寫這么多的注釋,這里只是用來說明注釋與程序結(jié)構(gòu)的配合。如果詳細(xì)設(shè)計(jì)是用PDL描述的,則編程時可將PDL描述作為注釋嵌在程序中。

對于注釋,還應(yīng)注意以下幾點(diǎn):

1)注釋應(yīng)該與程序一致,否則它就毫無價值,甚至還會把事情搞得更糟,所以修改程序時應(yīng)同時修改注釋。

2)注釋應(yīng)當(dāng)提供一些從程序本身難以得到的信息,而不是重復(fù)程序語句。

3)是對語句段作注釋,而不是對每個語句作注釋。

在漢字可以被計(jì)算機(jī)處理之后,國內(nèi)應(yīng)該注意在程序中適當(dāng)?shù)厥褂米⑨尅?/p>

除了加上注釋之外,程序的書寫格式也應(yīng)有助于閱讀,一個主要的手段是采用縮排法,考慮下面的程序:

DOI—lTON—l;T=l;DOJ—I+lTON;

IFA(J)<A(T)THENDOT—J;END;。

IFT<>ITHENDOH—A(T);A(T)一A(I);A(I)一H;END;END;由于一行中書寫了多個語句,而且換行時不考慮程序結(jié)構(gòu),所以將程序的循環(huán)和條件結(jié)構(gòu)掩蓋了。如果采用下面的縮排法使程序的書寫反映其邏輯結(jié)構(gòu)的深度,則可讀性會顯

著提高:

DOI—lTON—l;

T一1;

DOJ—I+lTON;

IFA(J)<A(T)

I

HENDO

T—J;

END;

IFT<>I

tHENDO

H=A(T);

A(T)=A(I);

A(I)=T;

END;

END;

END;

縮排法可用自動工具來實(shí)現(xiàn),這種工具稱為程序格式化工具(CodeFormatter)。

此外,在程序段之間、程序和注釋間安排空白行,也有利于閱讀。

Kernighan和Plauger于1974年出版了“編程風(fēng)格要點(diǎn)(TheElementsofProgramming軟件系統(tǒng)開發(fā)技術(shù)Style)”一書,書中討論了提高程序質(zhì)量的種種技巧,本節(jié)選擇其中部分歸納為以下幾項(xiàng)作一簡要介紹:

1)變量名的選擇。

2)表達(dá)式的書寫。

3)簡單、直接地反映意圖。

4)GOTO語句的使用。5.5編程風(fēng)格5.5.1變量名的選擇

理解程序中每個變量的含義是理解程序邏輯的關(guān)鍵,所以程序中變量的名字應(yīng)該適當(dāng)?shù)剡x擇,使其直觀、易于理解、而且安全可靠。下面是一些技巧:

1.采用有實(shí)際意義的變量名

有實(shí)際意義的名字能幫助理解和記憶,缺乏實(shí)際意義或意義不確切的名字則不便記憶并可能妨礙理解,例如與

D=S*T

相比,

DISTANCE==SPEED*TIME

更易于理解,而且所需的注釋也少。當(dāng)然如果變量名過長,又會過多地增加打字量。一般經(jīng)驗(yàn)認(rèn)為,變量名以4至12個字符為宜,最好事先能對變量名的選取約定統(tǒng)一的標(biāo)準(zhǔn),以后閱讀理解就會方便得多。

這一技巧對過程名和語句標(biāo)號同樣適用。

2.不用過于相似的變量名

因?yàn)檫@樣容易引起誤解或打字錯誤。例如ELL、EMM、ENN、EMMN、ENNN等放在一起很容易混淆,打字時手指下意識地抖動就易產(chǎn)生不易察覺的錯誤;又如POSITIONX和

POSITIONY是僅僅末尾不相同的長標(biāo)識符,如果編譯程序只識別前八個字符就會出現(xiàn)錯誤,所以是不安全的。

3.變量名中一般不要帶有數(shù)字

由于字母O、I、Z、S和數(shù)字0、1、2、5極易、7昆淆,所以變量名NO5S難以被人區(qū)分是“字母N、數(shù)字O、數(shù)字5、字母S”,還是“字母N、字母O、字母S、字母S”。

4.同一變量名不要具有多種含義

例如變量NEW在程序的第一、第三和第四段分別表示不同的含義,則閱讀時易于誤解,將來修改時亦易造成錯誤。

5.顯式說明一切變量

盡管有些語句(如FORTR_AN)允許對變量名不作說明就直接使用,但為了易于理解,還是顯式說明為好。

6.對變量最好作出注釋說明其含義

關(guān)于這一點(diǎn),在PASCAlJ中用戶定義的數(shù)據(jù)類型或指針等則尤為必要。5.5.2表達(dá)式的書寫

表達(dá)式的書寫應(yīng)注意下面一些技巧:

1.盡量少用中間變量

有的程序員為了追求效率,往往喜歡將表達(dá)式寫成

X—A(I)+1/A(I)

AI—A(1)

X—AI+1/AI因?yàn)樗庾R到簡單變量的運(yùn)算比下標(biāo)變量快;或者將表達(dá)式寫成

TOTAL=Y+A/B*C

VAR=X+A/B*C

ABC=A/B*C

TOTAL=Y+ABC

VAR=X+ABC因?yàn)檫@樣可以少做一次除法和乘法;或者將表達(dá)式寫成

FX=(X1一X2**2)**2+(1.O—X2)**2

F1=X1一X2*X2

F2=1.O—X2

FX=F1*F1一KF2*F2

因?yàn)镕1*F1比F1**2要快。上述三例的后一種寫法,雖然效率高些,但引進(jìn)了中間變量AI、ABC和F1、F2,將一個算式拆成幾行,理解上稍困難,而且將來一些難以預(yù)料的修改有可能更動這幾行表達(dá)式的次序或在其間插入其他語句,就易造成邏輯上的錯誤。第一種寫法將計(jì)算一氣呵成,則比較安全可靠。

這些例子又一次說明了效率和可理解性、可維護(hù)性、可靠性往往是矛盾的。

2.注意添加括號澄清計(jì)算意圖

例如算式一A**2可能被人理解成(一A)**2,也可能理解成一(A**2),所以最好添加括號澄清意圖,免得以后誤解。

3.注意浮點(diǎn)運(yùn)算的誤差

例如10.0乘0.1一般不等于1.0,十個0.1相加一般也不是1.0,所以在區(qū)間[0,1]中以步長為0.1作計(jì)算時,要注意循環(huán)是否將進(jìn)行10次。

又如A=3.0,B=4.0,C=5.0的三角形是直角三角形,但將各邊縮小10倍后,如果不注意浮點(diǎn)運(yùn)算的誤差,就可能出現(xiàn)錯誤的結(jié)論。所以,不要對浮點(diǎn)數(shù)作相等比較。

4.注意整數(shù)運(yùn)算的特點(diǎn)

例如I/2*2可能不再等于I。

5.5.3簡單、直接地反映意圖

先看下面一段FORTRAN程序:

DO141=1,N

DO14J=1,N

14V(I,J)=(I/J)*(J/I)顯然,這個雙重循環(huán)要對NXN元矩陣V賦值,賦什么值呢?由于I和J是整型變量,當(dāng)I小于J時(I/J)為零,當(dāng)I大于J時,(J/I)為零,所以僅當(dāng)I等于J時,(I/J)*(J/I)為1,其余情況為零,因此這個程序使矩陣V對角線上的元素為l其余元素為0,即設(shè)置一個幺陣。程序的構(gòu)思多么巧妙!賣弄技巧的程序往往不能直截了當(dāng)?shù)胤从秤?jì)算目標(biāo),為了明白其功能,讀者必須像上面那樣論證一番,這些都是人為造成的額外負(fù)擔(dān),為了便于理解,上面的程序還是改為這

樣更好:

DO14I=1,N

DO12J=1,N

12

V(I,J)=0.O

14

V(I,I)=1.0再看下面的程序:

IF(X.LT.Y)GOTO30

IF(Y.LT.Z)GOTO50

SMALL=Z

GOTO70

30IF(X.LT.z)GOTO60

SMALL=Z

GOTO70

50SMALL—Y

GOTO70

60SMALL—X

70……這個10行的程序包含的6個GOTO語句看來是很深奧的,仔細(xì)研究后才明白它的功能是使SMALL取X、Y、Z中的最小值。這樣的程序絕不能說是高質(zhì)量的,為求最小值,程序只需這樣簡明扼要地編寫就行了:

SMALL=X

IF(Y.LT.SMALL)SMALL=Y

IF(Z.LT.SMALL)SMALL=Z

所以,程序應(yīng)當(dāng)簡單、直接地反映意圖,不必過于巧妙或深奧。5.5.4GOTO語句的使用

Dijkstra有一句名言:“程序員的水平同他所編程序中使用的GOTO語句之密度成反比”。GOTO語句引起迂回曲折,使程序難以理解,實(shí)際經(jīng)驗(yàn)也說明了,程序中不必要地到處跳轉(zhuǎn)是出錯的主要原因。從上一節(jié)中求最小值的第一個程序也可看出,大量GOTO語句的使用,恰恰說明了程序員考慮問題的不周。如果采用SP方法,編程原則上已不需用GOTO語句了,但在某些情況下(例如出現(xiàn)例外情況時,從循環(huán)體中跳出),用GOTO語句描述還是比較直截了當(dāng)?shù)?;此外,F(xiàn)ORTRAN

或:BASIC等語言的某些版本不可避免地要使用GOTO語句,所以本節(jié)就GOTO語句的使用再說明幾個要注意的問題。

1.避免不必要的GOTO語句

將5.5.3中求最小值的兩個程序作比較,我們就能明白這一點(diǎn)。

2.不要使GOTO語句相互交叉

觀察下面的程序:

GRVAL=A(1)

DO251=2,lO

IF(A(I).GT.GRVAL)GOTO30

GOTO

溫馨提示

  • 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

提交評論