軟件工程導(dǎo)論(6)程序編碼_第1頁
軟件工程導(dǎo)論(6)程序編碼_第2頁
軟件工程導(dǎo)論(6)程序編碼_第3頁
軟件工程導(dǎo)論(6)程序編碼_第4頁
軟件工程導(dǎo)論(6)程序編碼_第5頁
已閱讀5頁,還剩239頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

軟件工程導(dǎo)論(6)

——程序編碼南京理工大學(xué)汪惠芬2004年9月30日第六章程序編碼前面介紹的軟件工程步驟都是為了邁向一個(gè)最終的目標(biāo):將“軟件表示”變換成計(jì)算機(jī)能夠“理解”的形式。作為軟件工程的一個(gè)階段,程序編碼是設(shè)計(jì)的繼續(xù)。然而,在編碼中遇到的問題,如程序設(shè)計(jì)語言的特性和程序設(shè)計(jì)風(fēng)格會(huì)深刻影響軟件的質(zhì)量和可維護(hù)性。本章將從軟件工程這個(gè)更廣泛的范圍討論與程序設(shè)計(jì)語言及程序編碼有關(guān)的問題,而不具體介紹如何編寫程序。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/20232.第六章程序編碼6.1程序設(shè)計(jì)語言6.2對(duì)源程序的質(zhì)量要求6.3程序復(fù)雜度度量6.4程序設(shè)計(jì)風(fēng)格6.5結(jié)構(gòu)化程序設(shè)計(jì)6.6面向?qū)ο蠹夹g(shù)6.7本章小結(jié)設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/20233.6.1程序設(shè)計(jì)語言程序設(shè)計(jì)語言是人與計(jì)算機(jī)通信的基本工具。使用程序設(shè)計(jì)語言編寫程序時(shí)一項(xiàng)人類特定的智力活動(dòng)。因此,程序設(shè)計(jì)語言的特點(diǎn)當(dāng)然會(huì)影響人的思維和解決問題的方式,影響程序的可讀性和可理解性。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/20234.6.1程序設(shè)計(jì)語言6.1.1程序設(shè)計(jì)語言分類6.1.2程序設(shè)計(jì)語言的特征屬性6.1.3選擇程序設(shè)計(jì)語言準(zhǔn)則設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/20235.6.1.1程序設(shè)計(jì)語言分類設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化程序設(shè)計(jì)語言低級(jí)語言(面向機(jī)器)機(jī)器指令系統(tǒng)匯編語言高級(jí)語言從應(yīng)用角度分傳統(tǒng)高級(jí)語言(面向過程)經(jīng)典程序設(shè)計(jì)語言通用結(jié)構(gòu)化語言專用語言超高級(jí)語言(第四代語言)查詢語言應(yīng)用程序生成器原型語言圖形語言從語言實(shí)現(xiàn)角度分系統(tǒng)實(shí)現(xiàn)語言靜態(tài)語言塊結(jié)構(gòu)語言動(dòng)態(tài)語言4/20/20236.6.1.1程序設(shè)計(jì)語言分類設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化低級(jí)語言:面向機(jī)器的語言機(jī)器指令語言:由二進(jìn)制代碼表示,直接面向機(jī)器,與具體處理結(jié)構(gòu)密切相關(guān),高度專業(yè)化,編程效率極低。匯編語言:為解決機(jī)器語言編程效率低的問題而設(shè)計(jì),也直接面向機(jī)器,與具體處理結(jié)構(gòu)密切相關(guān),對(duì)應(yīng)唯一的指令系統(tǒng)。但由于采用的符號(hào)系統(tǒng)由英語短語或縮寫演變而來,并提供符號(hào)地址處理和宏功能,減少了程序員的工作量,降低了出錯(cuò)率。4/20/20237.6.1.1程序設(shè)計(jì)語言分類設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化傳統(tǒng)的高級(jí)語言:經(jīng)典程序設(shè)計(jì)語言:FORTRAN(FORmulaTRANslation)、ALGOL語言、COBOL(CommonBusinessOrientedLanguage)語言、BASIC(Beginner’aAll-purposeSymbolicInstructionCode)語言。通用結(jié)構(gòu)化語言:PL/1(ProgrammingLanguageOne)、PASCAL語言、ADA語言、C語言。專用語言:APL語言、FORTH語言、LISP語言、PROLOG語言、JAVA。4/20/20238.6.1.1程序設(shè)計(jì)語言分類設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化超高級(jí)語言:第四代語言查詢語言:SQL語言。應(yīng)用程序生成器原型語言圖形語言4/20/20239.6.1.1程序設(shè)計(jì)語言分類設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化高級(jí)語言:從語言實(shí)現(xiàn)角度劃分系統(tǒng)實(shí)現(xiàn)語言:C靜態(tài)語言:COBOL、FORTRAN塊結(jié)構(gòu)語言:PASCAL、C動(dòng)態(tài)語言:LISP、PROLOG、LOG4/20/202310.6.1.2程序設(shè)計(jì)語言的特征屬性程序?qū)ο蟮拿终f明:程序?qū)ο蟀ǔ绦蛑谐霈F(xiàn)的變量、常量、類型、過程、函數(shù)等。特別是變量、常量說明。預(yù)先說明程序?qū)ο竺值暮锰幨菫榫幾g提供了檢查源程序中名字引用的合法性。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202311.6.1.2程序設(shè)計(jì)語言的特征屬性類型說明:類型說明與名字說明密切相關(guān),不僅是一種提高程序安全性的措施,更重要的是提高了實(shí)現(xiàn)抽象數(shù)據(jù)類型的機(jī)制,是程序員無需過多關(guān)心抽象數(shù)據(jù)類型的物理存儲(chǔ)實(shí)現(xiàn)機(jī)制。通常類型說明包括兩方面:基本類型說明構(gòu)造類型說明設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202312.6.1.2程序設(shè)計(jì)語言的特征屬性變量初始化:在程序中一個(gè)變量引用前是否要求初始化以及如何初始化是一個(gè)重要問題。如:BASIC:數(shù)值變量缺省初始化為0FORTRAN:內(nèi)存變量缺省初始化為.F.C:自動(dòng)變量初始化的值不定,靜態(tài)變量缺省初始化為0,并可在變量說明時(shí)進(jìn)行顯示初始化設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202313.6.1.2程序設(shè)計(jì)語言的特征屬性程序?qū)ο蟮木植啃裕焊鶕?jù)局部化與信息隱蔽原理,一個(gè)程序?qū)ο笾荒茉诔绦蛑姓嬲枰哪切┎糠植拍茉L問。FORTRAN、C提供的是單層局部性,而PASCAL提供的是所層局部性。單層局部性有助于塊獨(dú)立編譯的實(shí)現(xiàn),多層局部性有助于提高程序的可讀性,但內(nèi)外層對(duì)象同名有可能引起差錯(cuò)。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202314.6.1.2程序設(shè)計(jì)語言的特征屬性程序模塊:程序模塊的塊結(jié)構(gòu)提供了控制程序?qū)ο竺挚梢娦缘氖侄?,主要表現(xiàn)為內(nèi)層程序塊中說明的名字外層不可訪問。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202315.6.1.2程序設(shè)計(jì)語言的特征屬性循環(huán)控制結(jié)構(gòu):常見的有FOR結(jié)構(gòu)、WHILE結(jié)構(gòu)、UNTIL結(jié)構(gòu),問題是應(yīng)用中常要求在循環(huán)體內(nèi)測試條件以決定是否退出循環(huán)或終止本次循環(huán)。如果使用IF…THEN…ELSE語句和附加布爾變量實(shí)現(xiàn),則將增加程序復(fù)雜性與程序長度,許多語言提供了EXITLOOP語句實(shí)現(xiàn)循環(huán)體內(nèi)的非正常退出。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202316.6.1.2程序設(shè)計(jì)語言的特征屬性分支結(jié)構(gòu):多選擇結(jié)構(gòu)可能出現(xiàn)以下問題:(1)CASE表達(dá)式值不在預(yù)先指定的范圍內(nèi)(2)當(dāng)一個(gè)CASE執(zhí)行完畢控制時(shí)自動(dòng)退出多重選擇還是順序執(zhí)行下一個(gè)CASE?設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202317.6.1.2程序設(shè)計(jì)語言的特征屬性二義性問題:語言的結(jié)構(gòu)是否是程序員產(chǎn)生誤解,是一個(gè)重要特征。如:X=a/b*c可以理解成:x=(a/b)*c或者x=a/(b*c)設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202318.6.1.2程序設(shè)計(jì)語言的特征屬性異常處理:大多數(shù)語言缺乏測試和響應(yīng)出錯(cuò)等異常處理的機(jī)制,程序員只能使用普通條件控制結(jié)構(gòu)顯示地測試異常,但當(dāng)程序中包含一系列子程序嵌套時(shí),不能有效地將一個(gè)異常信息傳送到指定的處理程序中。PL/1、ADA、FOXPRO等語言提供了異常處理機(jī)制。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202319.6.1.2程序設(shè)計(jì)語言的特征屬性獨(dú)立編譯:語言提供程序塊的獨(dú)立編譯意味著一個(gè)大型系統(tǒng)可以由多個(gè)程序員并行開發(fā),單獨(dú)調(diào)試,在維護(hù)過程中如果修改某一模塊無需對(duì)整個(gè)系統(tǒng)重新編譯,然后重新連接即可。在軟件工程中廣泛使用C和FORTRAN的一個(gè)重要原因就是其獨(dú)立編譯性。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202320.6.1.3選擇程序設(shè)計(jì)語言準(zhǔn)則一般情況下,高級(jí)語言比匯編語言容易實(shí)現(xiàn),源程序的可讀性好,容易測試、維護(hù),但是在許多特定的場合匯編語言是唯一的選擇,如:對(duì)程序執(zhí)行的時(shí)間、空間限制十分嚴(yán)格,體系結(jié)構(gòu)特殊,執(zhí)行時(shí)間非常關(guān)鍵的部分代碼。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202321.6.1.3選擇程序設(shè)計(jì)語言準(zhǔn)則高級(jí)語言的選擇標(biāo)準(zhǔn):應(yīng)該具有模塊化機(jī)制可讀性好控制結(jié)構(gòu)滿足結(jié)構(gòu)化要求數(shù)據(jù)類型豐富編譯效率高且查錯(cuò)能力強(qiáng)具有獨(dú)立編譯機(jī)制設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202322.6.1.3選擇程序設(shè)計(jì)語言準(zhǔn)則實(shí)現(xiàn)環(huán)境的限制:用戶要求可以得到的語言系統(tǒng)可以得到的軟件工具工程規(guī)模程序員的知識(shí)與經(jīng)驗(yàn)可移植性要求應(yīng)用領(lǐng)域設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202323.概述:為了保證程序編碼的質(zhì)量,程序員必須深刻地理解、熟練地掌握并正確地運(yùn)用程序設(shè)計(jì)語言的特性,例如一些語法規(guī)則和語義的細(xì)節(jié)。只有語法上沒有錯(cuò)誤的程序才能通過編譯系統(tǒng)的語法檢查。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化6.2對(duì)源程序的質(zhì)量要求4/20/202324.內(nèi)容:軟件工程項(xiàng)目對(duì)代碼編寫的要求,不僅僅是源程序語法上的正確性,也不只是源程序中沒有各種錯(cuò)誤,此外,還要求源程序具有良好的結(jié)構(gòu)性和良好的程序設(shè)計(jì)風(fēng)格。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化6.2對(duì)源程序的質(zhì)量要求4/20/202325.目的:源程序除了送入計(jì)算機(jī)運(yùn)行外,還必須讓人能夠容易讀懂;源程序便于測試和排除所發(fā)現(xiàn)的程序故障,使軟件具有較高的可靠性;在軟件使用過程中,源程序能夠根據(jù)用戶的需要很容易擴(kuò)充其功能及改善其性能,使軟件具有較好的可維護(hù)性。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化6.2對(duì)源程序的質(zhì)量要求4/20/202326.6.3程序復(fù)雜度度量程序復(fù)雜性是指模塊內(nèi)程序的復(fù)雜性。它直接關(guān)系到軟件開發(fā)費(fèi)用的多少、開發(fā)周期的長短和軟件內(nèi)部潛伏錯(cuò)誤的多少,同時(shí)它也是軟件可理解性的另一種度量。減少程序復(fù)雜性,可以提高軟件的簡單性和可理解性,并使軟件開發(fā)費(fèi)用減少,開發(fā)周期縮短,軟件內(nèi)部潛藏錯(cuò)誤減少。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202327.6.3程序復(fù)雜度度量為了度量程序復(fù)雜性,要求復(fù)雜性度量滿足以下假設(shè):它可以用來計(jì)算任何一個(gè)程序的復(fù)雜性對(duì)于不合理的程序,不應(yīng)當(dāng)用它進(jìn)行復(fù)雜性計(jì)算如果程序中指令條數(shù)、附加存儲(chǔ)量、計(jì)算時(shí)間增多,不會(huì)減少程序的復(fù)雜性設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202328.6.3程序復(fù)雜度度量6.3.1代碼行度量法6.3.2McCabe度量法6.3.3Halstead的軟件科學(xué)設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202329.6.3.1代碼行度量法概念:代碼行度量法是統(tǒng)計(jì)一個(gè)程序模塊的源代碼行數(shù),并以源代碼行數(shù)作為程序復(fù)雜性的度量。設(shè)每行代碼的出錯(cuò)率為每100行原程序中可能有的錯(cuò)誤數(shù)目。例如,每行代碼出錯(cuò)率為1%,則是指每100行源程序中可能有一個(gè)錯(cuò)誤。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202330.6.3.1代碼行度量法對(duì)于少于100個(gè)語句的小程序,源代碼行數(shù)與出錯(cuò)率是線性相關(guān)的。隨著程序的增大,出錯(cuò)率以非線性方式增長。因此,代碼行度量法只是一個(gè)簡單的,估計(jì)得很粗糙的方法。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202331.6.3.2McCabe度量法概念:McCabe度量法是一種基于程序控制流的復(fù)雜性度量方法。、McCabe定義的程序復(fù)雜性度量值又稱環(huán)路復(fù)雜度,它基于一個(gè)程序模塊的程序圖中環(huán)路的個(gè)數(shù),因此計(jì)算它先要畫出程序圖。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202332.6.3.2McCabe度量法程序圖:程序圖是退化的程序流程圖。把程序流程圖中每個(gè)處理符號(hào)都退化成一個(gè)結(jié)點(diǎn),原來聯(lián)接不同處理符號(hào)的流線變成聯(lián)接不同結(jié)點(diǎn)的有向弧,這樣得到的有向圖叫作程序圖。程序圖僅描述程序內(nèi)的控制流程,完全不表現(xiàn)對(duì)數(shù)據(jù)的具體操作,以及分支和循環(huán)的具體條件。因此,它往往把一個(gè)簡單的IF語句與循環(huán)語句的復(fù)雜性看成是一樣的,把嵌套的IF語句與CASE語句的復(fù)雜性看成是一樣的。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202333.6.3.2McCabe度量法計(jì)算環(huán)路復(fù)雜性的方法:根據(jù)圖論,在一個(gè)強(qiáng)連通的有向圖G中,環(huán)的個(gè)數(shù)由以下公式給出:V(G)=m-n+p其中,V(G)是有向圖G中環(huán)路數(shù),m是圖G中弧數(shù),n是圖G中結(jié)點(diǎn)數(shù),p是圖G中的強(qiáng)連通分量個(gè)數(shù)。對(duì)于復(fù)合判定,如(A=0)and(C=D)or(X=‘A’)計(jì)作3個(gè)判定。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202334.6.3.2McCabe度量法在一個(gè)程序中,從程序的入口點(diǎn)總能到達(dá)圖中任何一個(gè)結(jié)點(diǎn),因此,程序總是連通的,但不是強(qiáng)連通的。為了使圖成為強(qiáng)連通圖,從圖的入口點(diǎn)到出口點(diǎn)加一條用虛線表示的有向邊,使圖成為強(qiáng)連通圖。這樣可以使用上式計(jì)算環(huán)路復(fù)雜性。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202335.6.3.2McCabe度量法示例:設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化n=11,m=13,p=1

V(G)=13-11+1=3A開始BC輸入DEFGH輸入K輸入L結(jié)束JABCDEFGHKLJ4/20/202336.6.3.2McCabe度量法假定模塊是單入口單出口的程序,整個(gè)模塊中只有一個(gè)程序,這時(shí)p=1。因此可以簡化公式,不加從出口到入口的那條虛線而當(dāng)作無向圖:V(G)=m-n+2設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202337.6.3.2McCabe度量法當(dāng)分支或循環(huán)的數(shù)目增加時(shí),程序中的環(huán)路也隨之增加,因此,McCabe環(huán)路復(fù)雜度度量值實(shí)際上是為軟件測試的難易程度提供了一個(gè)定量度量的方法,同時(shí)也間接地表示了軟件的可靠性。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202338.6.3.2McCabe度量法幾點(diǎn)說明:(1)環(huán)路復(fù)雜度取決于程序控制結(jié)構(gòu)的復(fù)雜度;(2)環(huán)路復(fù)雜度是可加的;(3)McCabe建議,對(duì)于復(fù)雜度超過10的程序,應(yīng)分成幾個(gè)小程序,以減少程序中的錯(cuò)誤。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202339.6.3.2McCabe度量法缺點(diǎn):對(duì)于不同種類的控制流的復(fù)雜性不能區(qū)分;簡單IF語句與循環(huán)語句的復(fù)雜性同等看待;嵌套IF語句與簡單CASE語句的復(fù)雜性是一樣的;模塊間接口當(dāng)成一個(gè)簡單分支處理;一個(gè)具有1000行的順序程序與一行語句的復(fù)雜性相同。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202340.6.3.3Halstead的軟件科學(xué)概述:Halstead軟件科學(xué)確定了計(jì)算機(jī)軟件開發(fā)中的一些定量規(guī)律,它采用的一組基本度量值通常是在程序產(chǎn)生之后得出,或者在程序設(shè)計(jì)完成之后估算出。Halstead度量是目前最好的度量方法。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202341.6.3.3Halstead的軟件科學(xué)程序長度(預(yù)測的Halstead長度):H=n1×log2n1+n2×log2n2其中,n1表示程序中不同運(yùn)算符(包括保留字)的個(gè)數(shù),n2表示程序中不同運(yùn)算對(duì)象的個(gè)數(shù)。運(yùn)算符包括:算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、賦值符(=或:=)、數(shù)組操作符、分界符(,或;或:)、子程序調(diào)用符、括號(hào)運(yùn)算符、循環(huán)操作符等。成對(duì)的運(yùn)算符,例如“BEGIN…END”、“FOR…TO”、“REPEAT…UNTIL”、“WHILE…DO”、“IF…THEN…ELSE”、“(…)”等都當(dāng)作單一運(yùn)算符。運(yùn)算對(duì)象包括變量名和常數(shù)。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202342.6.3.3Halstead的軟件科學(xué)實(shí)際的Halstead長度:N=N1+N2其中,N1為程序中實(shí)際出現(xiàn)的運(yùn)算符總個(gè)數(shù),N2為程序中實(shí)際出現(xiàn)的運(yùn)算對(duì)象總個(gè)數(shù)。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202343.6.3.3Halstead的軟件科學(xué)程序的詞匯表:Halstead定義程序的詞匯表為不同的運(yùn)算符種類數(shù)和不同的運(yùn)算對(duì)象種類數(shù)的總和。若令n為程序的詞匯表,則:n=n1+n2設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202344.6.3.3Halstead的軟件科學(xué)程序量:V=N×log2(n1+n2)程序量表明了程序在“詞匯上的復(fù)雜性”。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202345.6.3.3Halstead的軟件科學(xué)程序員工作量:E=V/L或E=H×log2(n1+n2)×[(n1×N2)/(2×n2)]設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202346.6.3.3Halstead的軟件科學(xué)程序的潛在錯(cuò)誤:Halstead度量可以用來預(yù)測程序中的錯(cuò)誤。認(rèn)為程序中可能存在的差錯(cuò)應(yīng)與程序的容量成正比。因此程序的錯(cuò)誤數(shù)預(yù)測公式為:B=(N1+N2)×log2(n1+n2)/1300設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202347.6.3.3Halstead的軟件科學(xué)實(shí)例:設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化SUBROUTINESORT(X,N)DIMENSIONX(N)IF(N.LT.2)THENDO20I=2,NDO10J=1,IIF(X(I).GE.X(J))GOTO10SAVE=X(I)X(I)=X(J)X(J)=SAVE10CONTINUE20CONTINUERETURNEND運(yùn)算符計(jì)數(shù)運(yùn)算對(duì)象計(jì)數(shù)可執(zhí)行語句結(jié)束數(shù)組下標(biāo)=IF()DO,程序結(jié)束.LT..GT.GOTO107652221111XIJN2SAVE16542221n1=10N1=28n2=7N2=224/20/202348.6.3.3Halstead的軟件科學(xué)實(shí)例:H=10×log210+7×log27=52.87N=28+22=50n=10+7=17V=50×log2(10+7)=204E=52.87×log2(10+7)×((10×22)/(2×7))=3389.722B=(28+22)×log2(10+7)/1300=0.068設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202349.6.3.3Halstead的軟件科學(xué)Halstead的重要結(jié)論之一:程序的實(shí)際Halstead長度N可以由詞匯表n算出。即使程序還未編制完成,也能預(yù)先算出程序的實(shí)際Halstead長度N,雖然它沒有明確指出程序中到底有多少個(gè)語句。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202350.6.3.3Halstead的軟件科學(xué)Halstead度量的缺點(diǎn):(1)沒有區(qū)別自己編的程序與別人編的程序;(2)沒有考慮非執(zhí)行語句;(3)在允許混合運(yùn)算的語言中,每中運(yùn)算符必須與它的運(yùn)算對(duì)象相關(guān)。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202351.6.4程序設(shè)計(jì)風(fēng)格程序?qū)嶋H上也是一種供人閱讀的文章,因此,程序員應(yīng)當(dāng)在編寫程序時(shí)多花些工夫,講求程序的風(fēng)格,這將大量地減少人們閱讀程序的時(shí)間,從整體上看效率是高的。本節(jié)將從程序設(shè)計(jì)風(fēng)格的四個(gè)方面進(jìn)行概要的討論,力圖從編碼原則的角度探討提高程序的可讀性,改善程序質(zhì)量的方法和途徑。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202352.6.4程序設(shè)計(jì)風(fēng)格6.4.1源程序文檔化6.4.2數(shù)據(jù)說明6.4.3語句結(jié)構(gòu)6.4.4輸入和輸出(I/O)設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202353.6.4.1源程序文檔化符號(hào)名的命名:符號(hào)名即標(biāo)識(shí)符,包括模塊名、變量名、常量名、子程序名以及數(shù)據(jù)區(qū)名、緩沖區(qū)名等,這些名字應(yīng)能反映它所代表的實(shí)際東西,應(yīng)有一定的實(shí)際意義,使其能夠見名知意,有助于對(duì)程序功能的理解。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202354.6.4.1源程序文檔化符號(hào)名的命名:名字不是越長越好,過長的名字會(huì)增加工作量,給程序員或操作員造成不穩(wěn)定的情緒,會(huì)使程序的邏輯流程變得模糊,給修改帶來困難。所以應(yīng)選擇精煉的、意義明確的名字,才能簡化程序語句,改善對(duì)程序功能的理解。在使用縮寫名字時(shí),縮寫規(guī)則要一致,并且要給每一個(gè)名字加注釋,同時(shí),在一個(gè)程序中,一個(gè)變量只應(yīng)用于一種用途。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202355.6.4.1源程序文檔化程序的注釋:夾在程序中的注釋是程序員與日后的程序讀者之間通信的重要手段。正確的注釋能夠幫助讀者理解程序,可為后續(xù)階段進(jìn)行測試和維護(hù)提供明確的指導(dǎo),因此,注釋行是必不可少的。大多數(shù)程序設(shè)計(jì)語言允許使用自然語言寫注釋,這給閱讀程序帶來很大的方便,一些正規(guī)的程序文本中,注釋行的數(shù)量占到整個(gè)源程序的1/3到1/2之多。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202356.6.4.1源程序文檔化注釋的分類:(1)序言性注釋(2)功能性注釋設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化程序標(biāo)題主要算法接口說明有關(guān)數(shù)據(jù)描述模塊位置開發(fā)簡歷有關(guān)本模塊功能和目的的說明用于描述一段程序,而不是每一個(gè)語句用縮進(jìn)和空行,使程序與注釋容易區(qū)別注釋要正確4/20/202357.6.4.1源程序文檔化視覺組織——空格、空行和移行:一個(gè)程序如果寫得密密麻麻,分不出層次常常是很難看懂的。一個(gè)優(yōu)秀的程序員在利用空格、空行和移行的技巧上顯示了他們的經(jīng)驗(yàn)。恰當(dāng)?shù)乩每崭?,可以突出運(yùn)算的優(yōu)先性,避免發(fā)生運(yùn)算的錯(cuò)誤。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化例如:(A<-17)ANDNOT(B<=49)ORC(A<-17)ANDNOT(B<=49)ORC4/20/202358.6.4.2數(shù)據(jù)說明注意點(diǎn):(1)數(shù)據(jù)說明的次序應(yīng)當(dāng)規(guī)范化,使數(shù)據(jù)屬性容易查找,也有利于測試、排錯(cuò)和維護(hù);(2)當(dāng)多個(gè)變量名用一個(gè)語句說明時(shí),應(yīng)當(dāng)對(duì)這些變量按字母的順序排列;(3)如果設(shè)計(jì)了一個(gè)復(fù)雜的數(shù)據(jù)結(jié)構(gòu),應(yīng)當(dāng)使用注釋行說明在程序?qū)崿F(xiàn)時(shí)這個(gè)數(shù)據(jù)結(jié)構(gòu)的固有特點(diǎn)。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202359.6.4.3語句結(jié)構(gòu)要求:(1)在一行內(nèi)只寫一條語句,并且采取適當(dāng)?shù)囊菩懈袷剑钩绦虻倪壿嫼凸δ茏兊酶用鞔_。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(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;ENDENDFORI:=1toN-1DOBEGINT:=I;Forj:=I+1toNDOIFA[j]<A[T]THENT:=j;IFT<>ITHENBEGINWORK:=A[T];A[T]:=A[I];A[I]:=Work;ENDEND4/20/202360.6.4.3語句結(jié)構(gòu)要求:(2)程序編寫首先應(yīng)當(dāng)考慮清晰性,不要刻意追求技巧性,使程序編寫得過于緊湊。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化A[I]:=A[I]+A[T];A[T]:=A[I]-A[T];A[I]:=A[I]-A[T];WORK:=A[T];A[T]:=A[I];A[I]:=Work;4/20/202361.6.4.3語句結(jié)構(gòu)要求:(3)程序編寫的要簡單,寫清楚,直截了當(dāng)?shù)卣f明程序員的用意。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化

DO5I=1,NDO5J=1,N5V(I,J)=(I/J)*(J/I)V=

DO5I=1,NDO5J=1,NIF(I.EQ.J)THENV(I,J)=1.0ELSEV(I,J)=0.0ENDIF5CONTINUE.

.

.4/20/202362.6.4.3語句結(jié)構(gòu)要求:(4)除非對(duì)效率有特殊的要求,程序編寫要做到清晰第一,效率第二,不要為了追求高效率而喪失了清晰性。(5)首先要保證程序正確,然后才要求提高速度。(6)讓編譯程序作簡單的優(yōu)化。(7)盡可能使用庫函數(shù)。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202363.6.4.3語句結(jié)構(gòu)要求:(8)避免使用臨時(shí)變量而使得可讀性下降。(9)盡量用公用過程或子程序去代替重復(fù)的功能代碼段,但這段代碼應(yīng)具有一個(gè)獨(dú)立的功能。(10)使用括號(hào)清晰地表達(dá)算術(shù)表達(dá)式和邏輯表達(dá)式的運(yùn)算順序。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202364.6.4.3語句結(jié)構(gòu)要求:(11)避免不必要的轉(zhuǎn)移,避免使用GOTO語句。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化IF(X.LT.Y)GOTO30IF(Y.LT.Z)GOTO50SMALL=ZGOTO7030IF(X.LT.Z)GOTO60SMALL=ZGOTO7050SMALL=YGOTO7060SMALL=X70CONTINUE實(shí)際上是求X、Y、Z中的最小者,程序只需編成:SMALL=XIF(Y.LT.SMALL)THENSMALL=YIF(Z.LT.SMALL)THENSMALL=Z因此,程序應(yīng)當(dāng)簡單,不必過于深?yuàn)W,避免使用GOTO語句繞來繞去。4/20/202365.6.4.3語句結(jié)構(gòu)要求:(12)用邏輯表達(dá)式代替分支嵌套。(13)避免使用空的ELSE語句和IF…THENIF…的語句,以免出現(xiàn)二義性。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化IF(CHAR.GE.’0’)THENIF(CHAR.LE.’9’)THENIF(CHAR.GE.’0’).AND.(CHAR.LE.’9’)THENIF(CHAR>=‘A’)THENIF(CHAR<=‘z’)THENPRINT“Thisisaletter”ELSEPRINT“Thisisnotaletter”4/20/202366.6.4.3語句結(jié)構(gòu)要求:(14)避免使用ELSEGOTO和ELSERETURN結(jié)構(gòu)。(15)使與判定相聯(lián)系的動(dòng)作盡可能地緊跟著判定。(16)避免使用過于復(fù)雜的條件測試。(17)盡量減少使用“否定”條件的條件矩,不要讓讀者繞彎子想。如:IFNOT((CHAR<‘0’)OR(CHAR>’9’)THENIF(CHAR>=‘0’)AND(CHAR<=‘9’)THEN設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202367.6.4.3語句結(jié)構(gòu)要求:(18)避免過多的循環(huán)嵌套和條件嵌套。(19)不要使GOTO語句相互交叉。否則在程序中會(huì)引起混亂,幾處交叉積累起來,會(huì)使程序十分難讀。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化MAXVAL=A(I)DO40I=1,10IF(A(I).GT.MAXVAL)GOTO30GOTO4030MAXVAL=A(I)40CONTINUE

MAXVAL=A(I)DO40I=2,10IF(A(I).GT.MAXVAL)THENMAXVAL=A(I)40CONTINUE4/20/202368.6.4.3語句結(jié)構(gòu)要求:(20)對(duì)遞歸定義的數(shù)據(jù)結(jié)構(gòu)盡量使用遞歸過程。(21)經(jīng)常站在讀者的角度自躬反?。骸叭绻也皇蔷幋a的人,我能看懂它嗎?”考慮程序的可理解性達(dá)到什么程度。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202369.6.4.4輸入和輸出(I/O)概述:輸入和輸出信息是與用戶的使用直接相關(guān)的。輸入和輸出的方式和格式應(yīng)當(dāng)盡可能方便用戶的使用。一定要避免因設(shè)計(jì)不當(dāng)給用戶帶來的麻煩。因此,在軟件需求分析和設(shè)計(jì)階段,應(yīng)基本確定輸入和輸出的風(fēng)格。系統(tǒng)能否被用戶接受,有時(shí)取決于輸入和輸出的風(fēng)格。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202370.6.4.4輸入和輸出(I/O)設(shè)計(jì)和編碼時(shí)應(yīng)考慮的原則:(1)對(duì)所有的輸入數(shù)據(jù)都進(jìn)行檢驗(yàn),從而識(shí)別錯(cuò)誤的輸入,以保證每個(gè)數(shù)據(jù)的有效性;(2)檢查輸入項(xiàng)的各種重要組合的合理性,必要時(shí)報(bào)告輸入狀態(tài)信息;(3)使得輸入的步驟和操作盡可能簡單,并保持簡單的輸入格式;設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202371.6.4.4輸入和輸出(I/O)設(shè)計(jì)和編碼時(shí)應(yīng)考慮的原則:(4)輸入數(shù)據(jù)時(shí),應(yīng)允許使用自由格式輸入;(5)應(yīng)允許缺省值;(6)輸入一批數(shù)據(jù)時(shí),最好使用輸入結(jié)束標(biāo)志,而不是由用戶指定輸入數(shù)據(jù)數(shù)目;設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202372.6.4.4輸入和輸出(I/O)設(shè)計(jì)和編碼時(shí)應(yīng)考慮的原則:(7)在以交互式輸入/輸出方式進(jìn)行輸入時(shí),要在屏幕上使用提示交互輸入的請(qǐng)求,指明可使用選擇項(xiàng)的種類和取值范圍;(8)當(dāng)程序設(shè)計(jì)語言對(duì)輸入/輸出格式有嚴(yán)格要求時(shí),應(yīng)保持輸入格式與輸入語句的要求的一致性;(9)給所有的輸出加注解,并設(shè)計(jì)輸出報(bào)表格式。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202373.6.4.4輸入和輸出(I/O)輸入/輸出風(fēng)格還受到許多其它因素的影響,如輸入/輸出設(shè)備、用戶的熟練程度以及通信環(huán)境等??傊?,要從程序編碼的實(shí)踐中,積累編制程序的經(jīng)驗(yàn),培養(yǎng)和學(xué)習(xí)良好的程序設(shè)計(jì)風(fēng)格,使編寫出來的程序清晰易懂,易于測試和維護(hù)。在程序編碼階段改善和提高軟件的質(zhì)量。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202374.6.5結(jié)構(gòu)化程序設(shè)計(jì)6.5.1關(guān)于GOTO語句的爭論6.5.2結(jié)構(gòu)化程序設(shè)計(jì)的原則6.5.3程序設(shè)計(jì)方法設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202375.6.5.1關(guān)于GOTO語句的爭論1963年P(guān)eterNaur指出大量地、無節(jié)制地使用GOTO語句,會(huì)使程序結(jié)構(gòu)變得非常混亂。但未得到人們重視。1965年E.W.Dijkstra指出,應(yīng)當(dāng)把GOTO語句從高級(jí)語言中取消,程序的質(zhì)量與程序中包含GOTO語句的數(shù)量成反比。當(dāng)是新開發(fā)的幾種語言都取消了GOTO語句,如LISP、ISWIM、BLISS等。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202376.6.5.1關(guān)于GOTO語句的爭論設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化1966年Bohn與Jacopini證明了任何單入淡出的沒有“死循環(huán)”程序都能有三種最基本的控制結(jié)構(gòu)編寫程序,即“順序結(jié)構(gòu)”、“選擇結(jié)構(gòu)”、“重復(fù)結(jié)構(gòu)”。1968年Dijikstra在一次建議從一切高級(jí)語言中取消GOTO語句,只使用三種基本控制結(jié)構(gòu)編寫程序。他的建議引起了激烈的爭論,爭論集中在如何看待GOTO語句上。4/20/202377.6.5.1關(guān)于GOTO語句的爭論爭論:贊成取消的認(rèn)為:GOTO語句對(duì)程序清晰性有很大的破壞作用,只用GOTO語句多的程序很難讓人理解,增加了查錯(cuò)和維護(hù)的困難,降低了程序的可維護(hù)性。反對(duì)取消的認(rèn)為:由于GOTO語句概念簡單,使用方便,在某些情況下,保留GOTO語句反而能使寫出的程序更加簡潔,并且GOTO語句可直接得到硬件指令的支持,因此不應(yīng)完全禁止GOTO語句的使用。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202378.6.5.1關(guān)于GOTO語句的爭論設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化結(jié)論:20世紀(jì)70年代初N.Wirth在設(shè)計(jì)PASCAL語言時(shí)對(duì)GOTO語句的處理可被看作對(duì)GOTO語句爭論的結(jié)論。在PASCAL語言中設(shè)置了三種基本控制結(jié)構(gòu)的語句;另一方面,GOTO語句仍然保留在該語言中。在一般情況下,可以完全不使用GOTO語句,如果在特殊情況下,由于特定的要求,偶然使用GOTO語句能解決問題,那也未嘗不可,只是不應(yīng)大量使用罷了。4/20/202379.6.5.2結(jié)構(gòu)化程序設(shè)計(jì)的原則概述:綜合在圍繞GOTO語句的爭論中眾多學(xué)者的意見,多結(jié)構(gòu)化程序設(shè)計(jì)的概念逐漸清晰起來。E.W.Dijikstra提出了程序要實(shí)現(xiàn)結(jié)構(gòu)化的主張,并將這一類程序設(shè)計(jì)稱為結(jié)構(gòu)化程序設(shè)計(jì)。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202380.6.5.2結(jié)構(gòu)化程序設(shè)計(jì)的原則結(jié)構(gòu)化程序設(shè)計(jì)原則:(1)使用語言中的順序、選擇、重復(fù)等有限的基本控制結(jié)構(gòu)表示程序邏輯;(2)使用的控制結(jié)構(gòu)只準(zhǔn)許有一個(gè)入口和出口;(3)程序語句組成容易識(shí)別的塊,每塊只有一個(gè)入口和出口;(4)復(fù)雜結(jié)構(gòu)應(yīng)該用基本控制結(jié)構(gòu)進(jìn)行組合嵌套來實(shí)現(xiàn);設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202381.6.5.2結(jié)構(gòu)化程序設(shè)計(jì)的原則結(jié)構(gòu)化程序設(shè)計(jì)原則:(5)語言中沒有的控制結(jié)構(gòu),可用一段等價(jià)的程序段模擬,但要求該程序段在整個(gè)系統(tǒng)中應(yīng)前后一致;(6)嚴(yán)格控制GOTO語句,僅在下列情形中才可以使用:用一個(gè)非結(jié)構(gòu)化的程序設(shè)計(jì)語言實(shí)現(xiàn)一個(gè)結(jié)構(gòu)化的構(gòu)造;在某種可以改善而不是損害程序可讀性的情況下。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202382.6.5.2結(jié)構(gòu)化程序設(shè)計(jì)的原則示例1:實(shí)現(xiàn)流程圖所示的一個(gè)打印A、B、C三數(shù)中最小者的程序設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化A<BB<CA<C打印B打印C打印AFTFTFT4/20/202383.6.5.2結(jié)構(gòu)化程序設(shè)計(jì)的原則示例1:實(shí)現(xiàn)流程圖所示的一個(gè)打印A、B、C三數(shù)中最小者的程序設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化用FORTRAN語言、GOTO語句IF(A.LT.B)GOTO120IF(B.LT.C)GOTO110100WRITE(6,*)CGOTO140110WRITE(6,*)BGOTO140120IF(A.LT.C)GOTO130GOTO100130WRITE(6,*)C140CONTINUE用FORTRAN77、IT-THEN-ELSE結(jié)構(gòu)IF(A.LT.B.AND.A.LT.C)THENWRITE(6,*)AELSEIF(A.GE.B.AND.B.LT.C)THENWRITE(6,*)BELSEWRITE(6,*)CENDIFENDIF這種程序結(jié)構(gòu)清晰,可讀性好4/20/202384.6.5.2結(jié)構(gòu)化程序設(shè)計(jì)的原則示例2:設(shè)在閉區(qū)間[a,b]上函數(shù)F(x)由唯一的一個(gè)零點(diǎn),用二分法求方程F(x)=0在區(qū)間[a,b]中的根。下面給出幾個(gè)用C語言編寫的程序段,其中X0,X1是當(dāng)前求根區(qū)間[X0,X1]的下上界,Xm使該區(qū)間的中點(diǎn),eps是一個(gè)給定的很小正數(shù),用于迭代收斂的判斷。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化F(x)ab4/20/202385.6.5.2結(jié)構(gòu)化程序設(shè)計(jì)的原則示例2:使用GOTO語句和標(biāo)號(hào)finish設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化F0=F(a);F1=F(b);If(F0*F1<=0){X0=a;X1=b;for(I=1;I<=n;I++){Xm=(X0+X1)/2;Fm=F(Xm);if(abs(Fm)<eps||abs(X1-X0)<eps)gotofinish;if(F0*Fm>0){X0=Xm;F0=Fm;}elseX1=Xm;}Finish:printf(“\nTherootofthisequationis%d\n”,Xm);}非結(jié)構(gòu)化程序,程序中有兩個(gè)循環(huán)出口:(1)正常出口:當(dāng)循環(huán)變量I超出了循環(huán)終值n時(shí)退出循環(huán);(2)非正常出口:當(dāng)某種條件滿足時(shí),從循環(huán)中間某處轉(zhuǎn)出循環(huán),執(zhí)行循環(huán)后面的語句。4/20/202386.6.5.2結(jié)構(gòu)化程序設(shè)計(jì)的原則示例2:使用break語句設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化F0=F(a);F1=F(b);If(F0*F1<=0){X0=a;X1=b;for(I=1;I<=n;I++){Xm=(X0+X1)/2;Fm=F(Xm);if(abs(Fm)<eps||abs(X1-X0)<eps)break;if(F0*Fm>0){X0=Xm;F0=Fm;}elseX1=Xm;}}/*區(qū)間兩端點(diǎn)的函數(shù)值*//*區(qū)間中沒有根,不作*//*設(shè)置當(dāng)前求根區(qū)間兩端點(diǎn)*//*最多允許迭代n次*//*求中點(diǎn)及中點(diǎn)的函數(shù)值*//*求到轉(zhuǎn)出循環(huán)*//*沒有求到,縮小求根區(qū)間*//*向右縮小區(qū)間*//*向左縮小區(qū)間*/非結(jié)構(gòu)化程序,利用break語句將控制轉(zhuǎn)出循環(huán),執(zhí)行循環(huán)后的語句。功能與上例相同,由于將轉(zhuǎn)移語句與轉(zhuǎn)出條件的判斷直接聯(lián)系在一起,可讀性較好。4/20/202387.6.5.2結(jié)構(gòu)化程序設(shè)計(jì)的原則示例2:用布爾變量finished控制循環(huán)結(jié)束設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化F0=F(a);F1=F(b);If(F0*F1<=0){X0=a;X1=b;I=1;finished=0;while(I<=n&&finished==0){Xm=(X0+X1)/2;Fm=F(Xm);if(abs(Fm)<eps||abs(X1-X0)<eps)finished=1;if(finished==0)if(F0*Fm>0){X0=Xm;F0=Fm;}elseX1=Xm;}}程序中利用了一個(gè)布爾量finished,該變量的初值為false,當(dāng)循環(huán)中求到了要求的結(jié)果時(shí),將此變量的值改變?yōu)閠rue,表示循環(huán)應(yīng)結(jié)束,while循環(huán)測試到循環(huán)次數(shù)超過n或finished為true,就自動(dòng)退出循環(huán),執(zhí)行后續(xù)語句。結(jié)構(gòu)化程序,程序中所有結(jié)構(gòu)均為單入口與單出口,且沒有GOTO語句。其結(jié)構(gòu)很簡單,只有一重循環(huán),但由于引入一個(gè)布爾量來控制循環(huán)結(jié)束,可讀性比前兩例要差。當(dāng)程序中有多重循環(huán)時(shí),引入多個(gè)布爾變量,可讀性會(huì)更差。4/20/202388.6.5.3程序設(shè)計(jì)方法概述:程序設(shè)計(jì)的基本方法是自頂向下與自底向上。結(jié)構(gòu)化程序設(shè)計(jì)提倡自頂向下,逐步求精的方法。在程序編碼階段,要求將詳細(xì)設(shè)計(jì)得到的模塊抽象描述逐步細(xì)化為用規(guī)定程序描述的程序。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202389.6.5.3程序設(shè)計(jì)方法自頂向下逐步細(xì)化示例:要求用篩選法求100以內(nèi)的素?cái)?shù)。所謂的篩選法,就是從2到100中去掉2,3,…,9,10的倍數(shù),剩下的就是100以內(nèi)的素?cái)?shù)。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202390.6.5.3程序設(shè)計(jì)方法第一步:按程序功能寫出一個(gè)框架設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化Main(){建立2到100的數(shù)組A[],其中A[i]=i………1建立2到10的素?cái)?shù)組B[],存放2到10以內(nèi)的素?cái)?shù)………2若A[i]是B[]中任一數(shù)的倍數(shù),則剔除A[i]………………3輸出A[]中所有沒有被剔除的數(shù)…………4}4/20/202391.6.5.3程序設(shè)計(jì)方法第二步:將框架中每個(gè)加工語句細(xì)化設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化Main(){/*建立2到100的數(shù)組A[],其中A[i]=i*/……………1for(i=2;i<=100;i++)A[i]=i;/*建立2到10的素?cái)?shù)組B[],存放2到10以內(nèi)的素?cái)?shù)*/……………2B[1]=2;B[2]=3;B[3]=5;B[4]=7;/*若A[i]是B[]中任一數(shù)的倍數(shù),則剔除A[i]*/……3

for(j=1;j<=4;j++)檢查A[]所有的數(shù)能否被B[j]整除并將能被整除的數(shù)從A[]中剔除…3.1/*輸出A[]中所有沒有被剔除的數(shù)*/………………4

for(i=2;i<=100;i++)A[i]=i;若A[i]沒有被剔除,則輸出之………..4.1}4/20/202392.6.5.3程序設(shè)計(jì)方法第三步:進(jìn)一步細(xì)化設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化Main(){/*建立2到100的數(shù)組A[],其中A[i]=i*/for(i=2;i<=100;i++)A[i]=i;/*建立2到10的素?cái)?shù)組B[],存放2到10以內(nèi)的素?cái)?shù)*/B[1]=2;B[2]=3;B[3]=5;B[4]=7;/*若A[i]是B[]中任一數(shù)的倍數(shù),則剔除A[i]*/for(j=1;j<=4;j++)/*檢查A[]所有的數(shù)能否被B[j]整除并將能被整除的數(shù)從A[]中剔除*/for(i=2;i<=100;i++)A[i]=i;if(A[i]/B[j]*B[j]==A[i])A[i]=0;/*輸出A[]中所有沒有被剔除的數(shù)*/for(i=2;i<=100;i++)A[i]=i;/*若A[i]沒有被剔除,則輸出之*/if(A[i]!=0)printf(“A[%d]=%d\n”,i,A[i])}4/20/202393.6.5.3程序設(shè)計(jì)方法優(yōu)點(diǎn):(1)符合人們解決復(fù)雜問題的普遍規(guī)律,可提高軟件開發(fā)的成功率和生產(chǎn)率;(2)開發(fā)出的程序具有清晰的層次結(jié)構(gòu),容易閱讀和理解;(3)程序自頂向下、逐步細(xì)化,分解成一個(gè)樹形結(jié)構(gòu);設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202394.6.5.3程序設(shè)計(jì)方法優(yōu)點(diǎn):(4)程序清晰和模塊化,在修改和重新設(shè)計(jì)軟件時(shí),可復(fù)用的代碼量大;(5)程序的邏輯結(jié)構(gòu)清晰,有利于程序正確性證明;(6)每一步工作僅在上層節(jié)點(diǎn)的基礎(chǔ)上作不多的設(shè)計(jì)擴(kuò)展,便于檢查;(7)有利于設(shè)計(jì)的分工和組織工作。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202395.6.6面向?qū)ο蠹夹g(shù)設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化

面向?qū)ο蠹夹g(shù)是一個(gè)有全新概念的開發(fā)模式,其特點(diǎn)是:它是對(duì)軟件開發(fā)過程所有階段進(jìn)行綜合考慮而得到的;從生存期的一個(gè)階段到下一個(gè)階段所使用的方法與技術(shù)具有高度的連續(xù)性;它將面向?qū)ο蠓治觯∣OA)、面向?qū)ο笤O(shè)計(jì)(OOD)、面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)集成在一起4/20/202396.6.6面向?qū)ο蠹夹g(shù)面向?qū)ο蠹夹g(shù)是一種應(yīng)用廣泛、很有發(fā)展前途的方法,它將成為今后軟件開發(fā)技術(shù)的主流。采用面向?qū)ο蟮姆椒ǎ徽撌裁礃拥膯栴}與系統(tǒng),我們都可以將其視為許多對(duì)象及其相互作用。采用對(duì)象的觀點(diǎn)看待我們所要解決的實(shí)際問題,并將其抽象為系統(tǒng)是極其自然與簡單的,并且所得到的應(yīng)用系統(tǒng)更容易理解、修改和維護(hù)。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202397.6.6面向?qū)ο蠹夹g(shù)設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化6.6.1面向?qū)ο蟮母拍?.6.2基于復(fù)用的開發(fā)過程6.6.3面向?qū)ο蠓治雠c模型化6.6.4高層設(shè)計(jì)6.6.5類的設(shè)計(jì)6.6.6Coad與Yourdon的O-O技術(shù)6.6.7Booch的方法6.6.8面向?qū)ο笤O(shè)計(jì)的實(shí)現(xiàn)4/20/202398.6.6.1面向?qū)ο蟮母拍蠲嫦驅(qū)ο螅好嫦驅(qū)ο螅綄?duì)象+類+繼承+通信如果一個(gè)軟件系統(tǒng)使用這樣4個(gè)概念設(shè)計(jì)和實(shí)現(xiàn)的,則認(rèn)為這個(gè)軟件系統(tǒng)是面向?qū)ο蟮摹R粋€(gè)面向?qū)ο蟮某绦虻拿恳唤M成部分都是對(duì)象,計(jì)算是通過建立新的對(duì)象和對(duì)象之間的通信來執(zhí)行的。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/202399.6.6.1面向?qū)ο蟮母拍顚?duì)象(Object):通常將對(duì)象定義為它本身的一組屬性和它可執(zhí)行的一組操作。屬性一般只能通過執(zhí)行對(duì)象的操作來改變。操作又稱為方法、服務(wù)或成員函數(shù),它描述了對(duì)象執(zhí)行的功能,若通過消息傳遞,還可以為其它對(duì)象使用。消息是一個(gè)對(duì)象與另一個(gè)對(duì)象的通信單元,是要求某個(gè)對(duì)象執(zhí)行類中定義的某個(gè)操作的規(guī)格說明。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023100.6.6.1面向?qū)ο蟮母拍顚?duì)象的特征:(1)有一個(gè)標(biāo)識(shí)符,如同人的身份證一樣,該標(biāo)識(shí)符在所研究的問題域中是唯一的,用以區(qū)別于其它對(duì)象。(2)有一個(gè)狀態(tài),由一組數(shù)據(jù)或由數(shù)據(jù)與其它對(duì)象的組合來描述,該組數(shù)據(jù)稱為對(duì)象的屬性。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023101.6.6.1面向?qū)ο蟮母拍顚?duì)象的特征:(3)有一組操作,每一個(gè)操作決定對(duì)象的一種行為。對(duì)象的操作可分成兩類:自身所承受的操作,用來改變自身的狀態(tài);施加于其它對(duì)象的操作,用來通過其它對(duì)象的某種操作改變其它對(duì)象的狀態(tài),體現(xiàn)為對(duì)象之間的相互作用。(4)對(duì)象的狀態(tài)只能由自身的行為來改變。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023102.6.6.1面向?qū)ο蟮母拍顚?duì)象的特征:(5)對(duì)象之間是通過消息相互通信的。當(dāng)一個(gè)對(duì)象要求另一個(gè)對(duì)象執(zhí)行某種操作時(shí),就向它發(fā)送一個(gè)消息,發(fā)送給一個(gè)對(duì)象的消息定義了一個(gè)操作名和一個(gè)參數(shù)表(可能是空的),并指定某一個(gè)對(duì)象,而由一個(gè)對(duì)象接收的消息則調(diào)回消息中指定的操作,并將形式參數(shù)與參數(shù)表中相應(yīng)的值結(jié)合起來。(6)一個(gè)對(duì)象的狀態(tài)可以由多個(gè)其它對(duì)象的狀態(tài)構(gòu)成。如果一個(gè)對(duì)象的狀態(tài)由其它對(duì)象表示,則稱構(gòu)成它的那些對(duì)象是它的屬性。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023103.6.6.1面向?qū)ο蟮母拍顚?duì)象的基本概念示意圖:設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化狀態(tài)操作消息…4/20/2023104.6.6.1面向?qū)ο蟮母拍顚?duì)象的示例:設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化在計(jì)算機(jī)屏幕上的三個(gè)多邊形(10,50)(30,60)(20,30)(45,65)(60,70)(65,66)(50,45)(35,25)(50,25)(35,10)(50,10)4/20/2023105.6.6.1面向?qū)ο蟮母拍顚?duì)象的示例:設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化表示多邊形的三個(gè)對(duì)象triangle

(10,50)(30,60)(20,30)drawmove(Δx,Δy)contains?(apoint)quadrilateral1

(35,10)(50,10)(35,25)(50,25)drawmove(Δx,Δy)contains?(apoint)quadrilateral2

(45,65)(50,45)(65,66)(60,70)drawmove(Δx,Δy)contains?(apoint)4/20/2023106.6.6.1面向?qū)ο蟮母拍顚?duì)象的兩個(gè)視圖:從設(shè)計(jì)方面來看,對(duì)象是一些模型化的實(shí)體,直接對(duì)應(yīng)于現(xiàn)實(shí)世界的實(shí)體。這個(gè)視圖把對(duì)象看作實(shí)體,產(chǎn)生實(shí)體的聲明、描述實(shí)體、包括實(shí)體的屬性和可以執(zhí)行的操作。從實(shí)現(xiàn)方面來看,一個(gè)對(duì)象是實(shí)際使用的數(shù)據(jù)結(jié)構(gòu)和操作。兩個(gè)視圖的作用,是把說明與實(shí)現(xiàn)分離,對(duì)數(shù)據(jù)結(jié)構(gòu)和相關(guān)操作的實(shí)現(xiàn)進(jìn)行封裝。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023107.6.6.1面向?qū)ο蟮母拍铑悾–lass)及實(shí)例(Instanse):類是一組具有相同數(shù)據(jù)結(jié)構(gòu)和相同操作的對(duì)象的集合。類的定義包括一組數(shù)據(jù)屬性和在數(shù)據(jù)上的一組合法的操作。類定義可以視為一個(gè)具有類似特性與共同行為的對(duì)象的模板。在一個(gè)類中,每個(gè)對(duì)象都是類的實(shí)例,它們都可使用類中提供的函數(shù)。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023108.6.6.1面向?qū)ο蟮母拍钜粋€(gè)類的不同實(shí)例必定具有:(1)相同的操作(或行為)的集合;(2)相同的信息結(jié)構(gòu)或?qū)傩远x,但可以有不同的屬性值;(3)不同的對(duì)象標(biāo)識(shí)。因此,類是表現(xiàn)對(duì)象結(jié)構(gòu)共性和行為共性的一種定義或模板或機(jī)制。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023109.6.6.1面向?qū)ο蟮母拍铑愔兄辽侔艘韵聝煞矫娴拿枋觯海?)本類所有實(shí)例的屬性定義或結(jié)構(gòu)的定義;(2)本類所有實(shí)例操作(或行為)的定義。例如:四邊形的類定義設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化Quadrilateral

point1point2point3point4drawmove(Δx,Δy)contains?(apoint)4/20/2023110.6.6.1面向?qū)ο蟮母拍羁梢允褂妙惖慕缑妫╬ublic)中定義的操作對(duì)類的實(shí)例進(jìn)行操作。例如:發(fā)送一個(gè)消息draw給類quadrilateral的一個(gè)實(shí)例,將會(huì)引發(fā)該實(shí)例執(zhí)行它的draw操作,draw操作會(huì)畫出一個(gè)四邊形,并通過該實(shí)例內(nèi)的point數(shù)據(jù)確定圖形的位置。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023111.6.6.1面向?qū)ο蟮母拍铑惖膶?shí)現(xiàn)常使用其它類的實(shí)例,以得到該類所需要的服務(wù)。上例中定義類quadrilateral的某一個(gè)對(duì)象所引用的4個(gè)頂點(diǎn)是4個(gè)point對(duì)象。這些point對(duì)象將成為quadrilateral對(duì)象的私有數(shù)據(jù)成員,不能被其它對(duì)象存取。如果其它對(duì)象必須存取這些點(diǎn),需要在類的界面上增加存取這些點(diǎn)的操作。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023112.6.6.1面向?qū)ο蟮母拍铑惖膶?shí)現(xiàn)還可能包括某些私有操作和私有數(shù)據(jù),只有該類的對(duì)象可以使用,而其它任何類的對(duì)象都不能使用。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023113.6.6.1面向?qū)ο蟮母拍蠲嫦驅(qū)ο蟮南到y(tǒng)的特點(diǎn):繼承性多態(tài)性封裝性設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023114.6.6.1面向?qū)ο蟮母拍罾^承性(inheritance):如果類B繼承類A,那么,類A中的所有屬性和方法均成為類B的組成部分。同時(shí)稱類B為類A的子類、類A為類B的父類。繼承是使用已存在的定義作為基礎(chǔ)建立新定義的技術(shù)。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023115.6.6.1面向?qū)ο蟮母拍罾美^承的機(jī)制,新類的定義可以是既存類所聲明的數(shù)據(jù),再加上新類增加的數(shù)據(jù)的組合。新類也可以不加修改地復(fù)用既存類的定義。在繼承結(jié)構(gòu)中,既存類是父類(基類),新類是子類(派生類)。因此,繼承性可以說是實(shí)現(xiàn)軟件重用的核心思想。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023116.6.6.1面向?qū)ο蟮母拍罾^承性的突出特點(diǎn):(1)使系統(tǒng)的修改或維護(hù)局部化;(2)可以有效地避免系統(tǒng)結(jié)構(gòu)的冗余,有利于簡化系統(tǒng)描述。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023117.6.6.1面向?qū)ο蟮母拍罾^承性示例:Polygon類Polygon類的子類Quadrilateral設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化Polygon

referencePointVerticesdrawmove(Δx,Δy)contains?(apoint)Quadrilateral

referencePointVerticesdrawmove(Δx,Δy)contains?(apoint)4/20/2023118.6.6.1面向?qū)ο蟮母拍疃鄳B(tài)性(polymorphism):所謂多態(tài)即一個(gè)名詞可具有多種語義。多態(tài)性是面向?qū)ο笙到y(tǒng)中的又一重要特性,它由兩方面的含義:同一對(duì)象接收到不同消息采用不同的行為方式;同一消息可以根據(jù)發(fā)送消息對(duì)象的不同采用多種不同的行為方式。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023119.6.6.1面向?qū)ο蟮母拍疃鄳B(tài)性示例:如圖給出的4個(gè)類的繼承層次。類quadrilateral的實(shí)際參數(shù)可代替類polygon的形式參數(shù)。類quadrilateral的界面可響應(yīng)類polygon界面的所有消息。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化PolygonTriangleQuadrilateralRectangle4/20/2023120.6.6.1面向?qū)ο蟮母拍疃鄳B(tài)性示例:如想要在屏幕上畫一系列多邊形。多態(tài)性允許一個(gè)對(duì)象同時(shí)屬于幾個(gè)類型。一個(gè)數(shù)據(jù)結(jié)構(gòu)所包含的元素可以屬于一組指定的類型而不僅是一個(gè)類型,可以認(rèn)為這是一個(gè)類族,通過對(duì)表元素的形式類型規(guī)格說明的繼承,把這些類關(guān)聯(lián)在一起??梢酝ㄟ^遍歷這個(gè)表,發(fā)送給各個(gè)表元素以draw的消息,“畫出”多邊形表中所有的項(xiàng)。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023121.6.6.1面向?qū)ο蟮母拍罘庋b性:封裝是一種信息隱藏技術(shù),用戶只能見到對(duì)象封裝界面上的消息,對(duì)象內(nèi)部對(duì)用戶是隱藏的,封裝的目的在于將對(duì)象的使用者和對(duì)象的設(shè)計(jì)者分開,使用者不必知道行為實(shí)現(xiàn)的細(xì)節(jié),只需用設(shè)計(jì)者提供的消息來訪問對(duì)象。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023122.6.6.1面向?qū)ο蟮母拍罘庋b性的定義:一個(gè)清楚的邊界,所有對(duì)象的內(nèi)部軟件的范圍被限定在這個(gè)邊界內(nèi);一個(gè)接口,這個(gè)接口描述這個(gè)對(duì)象和其它對(duì)象之間的相互作用;受保護(hù)的內(nèi)部實(shí)現(xiàn),這個(gè)實(shí)現(xiàn)給出了由軟件對(duì)象提供的功能的實(shí)現(xiàn)細(xì)節(jié),實(shí)現(xiàn)細(xì)節(jié)不能在定義這個(gè)對(duì)象的類的外面訪問。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023123.6.6.1面向?qū)ο蟮母拍顚?duì)象的定義和對(duì)象的實(shí)現(xiàn)顯式地分開是面向?qū)ο笙到y(tǒng)的一大特色。封裝本身即模塊性,把定義模塊和實(shí)現(xiàn)模塊分開,就使得面向?qū)ο蠹夹g(shù)所開發(fā)設(shè)計(jì)的軟件的可維護(hù)性、可修改性大為改善。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023124.6.6.2基于復(fù)用的開發(fā)過程軟件人員根據(jù)生存期組織和管理開發(fā)過程。為生存期中每個(gè)階段規(guī)定一定的任務(wù)。面向?qū)ο蠓椒ㄔ谏嫫诟鱾€(gè)階段開發(fā)出來的“部件”都是類,從而改進(jìn)了在生存期各個(gè)階段之間的界面,并在面向?qū)ο笊嫫诘母鱾€(gè)階段對(duì)各個(gè)類的信息進(jìn)行細(xì)化,因此,類成為分析、設(shè)計(jì)和實(shí)現(xiàn)的基本單元。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023125.6.6.2基于復(fù)用的開發(fā)過程應(yīng)用生存期傳統(tǒng)的生存期是瀑布模型,已廣泛應(yīng)用于過程性項(xiàng)目。在這個(gè)模型中,從問題的分析開始,直到維護(hù)老化,各個(gè)階段細(xì)化成許多實(shí)際的子處理。由于這個(gè)生存期對(duì)整個(gè)的開發(fā)過程進(jìn)行了模型化,所以稱它為應(yīng)用的生存期。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023126.6.6.2基于復(fù)用的開發(fā)過程面向?qū)ο箝_發(fā)過程的應(yīng)用生存期模型設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化信息系統(tǒng)描述論域分析應(yīng)用分析高層設(shè)計(jì)類開發(fā)實(shí)例建立組裝測試維護(hù)客戶輸入4/20/2023127.6.6.2基于復(fù)用的開發(fā)過程應(yīng)用生存期使用傳統(tǒng)的應(yīng)用生存期時(shí)存在的問題是它沒有考慮超出一個(gè)單獨(dú)的項(xiàng)目的情形,也沒有考慮任何比整個(gè)系統(tǒng)更小的“產(chǎn)品”。面向?qū)ο蟀杨惍?dāng)作單元,而且可分別考慮類的生存期與應(yīng)用生存期,它可獨(dú)立于應(yīng)用生存期操作。這個(gè)生存期包含在上圖所示的類開發(fā)階段中,可與應(yīng)用生存期集成。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023128.6.6.2基于復(fù)用的開發(fā)過程類生存期系統(tǒng)開發(fā)的各個(gè)階段都可能會(huì)標(biāo)識(shí)新的類。但在各個(gè)階段標(biāo)識(shí)的類所起的作用是不同的。在分析階段標(biāo)識(shí)的類是針對(duì)特定問題的,而在實(shí)現(xiàn)階段標(biāo)識(shí)的類要給出基本數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)可在許多系統(tǒng)中使用。在純面向?qū)ο蟮南到y(tǒng)開發(fā)中,一個(gè)系統(tǒng)是一個(gè)類,為解決問題所需要的所有元素都放在一個(gè)類中,并通過該類的一個(gè)實(shí)例來解決問題。設(shè)計(jì)語言質(zhì)量要求設(shè)計(jì)風(fēng)格面向?qū)ο蟊菊滦〗Y(jié)復(fù)雜度結(jié)構(gòu)化4/20/2023129

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論