OOA和OOD的闡述

  OOA(object   oriented   analysis)面向對象分析  
  OOD(object   oriented   design)面向對象設計  
  如所熟知,面向對象作爲一種程序設計技術最早於60年代後期提出,用於simula的應用程序開發。到了70年代,面向對象成爲smalltalk語言的一個重要特徵。當時,面向對象技術主要用於程序設計。進入90年代,人們的注意力逐漸從程序設計轉向系統分析和設計,用對象的觀點來認識現實世界、設計問題的可行解,隨之也就出現了許多OOA和OOD方法。但這些方法還不很成熟,在OOA與OOD的邊界劃分上也存在着爭議。如:有人認爲面向對象軟件開發過程可以分爲面向對象分析、面向對象設計和麪向對象程序設計三個階段;有人認爲分析和設計可以交叉進行不必做嚴格區分;還有人沿用傳統方法進行分析和設計,用面向對象程序設計語言來實現系統。OOA/OOD的一些較有代表性的工作有gray.booch的ooad方法,coad&yourdon的ooa和ood方法,shlaer&mellor的ooa方法,rumbaugh的ooad方法等。不同的方法體系都分別體現了人們對ooa、ood,以及面向對象軟件開發過程的不同認識。本文的主要目的就是,試圖通過對現有ooa與ood方法的共性進行縱觀分析,弄清二者之間的邊界問題,評析從ooa到ood過渡的難易,並討論實現這種過渡所涉及的主要工作。  
  ooa:分析階段所做的主要工作是理解問題和需求構模,將現實世界中的問題映射到問題域。在該階段,要明確用戶提出了哪些功能要求,爲完成這些要求,系統應有哪些構件,採用什麼樣的結構,並寫出詳細的需求規約。ooa中引入了許多面向對象的概念和原則,如,對象、屬性、服務、繼承、封裝等,並利用這些概念和原則來分析、認識和理解客觀世界,將客觀世界中的實體抽象爲問題域中的對象,即問題對象,分析客觀世界中問題的結構,明確爲完成系統功能,對象間應具有的聯繫和相互作用。因此,下述問題是ooa階段必須回答的:  
  1)爲完成用戶要求系統應提供哪些功能?  
  2)系統應有哪些對象構成?  
  3)每個對象應有哪些屬性和服務?  
  4)對象間應有怎樣的聯繫?
  要回答這些問題,就需要從靜態和動態兩方面來認識、分析現實世界對象。具體地說,要進行:  
  1)個體特徵分析:標識對象及其屬性和服務。有的方法在標識特徵時對屬性的要求可能弱一些,這是因爲對象是屬性和操作的封裝體,對象的訪問可以通過接口--操作來實現。這樣在標識對象時對象的內部特徵可暫不考慮,僅考察外部行爲。每種分析方法在完成這些工作時各具特色,如:coad&yourdon方法只給出了一些標識對象及其特徵的一般原則和思路;r .abbott認爲,可以通過分析非形式化英語的問題描述,將名詞標識爲對象,將形容詞標識爲屬性,將動詞標識爲服務;bailin等人則採用結構化與面向對象技術相結合的方法。  
  2)靜態分析:分析和描述系統的靜態結構。一般地,對象系統中的類或對象之間存在着兩種關係:一般—特殊關係和整體—部分關係。其中,前者更具普遍性,它的一種重要實現形式就是繼承機制,也是面向對象程序設計語言所支持的語言設施。同樣,大多ooa方法也都爲繼承提供了相應的表示方法。因此,系統靜態分析主要是分析、識別對象或類間的一般—特殊結構,並添加一些必要的類,構造繼承關係。  
  3)動態分析:分析對象及之間的行爲及其控制關係,建立系統的動態模型。多數分析方法要求進行這方面的工作,有的則將它放到設計階段去完成,這主要是由ooa、ood階段劃分的不同所造成的。動態模型一般由一組狀態轉換圖構成,從這組狀態轉換圖可以映射到對象模型。系統的動態模型從對象行爲的角度刻劃了系統功能,方便了從ooa到ood的過渡。有的方法雖未提供動態模型,但也提供了表示對象行爲的類似方法。早期的ooa方法對建立系統動態模型認識不足,這主要是因爲當時的許多方法是受數據模型的啓發而產生的。現在越來越多的人認識到了系統動態分析工作的重要性,並在分析方法中引入了相應概念。除此之外,許多ooa方法還引入了問題複雜性控制機制。如,coad&yourdon在其方法中引入了主題的概念;wirfs&brock在其方法中引入了子系統的概念。問題複雜性控制機制主要針對大型複雜系統,它將一組對象或類抽象成新的系統構件,以達到簡化問題空間的目的。這樣,分析和設計人員就可以從宏觀與微觀、整體與局部等不同角度來分析問題,便於透徹地認識和理解問題。  
   ood方法:分析階段主要是明確用戶的功能需求,及滿足用戶所需的系統部件及其結構。設計階段則主要是確定實現用戶需求的方法,即怎樣做才能滿足用戶需求,並構造出系統的實現藍圖。面向對象設計也是如此,只不過是引入了一些面向對象的概念和原則,用以指導設計工作。ood首先從ooa的結果開始,並將其從問題域映射到實現域;爲滿足實現的需要,還要增加一些類、結構及屬性和服務,並對原有類及屬性進行調整。此外,還要完成應用控制、人機交互界面的設計等。在現有方法中,coad等人的ood就是比較全面的設計方法。
  ood的主要工作有:
   問題域部分的設計問題域部分的設計是任何ood方法都必須完成的工作,它主要是對ooa結果進行改進和精化,並將其由問題域轉化到解域,具體來說,有以下幾個方面:
  屬性:有些屬性在分析階段有助於問題的理解,而到了設計階段則可以由其他屬性導出或根本沒必要保留。因此,應將它們去掉。相反地,爲了實現服務算法還需要增加相應的一些屬性。
  服務:ooa只給出了服務的接口,其具體實現算法要在ood階段完成。
  類及對象:在ooa階段有助於問題理解的一些類在ood階段成爲冗餘,需要刪除,而爲了優化調整繼承關係還要增加一些類。所有的類都確定以後還要明確哪些類的對象會引發哪些類創建新對象。
  結構:對類間結構進行優化調整。 
  對象行爲:明確對象間消息傳遞的實現算法,依據動態模型確定對象間消息發送的先後順序,並設計相應算法,協調對象的行爲。
  2 人機交互與應用控制部分的設計有些設計方法並沒有提到交互界面的設計,一方面是因爲這些系統中交互界面不十分重要;另一方面是因爲這部分的設計很有規律,設計方法也比較成熟,但爲完整起見,仍將其列出。主要工作包括:.  
  交互界面子系統的設計:與界面有關的類及類間結構的設計,以及有關算法的設計。
  交互界面子系統和應用之間接口的設計。
  應用控制部分的設計:這部分對象主要完成應用的驅動工作。這部分對象不同於從現實世界中抽象出來的對象,在現實世界和問題域中沒有原型,它們同界面子系統中的對象及問題對象發生作用,控制系統的運行。  
   
  ooa與ood的區別  
  上討論了ooa階段和ood階段所應完成的主要工作,由於這兩個階段的劃分沒有公認的標準,有些工作是在ooa階段完成還是在ood階段完成還存在着爭議。有人認爲ooa和ood可以交叉進行;有人認爲ood是對ooa結果的改進和細化,所以只提ooa;有人則更強調ood。儘管ooa和ood存在着某些交叉和聯繫,但它們之間仍有許多差別,如:
  1)ooa將現實世界中的實體抽象爲問題對象,並構造問題域中的系統需求模型;ood將問題對象轉化爲解域中的類並在解域中構造出問題的解。 
  2)ooa側重於用戶需求的分析和對問題域的理解,分析人員關心的是系統結構及對象間的關係;ood則側重於系統的實現,設計人員關心的是對象的行爲及其實現。  
  3)ooa標識了一組對象,並通過其相互作用來刻劃系統,該階段的工作與程序設計語言無關;ood定義了一組類,並設計出系統的實現藍圖,概要設計與程序設計語言無關,但詳細設計則與之有比較密切的聯繫。
  4)ooa識別的對象是對客觀世界實體的抽象,標識對象的準則是:該對象的引入是否有助於對問題域的理解;ood中構造類的準則是:該類的構造是否可行,是否有效地實現了抽象數據類型,是否有助於系統的實現和提高軟件質量。
  5)兩個階段都沒有提及系統對象,但原因不同。在ooa階段,分析與實現無關,分析所涉及的範圍與解域無關,系統對象自然不用考慮。ood建立的對象模型本身就是要設計的軟件系統,對系統對象的考慮是隱含的。  
  6)組裝結構和分類結構在兩個階段所起的作用不同。在ooa階段,它們的引入主要是爲了理解問題;而在ood階段,它們的引入則主要是針對軟件的構造和實現。分類結構通過繼承機制來實現,因而代碼得到了有效地複用;組裝結構則將一些類組合在一起構成較大的軟件構件。  
  7)ooa並沒有考慮對象的產生問題,當其對應的實體在現實世界中出現時,它也就在問題域中產生了。ooa也不考慮對象屬性的取值和服務算法的實現。而在ood階段這些問題都必須詳細考慮。  
  8)ood涉及到重載問題;而ooa沒有考慮,因爲考慮過多的實現細節對理解問題和分析用戶需求沒有多大幫助。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章