ch7-軟件工程七章編碼設(shè)計2011209_第1頁
ch7-軟件工程七章編碼設(shè)計2011209_第2頁
ch7-軟件工程七章編碼設(shè)計2011209_第3頁
ch7-軟件工程七章編碼設(shè)計2011209_第4頁
ch7-軟件工程七章編碼設(shè)計2011209_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

編碼設(shè)計(主講趙元哲)西安電子科技大學(xué)研究生院課程程序設(shè)計語言的選擇程序設(shè)計途徑與編寫程序的風(fēng)格保護性編程冗余編程1程序設(shè)計語言的選擇

翻譯過程在編程步驟中,要把詳細設(shè)計的表達式翻譯成編程語言的構(gòu)造,編譯器接受作為輸入的源代碼,源代碼生成作為輸出并從屬于機器的目標(biāo)代碼(obj),然后編譯器把輸出目標(biāo)代碼進一步翻譯成機器代碼(它是真正指令),由CPU執(zhí)行。

程序設(shè)計的語言分類:基礎(chǔ)語言(BASIC,FORTRAN,COBOL,ALGOL)

結(jié)構(gòu)語言(PL/1,PASCAL,C.ADA)

專用語言(FORTH,PROLOG,LISP)

系統(tǒng)實現(xiàn)語言(C)語言分類靜態(tài)高級語言(COBOL,FORTRAN)

動態(tài)高級語言塊結(jié)構(gòu)高級語言(ALGOL,PASCAL)

可視化編程語言(VB,VC,PB,BC,C++BUILDER)

程序設(shè)計語言特點與特性

編程語言的特點命令式語言(c)、面向?qū)ο笫秸Z言(c++)、函數(shù)式語言(lisp)、邏輯型語言(prolog)心理學(xué)觀點在編程中,人的因素極其重要,所以,語言的心理學(xué)特性對代碼的翻譯和實現(xiàn)的設(shè)計都有重要影響。

1)一致性一致性是表示某種語言使用一致的符號、采用看似任意的限制以及支持語法或語義例外規(guī)則的程度。例如,FORTRAN用圓括號作數(shù)組下標(biāo)的界限符,算術(shù)運算有限次序的修改符等,容易引起難以覺察的錯誤。

2)

多義性編程語言的多義性是程序員的理解。一般一條語句一個解釋。有時卻有多種解釋。

3)

緊湊性

緊湊性是一種面向代碼信息量的表示.度量緊湊性的語言屬性有:

(1)該語言支持結(jié)構(gòu)化構(gòu)造和邏輯“塊”的程度

(2)

所用的關(guān)鍵字和縮寫詞的種類

(3)

數(shù)據(jù)類型和缺省特性的品種

(4)

算術(shù)運算和邏輯運算的數(shù)量

4)

局域性編程語言的綜合特性,當(dāng)語句可以組合為程序塊,結(jié)構(gòu)化構(gòu)造可以直接實現(xiàn),設(shè)計代碼和合成代碼具有高的模塊性和聚合時,局域性就高.

5)

線性:一種心理特性.它與保持功能域的概念緊密聯(lián)系。即當(dāng)遇到一個邏輯運算線性序列時,人容易理解;外延分支和外延大的循環(huán)都違反處理的線性,而結(jié)構(gòu)化構(gòu)造的直接實現(xiàn)有助于編程語言的線性。工程觀點以具體的軟件開發(fā)項目的需要為基礎(chǔ),注意源代碼的工程特性:

(1)易于把設(shè)計翻譯為代碼;

(2)編譯器效率;

(3)源代碼可移植性:源代碼不修改或很小修改,直接搬到另一編譯器,環(huán)境變了,源碼不變;

(4)開發(fā)工具的可用性:許多編程語言有調(diào)試工具,

內(nèi)部編輯,源碼控制,瀏覽器,宏處理器,反向工程工具和其他工具;

(5)可維護性:源碼必須可讀,并能根據(jù)設(shè)計的變化進行修改等。技術(shù)觀點數(shù)據(jù)結(jié)構(gòu)的復(fù)雜性問題數(shù)據(jù)實時處理能力數(shù)據(jù)庫操作問題

選擇一種語言

因為一種語言不可能同時滿足各種需求,應(yīng)該對各種需求(項目應(yīng)用領(lǐng)域、軟件開發(fā)方法、執(zhí)行環(huán)境等)進行權(quán)衡,比較各種可用語言的適用程度,選擇最適用的。

用于評價語言的準(zhǔn)則:(1)一般的應(yīng)用領(lǐng)域,(2)算法和計算的復(fù)雜性

(3)軟件運行環(huán)境

(4)性能考慮

(5)數(shù)據(jù)結(jié)構(gòu)的復(fù)雜性

(6)軟件開發(fā)人員的知識

(7)好的編譯器或交叉編譯器的可使用性.

2程序設(shè)計途徑與編寫程序的風(fēng)格

l程序設(shè)計方法論

方法論:

自上而下:程序可讀性好,可靠性高。

自下而上:局部優(yōu)化:系統(tǒng)整體性差,但能及時發(fā)現(xiàn)算法是否可行,返工性好。二種方法各有優(yōu)缺點:在軟件預(yù)研和攻關(guān),技術(shù)積累時采用自下而上,在緊迫工程時,采用自上而下.

l程序設(shè)計自動化

三種途徑實現(xiàn)程序設(shè)計自動化l程序設(shè)計工具

1.編譯程序它是最基本的程序設(shè)計工具,它可以診斷出程序中的錯誤,減少開發(fā)成本,生成高效率的機器代碼

2.代碼管理系統(tǒng)l編碼風(fēng)格編碼風(fēng)格實際上是一種編碼原則,編碼對象是有兩個:

機器:編碼要為機器所理解與執(zhí)行

人:能讀懂,方便使用與維護編碼風(fēng)格最重要的有兩條:簡單和清晰。與編碼風(fēng)格有關(guān)的因素:

代碼的文檔化、數(shù)據(jù)說明方法、語句構(gòu)造處理、I/O技術(shù)。L代碼文檔化

代碼文檔化是從選擇標(biāo)識符(變量、標(biāo)號)的名字開始,接著是寫程序和安排注釋,最后是程序的整個視覺組織形式。所有的編程語言都允許用自然語言在程序中進行注釋,問題在于:

(1)多少注釋才算夠?

(2)

注釋應(yīng)該放在什么位置?

(3)

注釋是否會使邏輯流不清楚?

(4)

注釋是否會使讀者誤解?

(5)

注釋是否會使程序不可維護?很難回答,但必須清楚:軟件必須包含代碼的內(nèi)部說明,開發(fā)者可以用注釋的方法對代碼內(nèi)部進行說明。L注釋(注釋范例):

①序言性注釋:應(yīng)該安排在模塊的起始部分,內(nèi)容有:

(1)說明每個模塊的用途,指明它的功能

(2)接口描述,包括:調(diào)用序列,每個參數(shù)的描述,以及所有從屬模塊清單。

(3)討論有關(guān)數(shù)據(jù),包括:重要的變量和它們的用途、限制或約束條件,以及其他必要的信息。

(4)開發(fā)歷史,包括:模塊設(shè)計人姓名,評審人姓名及日期、修改說明及日期。②功能性注釋:

應(yīng)嵌入在源代碼體內(nèi),描述處理功能。注釋基本原則是:注釋要解釋程序代碼,提供附加說明。此外,還應(yīng)做到:

(1)

注釋是說明代碼塊,而不是注釋每一行代碼。(2)

使用空行或縮格,以易于區(qū)分注釋和代碼。

(3)

注釋一定要正確,以免引起錯誤,造成誤解。序言性注釋:功能性注釋:當(dāng)使用PDL表示進行詳細設(shè)計時,設(shè)計文檔可以作為注釋直接嵌入在源代碼體內(nèi),十分有效,當(dāng)修改設(shè)計或代碼時,確保設(shè)計和代碼都能維護。(1)數(shù)據(jù)說明的次序應(yīng)規(guī)范化,可使數(shù)據(jù)屬性更容易尋找,有利于測試、糾錯和維護。

(2)當(dāng)多個變量名在一條語句說明時,變量名的次序應(yīng)按字母順序排列。

(3)如果設(shè)計中,確定了一個復(fù)雜的數(shù)據(jù)結(jié)構(gòu),就應(yīng)該用注釋說明在編程語言實現(xiàn)時的特點。l語句構(gòu)造

軟件邏輯構(gòu)造是在設(shè)計時確定的,每個語句構(gòu)造則是編碼步驟中的一部分。語句構(gòu)造應(yīng)當(dāng)遵守的原則是:

每條語句應(yīng)當(dāng)簡單而直接,不應(yīng)為了追求運行效率而使代碼變得復(fù)雜化,讓人難以理解。為了提高代碼的可讀性,最好一行只寫一條語句(因為許多編程語言允許一行寫多條語句)。還應(yīng)采用縮排的方式,這樣可以使程序段的邏輯結(jié)構(gòu)和功能特征更加清晰。單條源代碼(語句)的簡化方法如下:(1)避免使用復(fù)雜的條件測試。(2)排除測試條件的“非”。(3)避免多重循環(huán)嵌套或條件嵌套。(4)用括號的方法使邏輯表達式或算術(shù)表達式更加清晰。(5)用空格或可讀的符號使語句內(nèi)容更加清晰。(6)只使用國家標(biāo)準(zhǔn)。(7)要想著,如果代碼不是我編寫的,我也能讀懂它。

總之,一句話:要力求直接了當(dāng),簡單明了。

l

I/O

I/O的風(fēng)格不是在編碼時確定的,是在軟件需求分析和設(shè)計中確定的。但編碼時,I/O的實現(xiàn)方式?jīng)Q定了用戶對系統(tǒng)特征的可接受程度。不管軟件的性質(zhì)是批處理,還是交互的,在設(shè)計和編碼時,都應(yīng)考慮下述有關(guān)I/O風(fēng)格原則:(1)檢查所有輸入數(shù)據(jù)的有效性。(2)檢查輸入項上的重要組合的合法性。(3)

保持簡單的輸入格式。(4)使用數(shù)據(jù)結(jié)束說明符,不應(yīng)要求用戶規(guī)定輸入項目的數(shù)量。(5)用標(biāo)記標(biāo)明交互的輸入請求,應(yīng)規(guī)定可以使用的選擇值或邊界值。(6)當(dāng)編程語言對格式有嚴格的要求時,應(yīng)保持輸入格式的一致性。(7)給所有輸出加標(biāo)記,并設(shè)計所有輸出報告。l

效率

有三條準(zhǔn)則應(yīng)該指出的:(1)效率是一種性能要求。因此,應(yīng)當(dāng)在軟件需求時規(guī)定。軟件效率應(yīng)按實際需要來要求,而不是越高越好。(2)

一個良好的設(shè)計可以提高效率。(3)

代碼效率與代碼的簡單性緊密聯(lián)系。

追求效率建立在不損害程序可靠性和可讀性基礎(chǔ)上!提高效率的根本途徑:設(shè)計方法、數(shù)據(jù)組織、算法,而非簡單的語句調(diào)整!l

代碼效率

源代碼的效率與詳細設(shè)計階段所確定的算法效率直接相關(guān)。但編碼風(fēng)格也會影響運行速度和對內(nèi)存的需要。一般可以使用以下準(zhǔn)則:(1)在進行編碼以前,應(yīng)簡化算術(shù)表達式和邏輯表達式。(2)要細心的評價嵌套循環(huán),以確定能否把一些語句或表達式移到循環(huán)外邊。(3)

應(yīng)盡量避免使用多維數(shù)組。(4)

應(yīng)盡量避免使用指針和復(fù)雜的列表。(5)

采用快的算術(shù)運算。(6)

即使語言允許,也不要采用混合數(shù)據(jù)類型。(7)只要可能,應(yīng)當(dāng)采用整型算術(shù)表達式和布爾表達式。l

內(nèi)存效率

內(nèi)存限制大多已是過去的事了。低成本內(nèi)存提供了大的物理地址空間,虛存管理為應(yīng)用軟件提供了巨大的邏輯地址空間,對于這樣的環(huán)境,內(nèi)存效率不等于使用最小內(nèi)存。

內(nèi)存效率必須注意考慮操作系統(tǒng)的分頁特征,代碼局域性或通過結(jié)構(gòu)化構(gòu)造功能域的管理是減少分頁和提高效率的最好辦法。盡管低成本、高密度內(nèi)存芯片發(fā)展很快,但在嵌入式微處理器領(lǐng)域中,內(nèi)存限制仍是一個非常實際非常重要的問題。如果系統(tǒng)需求(如高容量低成本產(chǎn)品)要求最小內(nèi)存,必須非常細心的對高級語言的編譯程序進行估算,或作為最后的手段,也可以采用匯編語言。l

I/O效率當(dāng)討論I/O效率時,有兩類I/O要考慮。(1)

由人支配的I/O。

(2)

取決于其他設(shè)備的(如磁盤或另一臺計算機)的I/O。提高I/O效率的簡單原則:(1)

I/O要求的數(shù)量應(yīng)當(dāng)減至最小。(2)所有I/O應(yīng)當(dāng)緩存,以減少過多的通信次數(shù)。(3)對于輔存(如磁盤),應(yīng)當(dāng)選擇和使用最簡單的可接受的存取方法。(4)輔存設(shè)備的I/O,應(yīng)當(dāng)是塊狀的。終端和打印機的

I/O,應(yīng)當(dāng)考慮設(shè)備的特性,以提高質(zhì)量和速度。(5)要記住,如果超高效的I/O不能被人們所理解,那么這樣的I/O是沒有價值的。Defensiveprogrammingisaformofdefensivedesignintendedtoensurethecontinuingfunctionofapieceofsoftwareinspiteofunforeseeableusageofsaidsoftware.TheideacanbeviewedasreducingoreliminatingtheprospectofMurphy'sLawhavingeffect.Defensiveprogrammingtechniquesareusedespeciallywhenapieceofsoftwarecouldbemisusedmischievouslyorinadvertentlytocatastrophiceffect.Defensiveprogrammingisanapproachtoimprovesoftwareandsourcecode,intermsof:

Generalquality-Reducingthenumberofsoftwarebugsandproblems.

Makingthesourcecodecomprehensible-thesourcecodeshouldbereadableandunderstandablesoitisapprovedinacodeaudit.

Makingthesoftwarebehaveinapredictablemannerdespiteunexpectedinputsoruseractions.西方的“墨菲定律”(Murphy'sLaw)?!澳贫伞笔沁@樣說的:Anythingthatcangowrongwillgowrong.:“凡事只要有可能出錯,那就一定會出錯?!?保護性編程(defensiveprogramming)最常見的defensiveprogramming方法是加assertion(就是一種強制檢查),比如:

在訪問一個內(nèi)存地址之前,先檢查指向那里的指針是否有效。在win32平臺上可以加入<assert.h>,然后就可以用assert(bool)這個函數(shù)。如果檢查出這里有錯,程序就會被中斷在這行語句處,同時在終端打印出文件名、行號、和assert的內(nèi)容.對于認為編寫程序可以做到完全沒有錯誤的人來說,在軟件中建立檢查的意義不大。相反,對于相信軟件中總會有遺留錯誤的人來說,進行軟件內(nèi)部的錯誤檢查則是一項重要策略,這種策略就是保護性編程。保護性編程技術(shù)可分為主動和被動兩種:

主動保護技術(shù)周期性的或在空閑時間對整個程序或數(shù)據(jù)庫進行搜索,用以發(fā)現(xiàn)異常情況。

被動保護技術(shù)是在到達檢查代碼時,對程序的某些部分進行檢查。反對保護性編程人員提出了許多逃避保護性編程的理由:(1)“我們的程序中即使有錯誤,也是很少的,所以不需要保護性編程。”(2)“要求采用他人的程序來檢查和發(fā)現(xiàn)我的程序錯誤,這是不公正的。”(3)“錯誤檢查降低了計算機系統(tǒng)的速度,而且還要求額外的內(nèi)存。”(4)“錯誤檢查要占用很多編程時間?!保?)“可以在我的程序中加入錯誤檢查,不過一旦程序通過測試,就應(yīng)把它撤去?!?/p>

對這些反對意見的回答,都直接或間接的與程序中預(yù)料的錯誤數(shù)及其潛在后果有關(guān)。

如果相信錯誤無所不在,即有相當(dāng)數(shù)量的錯誤在晚期發(fā)現(xiàn)是不可避免的,就必須采用保護性編程。

如果這種保護在測試階段對我們有幫助,則肯定要在程序操作使用時繼續(xù)將其包括在內(nèi)。

如果承認錯誤會出現(xiàn)這一事實,則比起因出現(xiàn)錯誤所帶來的責(zé)難來說,增加一些工作量是有意義的。

另一方面,基于運行時間、存儲空間和編程費用等方面的反對意見:僅當(dāng)保護性編程要求設(shè)計增加的資源量相當(dāng)大時需慎重考慮。事實上,只有在極少數(shù)情況下,保護性編程所要求增加的資源量才會相當(dāng)大,以致不得不放棄考慮這種技術(shù)。

Yourdon曾提出過一個建設(shè)性意見:

在設(shè)計過程的早期就把保護性編程包括進去。在設(shè)計過程中,大多數(shù)設(shè)計在填充可用存儲空間時,其規(guī)模都增加的很快,如果企圖在設(shè)計過程的結(jié)尾再引入保護性編程,則肯定已沒有剩余空間。而且在近乎完成的設(shè)計中,移動任何部分擠出空間的任何做法,都會招致強烈的反對。但如果在一開始就把保護性編程包括進來,在希望增加新的保護性特征時,就能容易的避開設(shè)計中的討價還價。

另一個要考慮的重要事項是檢查哪些項目?盡管可以不受冗余編程概念的約束并檢查不合理的情況,如果企圖檢查所有項目,實質(zhì)上是實現(xiàn)冗余編程。關(guān)于這個問題,Shooman建議設(shè)計人員先準(zhǔn)備以下列表,以利于做出正確的判斷。

(1)可能需要檢查的項目表,應(yīng)附有對編程時間、運行時間及存儲要求的開銷估計。

(2)各種類型錯誤出現(xiàn)的期望數(shù)據(jù)表,應(yīng)標(biāo)出每種類型錯誤可能造成的后果。研究這些信息有助于設(shè)計者確定應(yīng)進行的檢查。保護性編程中的典型檢查項目(1)來自外部設(shè)備的輸入數(shù)據(jù)(范圍、屬性)。(2)由其他程序提供的數(shù)據(jù)。(3)數(shù)據(jù)庫(數(shù)組、文件、結(jié)構(gòu)、記錄)。(4)操作員的輸入(性質(zhì)、順序)。(5)棧的深度。(6)DOCASEI中的I范圍(并計算GOTO)。

(7)數(shù)組界限。(8)表達式中出現(xiàn)零分母的可能性。(9)所期望的程序版本是否在運行(最后系統(tǒng)重新組合的日期)。(10)通過其他程序或外部設(shè)備的輸出。

以上討論的所有保護技術(shù)都是被動式保護技術(shù),因為必須等到某個輸入之后才能開始檢查。而主動式保護技術(shù)則既可在處理輸入信息期間使用,也可在系統(tǒng)空閑或等待下一次輸入時使用。

幾種應(yīng)用主動式保護技術(shù)的例子。

(1)存儲器范圍檢查如果只在存儲器的某些塊中存放了某種類型和范圍的數(shù)據(jù),則可經(jīng)常檢查這些條件。

(2)標(biāo)志驗證如果采用標(biāo)志來指示系統(tǒng)的狀態(tài),則可經(jīng)常對它們作獨立的檢查。

(3)逆翻譯有時必須將數(shù)據(jù)或變量值從一種代碼或系統(tǒng)翻譯為另一種代碼或系統(tǒng),可以利用反變換來檢查原始值的翻譯是否正確。(4)狀態(tài)驗證在多數(shù)情況下,復(fù)雜系統(tǒng)由多個操作狀態(tài),它們可以采用某些特定的存儲值來表示。如果能夠獨立的驗證這些狀態(tài),就可以進行檢查。

(5)連接檢查使用鏈表結(jié)構(gòu)時,可以對其連接

溫馨提示

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

最新文檔

評論

0/150

提交評論