




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第六章 經(jīng)典軟件體系結(jié)構(gòu) 本章介紹經(jīng)典的軟件體系結(jié)構(gòu),主要包括Mary Shaw等人所總結(jié)的一些軟件體系結(jié)構(gòu)分格。眾所周知,計算機學(xué)科歷史較短,因此,軟件架構(gòu)的研究歷史更短。本章所謂的經(jīng)典軟件體系結(jié)構(gòu)也僅僅是指在20世紀(jì)80年代至21世紀(jì)初期間提出的成功的軟件體系結(jié)構(gòu)。本章將介紹調(diào)用-返回分格軟件體系結(jié)構(gòu)、數(shù)據(jù)流風(fēng)格軟件體系結(jié)構(gòu)、基于事件的軟件體系結(jié)構(gòu)、層次軟件體系架構(gòu)與MVC軟件體系結(jié)構(gòu)。6.1 調(diào)用-返回風(fēng)格軟件體系結(jié)構(gòu) 相對于一些基礎(chǔ)學(xué)科,計算機學(xué)科的發(fā)展歷史較短。20世紀(jì)50年代才出現(xiàn)了適合商業(yè)應(yīng)用的軟件開發(fā)語言。軟件設(shè)計與開發(fā)也經(jīng)歷了從初級到高級的歷程。回顧歷史,從20世紀(jì)50年代到
2、60年代末,屬于非結(jié)構(gòu)化簡單程序開發(fā)階段,軟件設(shè)計方面采用簡單程序模型,典型的開發(fā)語言Algol(1958)、COBOL(1959)和Basic(1964);從20世紀(jì)70年代初到80年代初,屬于結(jié)構(gòu)化設(shè)計編程階段,典型的開發(fā)語言有Pascal(1968)、C(1972)、FORTRAN和Perl。雖然從20世紀(jì)60年代開始就有了面向?qū)ο蟾拍畹挠懻?,但是直?0世紀(jì)80年代初正式開始才面向?qū)ο笤O(shè)計編程階段,就有了代表性的面向?qū)ο筌浖_發(fā)語言包括SmallTalk、Ada、C+(1983)和Java(1995)。 本節(jié)首先簡要回顧非結(jié)構(gòu)化編程,然后介紹對軟件設(shè)計有重要的影響的調(diào)用-返回風(fēng)格軟件體
3、系結(jié)構(gòu),重點介紹其中的主程序 - 子程序軟件體系結(jié)構(gòu)與面向?qū)ο筌浖w系結(jié)構(gòu),并對它們進行討論。6.1.1 非結(jié)構(gòu)化編程簡介 非結(jié)構(gòu)化編程技術(shù)是歷史上最早的編程范型。緊隨其后的是結(jié)構(gòu)化設(shè)計/編程技術(shù)與面向?qū)ο笤O(shè)計/編程技術(shù)。一個由非結(jié)構(gòu)化語言編寫的程序通常包含一系列有序的命令,或者稱為語句,通常是每個語句占一行,每行都有標(biāo)記一個行號或者可能是標(biāo)簽。這樣做的目的事允許程序執(zhí)行流可以依據(jù)行號從一行跳到程序的其他指定的行。支持非結(jié)構(gòu)化編程的語言包括早期的BASIC與COBOL。非結(jié)構(gòu)化編程引入基本的循環(huán)、分支與跳躍等控制流的概念。在非結(jié)構(gòu)化編程中,雖然出現(xiàn)了較為原始的子程序的概念,但其與結(jié)構(gòu)化編程中過
4、程(Procedure)的概念有本質(zhì)的區(qū)別。非結(jié)構(gòu)化編程中的子程序允許有多個入口和多個出口,理論上允許程序在任何地方轉(zhuǎn)入子程序或退出子程序,而在這結(jié)構(gòu)化編程中是不允許的。雖然非結(jié)構(gòu)化編程所編寫的程序很難理解,并且經(jīng)常遭到批評,但是早期的銀行與金融機構(gòu)軟件代碼都是由非結(jié)構(gòu)化編程語言(例如COBOL)寫的。目前,非結(jié)構(gòu)化編程已成為歷史,現(xiàn)在很少使用(除了有些銀行與金融業(yè)企業(yè)仍然使用COBOL進行開發(fā),但和早期的版本相比有了很多改善,例如COBOL 97包括常規(guī)改善并且具備了面向?qū)ο蟮奶卣鳎虼吮竟?jié)將不把注意力放在非結(jié)構(gòu)化編程方面,而主要介紹采用結(jié)構(gòu)化設(shè)計方法的主程序-子程序軟件體系結(jié)構(gòu)與采用面向
5、對象設(shè)計方法的面向?qū)ο筌浖w系結(jié)構(gòu)。在介紹這兩種軟件體系結(jié)構(gòu)以前,首先介紹調(diào)用-返回風(fēng)格的體系結(jié)構(gòu)的概念。6.1.2 調(diào)用-返回風(fēng)格軟件體系結(jié)構(gòu)的概念調(diào)用-返回風(fēng)格體系結(jié)構(gòu)(Call and Return Architecture)是在過去的30年內(nèi)具有深遠(yuǎn)影響的軟件體系結(jié)構(gòu)。本節(jié)要介紹的共享數(shù)據(jù)的主程序-子程序體系結(jié)構(gòu)與面向?qū)ο篌w系結(jié)構(gòu)可以被認(rèn)為是調(diào)用-返回風(fēng)格體系結(jié)構(gòu)的子類型。因此,熟悉調(diào)用-返回風(fēng)格架構(gòu)對于理解這兩個體系結(jié)構(gòu)有重大意義。利用調(diào)用 - 返回風(fēng)格軟件體系結(jié)構(gòu)設(shè)計的軟件系統(tǒng)使用的是分而治之策略,其主要的思想是將一個復(fù)雜的大系統(tǒng)分解為一些子系統(tǒng),以便降低復(fù)雜度,并且增加可修改性。
6、這種系統(tǒng)的程序執(zhí)行順序通常只由一個單線程控制。例如,一個軟件架構(gòu)C,只有從另外一個調(diào)用者軟件構(gòu)件B得到控制以后,才能執(zhí)行該構(gòu)件C的程序;當(dāng)運行結(jié)束以后,將控制返回給軟件構(gòu)件B。該程序的運行控制流如圖6.1所示。圖中的長箭頭可以理解為是一個程序構(gòu)件對另外一個構(gòu)件的調(diào)用,而短箭頭為程序運行控制流的走向,這也就是名稱“調(diào)用-返回”的由來。M1018329EAB7465DC圖6.1 調(diào)用-返回風(fēng)格軟件體系結(jié)構(gòu)大的程序運行控制流示意圖每個軟件構(gòu)件都設(shè)計為有一個唯一的程序執(zhí)行起點和唯一的程序執(zhí)行終點,或者稱為程序執(zhí)行入口和程序執(zhí)行出口。程序從其執(zhí)行入口開始執(zhí)行該構(gòu)件的代碼,運行至該構(gòu)件的程序執(zhí)行的出口,然
7、后程序執(zhí)行結(jié)束,而將控制返回給程序調(diào)用構(gòu)件。上述程序構(gòu)件通常叫做子程序(Subroutine),從一個構(gòu)件到另外一個構(gòu)件的控制傳遞叫做子程序調(diào)用(Call)。子程序調(diào)用程序都有參數(shù)傳遞。擁有整個軟件入口的構(gòu)件叫做主程序(Main Program),它控制子程序的執(zhí)行順序。在這種風(fēng)格的系統(tǒng)中,也可能有一些被動的數(shù)據(jù)構(gòu)件,其中存儲供子程序的訪問的共享數(shù)據(jù)??梢员凰熊浖?gòu)件訪問的共享數(shù)據(jù)被稱為全局變量。這種調(diào)用-返回風(fēng)格體系結(jié)構(gòu)的組織與執(zhí)行的動態(tài)控制可以由高級程序語言的過程(Procedure)、函數(shù)(Function)或者方法(Method)來實現(xiàn)。調(diào)用-返回風(fēng)格架構(gòu)可以被組織成任何形式,例如,
8、可以將程序設(shè)計為如圖6.2所示的結(jié)構(gòu)圖。在該圖中,箭頭代表調(diào)用,方塊內(nèi)有“Sub”字樣的是子程序,有“Global Date”字樣的為數(shù)據(jù)構(gòu)件。圖6.2設(shè)計的邏輯關(guān)系比較復(fù)雜,因此,通常人們往往喜歡將其組織成如圖6.3所示的層次結(jié)構(gòu)。這樣組織成層次結(jié)構(gòu)的調(diào)用-返回風(fēng)格架構(gòu)設(shè)計叫做共享數(shù)據(jù)的主程序-子程序軟件體系架構(gòu),其原因是在調(diào)用-返回體系結(jié)構(gòu)中包括一個控制其他組件的主程序,該程序選擇調(diào)用在其下層的軟件組件(模塊、函數(shù)),而該軟件組件又往往調(diào)用其下層的軟件組件。每次調(diào)用都執(zhí)行一個子任務(wù),并且返回一個值。主程序-子程序體系結(jié)構(gòu)是較早出現(xiàn)的軟件體系結(jié)構(gòu)。Sub3MainSub4Sub2Sub1Gl
9、obal DataSub5Sub6圖6.2 應(yīng)用調(diào)用-返回風(fēng)格架構(gòu)的設(shè)計以上介紹的調(diào)用-返回風(fēng)格軟件體系結(jié)構(gòu)對于理解當(dāng)今流行軟件體系結(jié)構(gòu)有著重要的意義。下面將分別介紹該軟件體系結(jié)構(gòu)下的主程序-子程序軟件體系結(jié)構(gòu)與面向?qū)ο筌浖w系結(jié)構(gòu)。6.1.3 主程序-子程序軟件體系結(jié)構(gòu)主程序-子程序軟件體系結(jié)構(gòu)在設(shè)計上使用層次化的劃分方法,該體系結(jié)構(gòu)中使用由編程語言直接支持的單一的控制線程。子程序的結(jié)構(gòu)是明確的,子程序通常組成程序模塊。子程序的調(diào)用呈現(xiàn)層次狀,其正確與否往往取決于其調(diào)用的子程序的正確與否。主程序-子程序軟件體系結(jié)構(gòu)圖如吐6.3所示。Sub2Sub3Sub1Main DataSub1Data圖
10、6.3 共享數(shù)據(jù)的在主程序-子程序軟件體系結(jié)構(gòu)和非結(jié)構(gòu)編程比較,主程序-子程序軟件體系結(jié)構(gòu)能夠較好地支持系統(tǒng)的可改變性及可伸縮性等性能。由于該體系結(jié)構(gòu)采用了分而治之策略,將一個復(fù)雜問題分解為多個獨立的子問題,從而實現(xiàn)了對系統(tǒng)分復(fù)雜度的有效控制。C語言開發(fā)程度即屬于典型的主程序-子程序風(fēng)格的軟件體系結(jié)構(gòu)。C語言開發(fā)的程序通常包括一個main函數(shù)(即主程序)和一些自定義的函數(shù)(即子程序)。 主程序-子程序體系結(jié)構(gòu)中典型地存在一個控制線程,每個階層的組件從其父組件得到該控制并且通過它傳給它的子組件。使用主程序-子程序軟件體系結(jié)構(gòu)的設(shè)計通常采用如圖6.4所示的自頂向下的功能化設(shè)計方法。MainSubr
11、outine22Subroutine21Subroutine12Subroutine11Subroutine2Subroutine1Subroutine121Subroutine111圖6.4 自頂向下的的功能化設(shè)計方法自頂向下功能化設(shè)計方法的設(shè)計思想是,系統(tǒng)從功能的角度進行設(shè)計,從高層開始,逐步細(xì)化為詳細(xì)的設(shè)計。該設(shè)計從系統(tǒng)要完成的功能需求出發(fā),首先將一個整體問題(功能)分為幾個子問題(子功能),然后再考慮將每個子問題(子功能)再次劃分為幾個更小的子問題(子功能),依次下去,直到不可再分為止。通過這樣的設(shè)計,得到一顆如圖6.4所示的根朝上的樹形結(jié)構(gòu),其中,每個節(jié)點都是一個子程序??梢岳斫鉃橄?/p>
12、統(tǒng)的功能可以由多個子程序完成。高層子程序調(diào)用低層子程序,而低層主程序又調(diào)用比它更低的子程序,等等。結(jié)構(gòu)化程序設(shè)計得到了廣泛的應(yīng)用,例如阿波羅11號的地面控制系統(tǒng)的子系統(tǒng)Apollo Reentry RungeKutta數(shù)值集成器軟件采用結(jié)構(gòu)化程序設(shè)計,利用FORTRAN語言開發(fā),在當(dāng)時最快的計算機IBM 360 -75上運行。結(jié)構(gòu)化設(shè)計從數(shù)據(jù)流圖開始,然后將數(shù)據(jù)流圖轉(zhuǎn)換為程序結(jié)構(gòu)圖(Structured Chart)。設(shè)計數(shù)據(jù)流圖從數(shù)據(jù)輸入開始,對數(shù)據(jù)的各個處理過程以及最后的輸出進行描述;將提供給用戶的業(yè)務(wù)流程圖(”物理模型”)進行功能建模,轉(zhuǎn)化成開發(fā)人員更易理解的一系列”邏輯模型”圖,以圖形
13、化的方法描繪數(shù)據(jù)在系統(tǒng)中的流動和處理過程。這些圖需要用規(guī)范的DFD描述,達(dá)到系統(tǒng)在建立前有關(guān)信息就能被充分理解的目的。在設(shè)計時要求嚴(yán)格劃分開發(fā)階段,用規(guī)范的方法與圖表工具精確的描述各階段的工作,每個階段都以規(guī)范是哪個的文檔資料作為其成果,最終得到滿足用戶需要的系統(tǒng)。相對于非結(jié)構(gòu)化的設(shè)計,結(jié)構(gòu)化設(shè)計有以下優(yōu)點。(1) 邏輯設(shè)計與物理設(shè)計分開。(2) 開發(fā)過程中形成一套規(guī)范的文檔,以便后期修改和維護。結(jié)構(gòu)化設(shè)計的缺點為開發(fā)周期長,系統(tǒng)難以適應(yīng)環(huán)境的變化以及開發(fā)過程復(fù)雜繁瑣。結(jié)構(gòu)化設(shè)計適用于組織相對穩(wěn)定、業(yè)務(wù)處理過程規(guī)范、需求明確且在一定時期內(nèi)不壞發(fā)生大的變化的大型復(fù)雜系統(tǒng)的開發(fā),經(jīng)驗表明,當(dāng)程序小
14、于10萬行時,結(jié)構(gòu)化的程序設(shè)計比較成功。當(dāng)程序大于10萬行時,結(jié)構(gòu)化程序表現(xiàn)不加,原因是當(dāng)程序規(guī)模非常大時,程序代碼編寫耗時長,軟件測試變得越來越困難,難以保證軟件的可靠性。自頂向下的程序設(shè)計方法存在如下問題。(1) 功能煙花困難。自上而下的方法穿件了符合最初的需求的較好的軟件系統(tǒng)模型。但是當(dāng)系統(tǒng)改變或者增加新的需求是,功能結(jié)構(gòu)變得越來越笨拙。由于軟件被設(shè)計為樹形結(jié)構(gòu),修改與更新,通常要求廣泛的“剪枝”與“嫁葉”,使系統(tǒng)維護變得越來越困難。(2) 現(xiàn)實中的系統(tǒng)功能不容易描述。大型加護系統(tǒng)很難從功能方面進行刻畫。很多大型系統(tǒng)沒有“頂部”,例如,一個涉及數(shù)據(jù)查詢、數(shù)據(jù)改變與保持?jǐn)?shù)據(jù)一致性的軟件系統(tǒng)
15、,如果按照功能化自向下的設(shè)計,則該系統(tǒng)可能被設(shè)計為一個基于一個唯一的“虛擬”頂點并且會產(chǎn)生非常復(fù)雜的結(jié)構(gòu)。(3) 功能化設(shè)計丟掉了數(shù)據(jù)與數(shù)據(jù)結(jié)構(gòu)。自頂向下設(shè)計中捕捉不到所設(shè)計軟件涉及的數(shù)據(jù),通常,同樣的數(shù)據(jù)被多個函數(shù)共享(如更新、刪除、插入和詢問數(shù)據(jù)庫表)。因為系統(tǒng)分解只突出問題的功能方面,數(shù)據(jù)結(jié)構(gòu)對問題的影響被丟失了。(4) 由于功能設(shè)計得到的軟件產(chǎn)品產(chǎn)生的可復(fù)用代碼較少。自頂向下的設(shè)計連續(xù)不斷的將系統(tǒng)分為越來越簡單的程序模塊。每個程序塊被單獨地分析確認(rèn),沒有太多地考慮系統(tǒng)的其他部分。但是每個程序單元的設(shè)計都僅僅考慮極為有限的需求,因為這些特定的需求不太可能出現(xiàn)于下個問題,所以產(chǎn)生的設(shè)計與代
16、碼沒有普遍性與通用性,從而通常不可復(fù)用。6.1.4 面向?qū)ο蟮能浖w系結(jié)構(gòu)在結(jié)構(gòu)化設(shè)計以及編程中,簡單的程序可以由一個主程序中的一系列語句組成的一個較長的文件代表,而在負(fù)載的程序中,通過子程序或者函數(shù)執(zhí)行一些特定的任務(wù)。通常情況下,程序中的數(shù)據(jù)可以被程序的任何語句或者函數(shù)訪問,當(dāng)程序很大時,這種做法意味著一個程序缺陷(bug)可能被傳導(dǎo)到很遠(yuǎn),導(dǎo)致程序難以調(diào)試和維護,另外,如果想在程序中添加一些新的功能也比較困難,因為用戶必須清楚哪些函數(shù)對哪些數(shù)據(jù)進行了訪問與修改。相反,面對對象設(shè)計與編程方法可以使程序員將數(shù)據(jù)封裝起來,使數(shù)據(jù)訪問受到限制,也就是說數(shù)據(jù)不能被程序的其余部分不加限制的直接訪問。任
17、何一個函數(shù)都必須通過一個特殊的方法才能訪問這些數(shù)據(jù),該方法與數(shù)據(jù)一起被封裝在一個結(jié)構(gòu)體中。這種將數(shù)據(jù)與一系列訪問與管理這些這些數(shù)據(jù)的方法結(jié)合在一起的結(jié)構(gòu)體實際上就是本接種要介紹的對象(Object).可以認(rèn)為,一個對象是將數(shù)據(jù)與那些為了訪問和維護這些數(shù)據(jù)的操作(即函數(shù)方法)捆綁在議案七的一個實體,對象提供了一些簡單易使用的、規(guī)范化的方法對其數(shù)據(jù)進行某種操作,而隱瞞了其具體的執(zhí)行任務(wù)的繁瑣細(xì)節(jié),這樣做的好處是,可以改變對象的內(nèi)部結(jié)構(gòu)或方法,而不需要修改程序的其余部分。在面向?qū)ο笤O(shè)計中,系統(tǒng)看做由一些對象的集合組成(而不是由函數(shù)或者方法組成),消息從一個對象發(fā)送到另外一個對象,每一個對象都有其相關(guān)
18、功能。面向?qū)ο篌w系結(jié)構(gòu)圖如圖6.9所示。objcallobjcallcallobjobjcallcallcallobjcallobjobjcall圖6.9 面向?qū)ο蟮捏w系結(jié)構(gòu)圖1. 對象與類的定義面向?qū)ο蟮脑O(shè)計是在1972年由Parnas提出的,對象和類是面向?qū)ο笤O(shè)計的基本要素。軟件系統(tǒng)的開發(fā)者創(chuàng)建類來代表系統(tǒng)的每個構(gòu)建。這些通用的類被用來創(chuàng)建程序中所需要的每個對象的特定實例。對象可以通過使用方法互相進行交互。在類的實例沒被創(chuàng)建以前,對象是不存在的,類僅僅是定義。當(dāng)一個對象被具體的創(chuàng)建以后,隨機存儲器將會為該對象分配內(nèi)存空間。一個類可以產(chǎn)生多個對象。在C語言中喲若干原始數(shù)據(jù)類型,如float、
19、int、char等,代表一些特定的數(shù)據(jù)類型。面向?qū)ο笤O(shè)計與面向?qū)ο缶幊蹋∣OD/OOP)將原始的數(shù)據(jù)類型擴展到更高層次的對象。一個對象可以封裝包括原始數(shù)據(jù)類型在內(nèi)的各種數(shù)據(jù)類型。在面向?qū)ο蟮脑O(shè)計與編程的書籍中,有很多對象與類的定義。下面給出常用的對象與類的定義。一個對象是一個具有的狀態(tài)(State,即包含數(shù)據(jù))與行為(Behavior,如C+中的函數(shù)、Java中的方法)的實體。一個對象存儲它的狀態(tài)在域(例如通過Java類中的變量)中,并且通過方法(例如C+函數(shù)或者Java方法)暴露它的行為。方法對其所在對象的內(nèi)部狀態(tài)進行操作,并且是對象之間交流的主要機制。面向?qū)ο笤O(shè)計隱藏對象的內(nèi)部狀態(tài)。并且要
20、求所有對象之間的交互都通過該對象方法,這叫做數(shù)據(jù)封裝,是面向?qū)ο缶幊痰幕驹瓌t。在面向?qū)ο笤O(shè)計與編程中,一個類是一個結(jié)構(gòu)體,使用該結(jié)構(gòu)體可以產(chǎn)生該類的對象。一個類描述了使用該類創(chuàng)建的對象的共有狀態(tài)與行為。一個類的對象也可以被稱為該類的實例。2. 面向?qū)ο笤O(shè)計的特點面相對象設(shè)計具有以下特點。(1) 封裝性(Encapsulation):限制對特定信息的訪問,例如,在Java中的私有屬性。這些數(shù)據(jù)被封裝在對象里面,只有通過該對象的特定方法才能訪問這些數(shù)據(jù)。(2) 繼承性(Inheritance):共享同一個功能定義,例如通過Java類的繼承獲得超類的功能。繼承性是一個對已經(jīng)存在的類的復(fù)用的重要手段
21、。(3) 動態(tài)綁定性(Dynamic Binding):通常在使用一個人層次類的時候,聲明一個超類類型的變量,在程序運行以前,不知道創(chuàng)建哪個類的對象,而只是在運動時才動態(tài)決定要生成的子類的對象和調(diào)用那個操作(方法或函數(shù))。動態(tài)綁定是面向?qū)ο蟪绦蛟O(shè)計的重要特點之一。(4) 復(fù)用與可維護性(Reuse and Maintenance):這是因為采用了封裝與局部化。(5) 對象是對現(xiàn)實世界的抽象并且可以自己管理自己。對象中包含了數(shù)據(jù)與管理這些數(shù)據(jù)的方法。(6) 系統(tǒng)功能通過對象服務(wù)表示:對象的借口提供了一系列的方法,包括方法名、參數(shù)類型。在整個軟件系統(tǒng)中有很多對象,每個對象所提供的方法提供了一些服務(wù)
22、。整各系統(tǒng)的功能通過所有的類提供的方法完成。(7) 共享數(shù)據(jù)區(qū)域被取消:在數(shù)據(jù)共享的主程序-子程序體系結(jié)構(gòu)中,共享數(shù)據(jù)通常是全局變量。而在面向?qū)ο笤O(shè)計中,所有的數(shù)據(jù)都被封裝在各個類之中,因此不存在全局變量。也就是說,沒有共享數(shù)據(jù)存在。(8) 對象可以是分布的:分布的對象通常指的是設(shè)計在一起工作的軟件模板,但是位于被網(wǎng)絡(luò)連接在一起的的多臺計算機中或者在同一臺計算機的不同過程中。一個對象發(fā)送消息給一個遠(yuǎn)程計算機中的另一個對象或者過程,執(zhí)行某一任務(wù)。執(zhí)行結(jié)果可以被傳回到調(diào)用的對象。對象通過函數(shù)或者方法調(diào)用互相交互,如圖6.12即為兩個類交互的示例。Key+open(Lock lk):voidKey+
23、lock(Door d):void圖6.12 兩個類交互的示例為了實現(xiàn)兩個類之間的交互,在應(yīng)用程序中可以按照如下的代碼順序創(chuàng)建鎖對象和鑰匙對象,并且鑰匙對象調(diào)用自己的open方法進行開鎖。3.面向?qū)ο缶幊痰睦^承機制在面向?qū)ο蟮木幊碳夹g(shù)中,繼承是使用已經(jīng)被定義了的類似以便形成新的類的一種法。例如,圖6.13為一個類的繼承的實例。AnimalAquaticAnimalLandAnimaiBirdFamilyMammalsWhaleElephant圖6.13 一個類的繼承的實例新的類(又叫派生類或者子類)繼承其超類的已經(jīng)存在的類的屬性和行為。繼承的主要目的是復(fù)用現(xiàn)有的代碼。子類可以從其超類繼承到屬性
24、與操作。除此之外,子類號可以擁有屬于自己的屬性與操作。注意,在Java語言中,子類不可以直接訪問其超類的private變量,但是可以直接訪問超類的protected和public類型的變量。繼承:提供了一個統(tǒng)一的借口,使得多態(tài)與動態(tài)綁定很容易實現(xiàn)。但是,繼承可能會增加復(fù)雜度。4.面向?qū)ο笤O(shè)計的優(yōu)缺點面向?qū)ο笤O(shè)計具有如下優(yōu)點。(1) 容易維護:因為一個對象將其內(nèi)部表示對客戶程序隱藏起來,所以可以改變其內(nèi)部實現(xiàn)而不影響那些客戶程序。(2) 可復(fù)用性好:對象為適合復(fù)用的構(gòu)建。(3) 映射現(xiàn)實世界:對于許多軟件系統(tǒng)都存在明顯的現(xiàn)實世界的實體到系統(tǒng)的對象。例如,在一個賽馬管理軟件系統(tǒng)中出現(xiàn)的Horse類
25、,封裝了賽馬的名字、顏色、年齡、性別等,就是對賽馬現(xiàn)實世界的模擬。(4) 容易對一個系統(tǒng)進行剖分:面向?qū)ο笤O(shè)計將數(shù)據(jù)與數(shù)據(jù)訪問、操縱方法綁定在一起形成類,由類產(chǎn)生對象。使得軟件設(shè)計者將整個問題剖分為一系列的互相交互的對象集合。例如,在游戲軟件中,每個角色都可以使用一個對象來代表,所以整個系統(tǒng)可以較為容易地剖分成 例如Hero類與Monster類。面向?qū)ο笤O(shè)計具有如下缺點。(1) 面向?qū)ο蟪绦蛘加脙?nèi)存較大。這是因為在程序運行中,每個新被創(chuàng)建的對象都必須占用一塊內(nèi)存,而在面向?qū)ο蟪绦蛑校写罅康膶ο蟊粍?chuàng)建。因此和結(jié)構(gòu)化設(shè)計產(chǎn)生的程序相比較,面向?qū)ο蟪绦蛘加脙?nèi)存更多。(2) 一個對象要和另外一個
26、對象交互,該對象都必須知道另外一個對象的身份,包括對象名、方法名和參數(shù)類型等。6.2 數(shù)據(jù)流風(fēng)格軟件體系結(jié)構(gòu) 使用主程序-子程序與面向?qū)ο蠹軜?gòu)設(shè)計的程序由多個組件構(gòu)成,組件之間通過相互調(diào)用實現(xiàn)系統(tǒng)的整體功能。與上述架構(gòu)不同,本節(jié)要介紹的數(shù)據(jù)流風(fēng)格體系結(jié)構(gòu)中的組件通常是互相獨立的,不存在一個組件調(diào)用另外一個組件的現(xiàn)象。程序的運行有數(shù)據(jù)流控制,這種體系結(jié)構(gòu)被廣泛地應(yīng)用在數(shù)據(jù)處理軟件領(lǐng)域。本節(jié)首先介紹數(shù)據(jù)流系統(tǒng)(Dataflow System)的定義及基本特點,然后介紹兩種典型的數(shù)據(jù)流風(fēng)格體系結(jié)構(gòu),即順序批處理體系結(jié)構(gòu)(Batch Sequential Architecture)和管道-過濾器體系結(jié)
27、構(gòu)(Pipes-and-Filters Architecture)。6.2.1 數(shù)據(jù)流系統(tǒng)與數(shù)據(jù)流風(fēng)格軟件體系結(jié)構(gòu)概述數(shù)據(jù)流系統(tǒng)是一個軟件系統(tǒng),在該系統(tǒng)中,數(shù)據(jù)的可用性控制計算(數(shù)據(jù)處理過程),過程間的數(shù)據(jù)有序流動決定了系統(tǒng)的結(jié)構(gòu)。數(shù)據(jù)的流動方式是明確的。在數(shù)據(jù)流系統(tǒng)中,一般情況下,數(shù)據(jù)可以任意方式流動,這樣的數(shù)據(jù)流系統(tǒng)通常比較復(fù)雜。人們感興趣的往往是相對簡單的數(shù)據(jù)流動方式,如近似線性的數(shù)據(jù)流動方式(如圖6.16所示)以及帶有環(huán)形的流動方式(如圖6.17所示)。圖6.16 數(shù)據(jù)流系統(tǒng)中的近似線性的數(shù)據(jù)流動方式圖6.17 數(shù)據(jù)庫系統(tǒng)中的帶有環(huán)形的數(shù)據(jù)流動方式數(shù)據(jù)流系統(tǒng)的各軟件組件在無數(shù)據(jù)到達(dá)時處
28、于休眠狀態(tài),當(dāng)有數(shù)據(jù)到達(dá)時,該軟件組件被激活,開始對數(shù)據(jù)進行處理。軟件工程師關(guān)心的是程序中控制流的軌跡。數(shù)據(jù)可以伴隨著控制,但是數(shù)據(jù)不處于控制地位,重要的是程序的執(zhí)行順序。在系統(tǒng)設(shè)計中,人們關(guān)注數(shù)據(jù)是怎樣流動的,關(guān)心數(shù)據(jù)的可用性、變幻與延遲。數(shù)據(jù)流風(fēng)格軟件體系結(jié)構(gòu)將整個軟件系統(tǒng)看做由一系列作用在連續(xù)數(shù)據(jù)集合上的“變幻”組成。數(shù)據(jù)和作用于其上的操作是互相獨立的。軟件系統(tǒng)被分解為一些數(shù)據(jù)處理單位或稱為組件,數(shù)據(jù)流控制數(shù)據(jù)處理順序。在純數(shù)據(jù)流系統(tǒng)中,過程間無其他的互動。數(shù)據(jù)流系統(tǒng)架構(gòu)中的組件將其輸入數(shù)據(jù)“變換”為對應(yīng)的輸出數(shù)據(jù)??梢允褂肐/O流、I/O文件、緩沖(Buffer)、管道流,或者其他連接類型來實現(xiàn)子系統(tǒng)組件之
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 心陽不足證近視患者近距離用眼后脈絡(luò)膜厚度變化研究
- 信息技術(shù)產(chǎn)業(yè)園區(qū)廠房租賃及知識產(chǎn)權(quán)保護合同
- 水產(chǎn)養(yǎng)殖場場地租賃合同樣本
- 礦產(chǎn)開采權(quán)抵押擔(dān)保融資協(xié)議樣本
- 資產(chǎn)評估違約催告函模板
- 危險化學(xué)品安全生產(chǎn)責(zé)任書
- 《金融法》(第4版)課后練習(xí)答案
- 2025年廣播電視編導(dǎo)理論知識考試試卷及答案
- 2025年房地產(chǎn)經(jīng)紀(jì)人考試試卷及答案
- 2025年財務(wù)分析與決策支持考試試題及答案
- 2025年全國統(tǒng)一高考數(shù)學(xué)試題全國二卷
- 門窗安裝考試題及答案
- 2025佛山市順德區(qū)輔警考試試卷真題
- 2025屆高三語文最后一課
- 中國數(shù)據(jù)中心產(chǎn)業(yè)發(fā)展白皮書023年
- 創(chuàng)新創(chuàng)業(yè)創(chuàng)造:職場競爭力密鑰智慧樹知到期末考試答案章節(jié)答案2024年上海對外經(jīng)貿(mào)大學(xué)
- 醫(yī)院檢驗科實驗室生物安全程序文件SOP
- 中外古典園林史-南京林業(yè)大學(xué)中國大學(xué)mooc課后章節(jié)答案期末考試題庫2023年
- 小班音樂游戲《會跳舞的跳跳糖》原版有聲動態(tài)PPT課件
- 羽毛球課教學(xué)大綱
- YORK(約克)-多聯(lián)式空調(diào)-安裝、操作和維護手冊
評論
0/150
提交評論