OO开发思想:面向对象的开发方法(Object oriented,OO)
面向對象的開發方法(Object oriented,OO)
????從事軟件開發的工程 師們常常有這樣 的體會:在軟件開發過程中,使用者會不斷地提出各種更改要求,即使在軟件投入使用后,也常常需要對其做出修改,在用結構化開發的程序中,這種修改往往是很 困難的,而且還會因為計劃或考慮不周,不但舊錯誤沒有得到徹底改正,又引入了新的錯誤;另一方面,在過去的程序開發中,代碼的重用率很低,使得程序員的效 率并不高,為提高軟件系統的穩定性、可修改性和可重用性,人們在實踐中逐漸創造出軟件工程的一種新途徑――面向對象方法學。
一、面向對象的方法(OO方法)簡介
?面向對象方法學的出發點和基本原則是盡可能模擬人類習慣的思維方式,使開發軟件的方法與過程盡可能接近人類認識世界、解決問題的方法與過程。由于客觀世界的問題都是由客觀世界中的實體及實體相互間的關系構成的,因此我們把客觀世界中的實體抽象為對象(Object)。持面向對象觀點的程序員認為計算機程序的結構應該與所要解決的問題一致,而不是與某種分析或開發方法保持一致,他們的經驗表明,對任何軟件系統而言,其中最穩定的成分往往是其相應問題論域(problem domain)中的成分。(例如在過去幾百年中復式計帳的原則未做任何實質性的改變,而其使用的工具早已從鵝毛筆變成了計算機。)
????所以,“面向對象”是一種認識客觀世界的世界觀,是從結構組織角度模擬客觀世界的一種方法。一般人們在認識和了解客觀現實世界時,通常運用的一些構造法則:
-
區分對象及其屬性,例如區分臺式計算機和筆記本計算機;
-
區分整體對象及其組成部分,例如區分臺式計算機組成(主機、顯示器等);
-
不同對象類的形成以及區分,例如所有類型的計算機(大、中、小型計算機、服務器、工作站和普通微型計算機等)。
?通俗地講,對象指的是一個獨立的、異步的、并發的實體,它能“知道一些事情” (即存儲數據),“做一些工作”(即封裝服務),并“與其它對象協同工作”(通過交換消息),從而完成系統的所有功能。
?因為所要解決的問題具有特殊性,所以對象是不固定的。一個雇員可以作為一個對象,一家公司也可以作為一個對象,到底應該把什么抽象為對象,由所要解決的問題決定。
?從以上的簡單介紹中我們可以看出,面向對象所帶來的好處是程序的穩定性與可修改性(由于把客觀世界分解成一個一個的對象,并且把數據和操作都封裝在對象的內部)、可復用性(通過面向對象技術,我們不僅可以復用代碼,而且可以復用需求分析、設計、用戶界面等等)。
?面向對象方法具有下述四個要點:
1. 認為客觀世界是由各種對象組成的,任何事物都是對象,復雜的對象可以由比較簡單的對象以某種方式組合而成。按照這種觀點,可以認為整個世界就是一個最復雜 的對象。因此,面向對象的軟件系統是由對象組成的,軟件中的任何元素都是對象,復雜的軟件對象由比較簡單的對象組合而成。
2.把所有對象都劃分成各種對象類(簡稱為類(Class)),每個對象類都定義了一組數據和一組方法,數據用于表示對象的靜態屬性,是對象的狀態信息。因此,每當建立該對象類的一個新實例時,就按照類中對數據的定義為這個新對象生成一組專用的數據,以便描述該對象獨特的屬性值。
?例如,熒光屏上不同位置顯示的半徑不同的幾個圓,雖然都是Circle類的對象,但是,各自都有自己專用的數據,以便記錄各自的圓心位置、半徑等等。
????類中定義的方法,是允許施加于該類對象上的操作,是該類所有對象共享的,并不需要為每個對象都復制操作的代碼。
3.按照子類(或稱為派生類)與父類(或稱為基類)的關系,把若干個對象類組成一個層次結構的系統(也稱為類等級)。
4.對象彼此之間僅能通過傳遞消息互相聯系。
二、OO方法的基本思想
?? 對象:是事物運行方式、處理方法和屬性值的一種抽象表述。它是嚴格信息包和有關信息包的操作描述;它是事物的本質,不會隨周圍環境改變而變化的相對固定的最小的集合。它可用一組屬性和可以執行的一組操作來定義。
??? 例:在計算機屏幕上畫多邊形,每個多邊形是一個用有序頂點的集所定義的對象。
??? 這些頂點的次序決定了它們的連接方式,頂點集定義了一個多邊形對象的狀態,包括它的形狀和它在屏幕上的位置,在多邊形上的操作包括:draw(屏幕顯示)、 move(移動)、 contains(檢查某點是否在多邊形內)。
??? 類:是一組具有相同數據結構和相同操作的對象的集合。
??? 類的定義包括一組數據屬性和在數據上的一組合法的操作。在一個類中,每個對象都是類的實例(instance)。同類的對象具有相同的方法集。
??? 類還具有父類、子類之分。父類高層次的類,表達共性,子類低層次表達個性。子類通過繼承機制獲得父類的屬性和操作。例如:電視機、電話、計算機等都是電子產品,它們具有電子產品的公共特性,當定義電視機類Video,電話類Telephone和計算機類Computer時候,為避免它們公共特性的重復編碼,可將這些電子產品的公共特性部分定義為電子產品類,將Video,Telephone和Computer定義為它的子類,子類繼承了父類的所有屬性和操作,而且子類自己還可擴充定義自己的屬性和操作:如電子產品類具有型號、價格、顏色等屬性,computer則繼承了這些屬性,并擴充自己的屬性:顯示類型、內存大小等屬性。
1.發現對象的途經
(1)古典法
候選的對象和類通常來自下列來源:
有形事物:汽車、氣象數據、壓力傳感器。
角色:父親、教師、醫生、女兵。
事件:降落、中斷、要求。
交互作用:借款、會議、交叉。
候選的對象還可能來自:
結構:“ 是一個”及“ …的部分”關系。
其它系統:與待研制系統有交往的其它系統。
承擔的角色:用戶與待研制系統交往時所承擔的不同角色,如站長、站調、統計員等。
地點:待研制系統中重要的具體地點、辦公處以及場所,如信號樓、技術科、調度室。
組織單位:用戶所屬組織,如生產部、經營部、總務處等。
(2)領域分析法
??? 古典法是集中于問題的有形事物,而領域分析法則集中于問題領域中重要的對象、操作以及關系識別。其任務是在某一問題領域中識別出所有一切應用問題共有的客體和類,例如,銷售、會計、債券交易、編譯程序等都是問題領域。
????領域分析法舉例
??? 例如,需要研制一個郵政銷售(函售)系統,所考慮的函售應用問題如它們的關健對象一時想不出來,可對整個銷售領域進行領域分析,即從現存的零售、批發系統中發現那些一時想不出來的對象,或得到啟發而定出所需對象。
(3)結構化分析法
? 它是利用結構化分析的成果,如DFD(數據流程圖)、實體關系圖、數據字典等,找出和識別對象。
????數據流程圖中的數據存儲、外部實體,有些非系統內部的數據流(它可來自外部的刺激或系統對外界的響應)等均可以作為候選對象。如存戶來銀行存款,即是外部對銀行存款系統的的一個刺激,其數據內容是存戶款;給存戶的月終結算,是系統對外部的響應。?
2.對象具有如下特征
?? 模塊性: 對象是一個獨立存在的實體。從外部可以了解它的功能,其內部細節是“ 隱蔽”的, 不 受外界干擾。對象之間的相互依賴性很小。所以,模塊性體現了抽象和信息的隱蔽。它使得一個復雜的軟件系統可以通過定義一組相對獨立的模塊來實現,這些獨立 模塊彼此之間只需交換那些為了完成系統功能所必須交換的信息。當模塊內部實現發生變化而導致代碼修改時,只要對外接口操作的功能不變,就不會給軟件系統帶 來影響。
??? 繼承和類比性:對象之間屬性關系的共同性,即子模塊繼承了父模塊的屬性;通過類比方法抽象出典型對象的過程為類比。
??? 繼承:是利用已有的定義作為基礎來建立新的定義,而不必重復定義它們。
例如,汽車具有“ 型號”、“ 年代”和“ 引擎”等屬性,其子類吉普車、轎車及卡車都繼承了這些屬性。
??? 動態連接性:各個對象之間統一、方便、動態的消息傳遞機制。它是面向對象語言的共同特性,其含義是將一條發送給一個對象的消息與包含該消息的方法的對象聯接起來,它使得增加新的數據類型不需要改變現有的代碼。
3.以對象為主體的OO方法
? (1)客觀事物都是由對象(object)組成的,對象是在原事物基礎上抽象的結果。任何復雜的事物都可以通過對象的組合構成。
?? (2)對象由屬性(attribute)和方法組成。屬性反映了對象的信息特征,如:特點、值、狀態等等;方法(method)則是用來定義改變屬性狀態的各種操作。
??? 例如:電視機對象的屬性有顏色、音量、亮度、頻道等,其上的操作有調節顏色、調節音量、調節亮度、調節頻道等。
??? 如:圖書館系統中其業務過程和業務實體中,最基本的對象類只有讀者和復本。最基本的業務操作只有借閱和查詢。
? (3)對象之間的聯系主要是通過傳遞消息(message)來實現的,而傳遞的方式是通過消息模式(message pattern)和方法所定義的操作過程來完成的。
??? 例如當用戶請求document的對象打印它自己時,該文檔可發送一消息給對象printer以在打印隊列中請求一位置,而printer則可發送一消息 返回至該文檔以要求對信息加以格式化。消息還可包含解釋一請求的信息。如請求一對象打印其自身的消息可包含打印機名。
? (4)對象可按照其屬性進行歸類(class),類有一定的結構,類上有超類(父類),類下有子類。這種對象或類之間的層次結構是靠繼承關系維系著的。一般父類具有通用性,子類具有特殊性。例如:
圖4-4-1 類、子類、超類關系
segment是一個對象,paragraph和table共享某些性質,則可用更抽象的類text表示;paragraph也是一個類,它雖是segment的父類卻是text的子類,text是類document的子類,text是table的超類(父類)。
??? 又如汽車是轎車、吉普車及卡車的父類,轎車、吉普車及卡車是汽車的子類。父類和子類是相對的。父類之上可有另一父類,而成為其子類。
?? (5)對象是一個被嚴格模塊化的實體,稱為封裝(encapsulation)。這種封裝了的對象滿足軟件工程的一切要求,而且可以直接被面向對象的程序設計語言所接受。
??? 例如,電視機箱將電視內部的顯象管、印刷板、元件和線路都封裝起來了。人們只能通過電視機面板上按鈕改變其屬性(顏色、音量、亮度、頻道、制式等)。
??? 有關對象的概念還有下列相關的一些內容:
-
? 實例(Instance)
????實例就是由某個特定的類所描述的一個具體的對象。類是對具有相同屬性和行為的一組相似的對象的抽象,類在現實世界中并不能真正存在。在地球上并沒有抽象的“中國人”,只有一個個具體的中國人,例如,張三、李四、王五,同樣,誰也沒見過抽象的“圓”。
????實際上類是建立對象時使用的“樣板”,按照這個樣板所建立的一個個具體的對象,就是類的實際例子,通常稱為實例。
-
? 消息(Message)
對 象之間進行通信的一種構造叫做消息,當一個消息發送給某個對象時,包含要求接收對象去執行某些活動的信息。接收到消息的對象經過解釋,然后予以響應。這種 通信機制叫做消息傳遞。發送消息的對象不需要知道接收消息的對象如何對請求予以響應。通常,一個消息由下述三部分組成:
(a)接收消息的對象;
(b)消息選擇符(也稱為消息名);
(c)零個或多個變元。
-
? 方法(Method)
????方法,就是對象所能執行的操作,也就是類中所定義的服務。方法描述了對象執行操作的算法,響應消息的方法。在C++語言中把方法稱為成員函數。
????例如,在錄音機的例子中,為了能讓使用者按下“放音鍵”就開始播放磁帶,必須在錄音機類中給出“按下放音鍵”的定義,也就是給出這個動作的實現方法。
-
? 屬性(Attribute)
????屬性,就是類中所定義的數據,它是對客觀世界實體所具有的性質的抽象。類的每個實例都有自己特有的屬性值。
????例如,在錄音機類中定義的代表錄音機的型號、外觀、電壓等數據就是屬性。
-
? 繼承(Inheritance)
????廣義地說,繼承是指能夠直接獲得已有的性質和特性,而不必重復定義它們。在面向對象的軟件技術中,繼承是子類自動地共享基類(或父類)中定義的數據和方法的機制。一個類直接繼承其父類的全部描述(數據和操作)。
????繼承具有傳遞性,繼承性使得相似的對象可以共享程序代碼和數據結構,從而大大減少了程序中的冗余信息。使得對軟件的修改變得比過去容易得多了。
????繼承性使得用戶在開發新的應用系統時不必完全從零開始,可以繼承原有的相似系統的功能或者從類庫中選取需要的類,再派生出新的類以實現所需要的功能,所以,繼承的機制主要是支持程序的重用和保持接口的一致性。
-
? 多態性(Polymorphism)
????在 面向對象的軟件技術中,多態性是指子類對象可以像父類對象那樣使用,同樣的消息既可以發送給父類對象也可以發送給子類對象。也就是說,在類等級的不同層次 中可以共享(公用)一個行為(方法)的名字,然而不同層次中的每個類卻各自按自己的需要來實現這個行為。當對象接收到發送給它的消息時,根據該對象所屬于 的類動態選用在該類中定義的實現算法。
-
? 重載(Overloading)
????有兩種重載:函數重載是指在同一作用域內的若干個參數特征不同的函數可以使用相同的函數名字;運算符重載是指同一個運算符可以施加于不同類型的操作數上面。當然,當參數特征不同或被操作數的類型不同時,實現函數的算法或運算符的語義是不相同的。
????重載進一步提高了面向對象系統的靈活性和可讀性。
三、OO方法的開發過程
?? OO方法開發過程分為4個階段:
? 1.系統調查和需求分析:對系統面臨的問題和用戶的開發需求進行調查研究。
? 2.分析問題的性質和求解問題:在復雜的問題域中抽象識別出對象及其行為、結構、屬性和方法。這一個階段一般稱為面向對象分析,即OOA。
? 3.整理問題:對分析的結果進一步抽象、歸類整理,最終以范式的形式確定下來,即OOD。
? 4.程序實現:使用面向對象的程序設計語言將其范式直接映射為應用程序軟件,即OOP(它是一個直接映射過程)。
四、OOA方法(面向對象分析)
本節著重討論面向對象分析(Object-Oriented Analysis, OOA)。
面向對象分析與其它分析方法一樣,是提取系統需求的過程。
面向對象分析的關鍵,是識別出問題域內的對象,并分析他們相互間的關系,最終建立起問題域的正確模型。
通 常,面向對象分析過程從分析陳述用戶需求的文件開始。需求陳述的內容包括:問題范圍,功能需求,性能需求,應用環境及假設條件等。總之,需求陳述應該闡明 “做什么”而不是“怎樣做”。它應該描述用戶的需求而不是提出解決問題的方法。在利用面向對象開發方法時,書寫需求陳述要盡力做到語法正確,而且應該慎重 選用名詞、動詞、形容詞和同義詞。
接下來,系統分析員應該深入理解用戶需求,抽象出目標系統的本質屬性,并用模型準確地表示出來。
面向對象分析大體上按照下列順序進行:建立功能模型、建立對象模型、建立動態模型、定義服務。
1.建立功能模型
????功能模型從功能角度描述對象屬性值的變化和相關的函數操作,表明了系統中數據之間的依賴關系以及有關的數據處理功能,它由一組數據流圖組成。其中的處理功能可以用IPO圖、偽碼等多種方式進一步描述。
????建立功能模型首先要畫出頂層數據流圖,然后對頂層圖進行分解,詳細描述系統加工、數據變換等,最后描述圖中各個處理的功能。
2.建立對象模型
????復雜問題(大型系統)的對象模型由下述五個層次組成:主題層(也稱為范疇層)、類-&-對象層、結構層、屬性層和服務層,如圖4-4-2所示。
圖4-4-2 對象模型的層次
??? 這五個層次很像疊在一起的五張透明塑料片,它們一層比一層顯現出對象模型的更多細節。在概念上,這五個層次是整個模型的五張水平切片。
??? 建立對象模型典型的工作步驟是:首先確立對象類和關聯,對于大型復雜的問題還要進一步劃分出若干主題;然后給類和關聯增添屬性,以進一步描述它們;接下來利用適當的繼承關系進一步合并和組織類。
(1)確定類-&-對象
????類-&-對象是在問題域中客觀存在的,系統分析員的主要任務就是通過分析找出這些類-&-對象。首先,找出所有候選的類-&-對象;然后,從候選的類-&-對象中篩選掉不正確的或不必要的項。
步驟1:找出候選的類-&-對象
????對象是對問題域中有意義的事物的抽象,它們既可能是物理實體,也可能是抽象概念,在分析所面臨的問題時,可以參照幾類常見事物,找出在當前問題域中的候選類-&-對象。
????另一種更簡單的分析方法,是所謂的非正式分析。這種分析方法以用自然語言書寫的需求陳述為依據,把陳述中的名高速作為類-&- 對象的候選者,用形容詞作為確定屬性的線索,把動高速作為服務(操作)候選者。當然,用這種簡單方法確定的候選者是非常不準確的,其中往往包含大量不正確 的或不必要的事物,還必須經過更進一步的嚴格篩選。通常,非正式分析是更詳細、更精確的正式的面向對象分析的一個很好的開端。
步驟2:篩選出正確的類-&-對象
????非正式分析僅僅幫助我們找到一些候選的類-&-對象,接下來應該嚴格考察候選對象,從中去掉不正確的或不必要的,僅保留確實應該記錄其信息或需要其提供服務的那些對象。篩選時主要依據下列標準,刪除不正確或不必要的類-&-對象:
<1>冗余(如果兩個類表達了同樣的信息)
<2>無關(僅需要把與本問題密切相關的類-&-對象放進目標系統中)
<3>籠統(需求陳述中籠統的、泛指的名詞)
<4>屬性(在需求陳述中有些名詞實際上描述的是其它對象的屬性)
<5>操作(正確地決定把某些詞作為類還是作為類中定義的操作)
<6>實現(去掉僅和實現有關的候選的類-&-對象)
(2)確定關聯
????兩個或多個對象之間的相互依賴、相互作用的關系就是關聯。分析確定關聯,能促使分析員考慮問題域的邊緣情況,有助于發現那些尚未被發現的類-&-對象。
步驟1.初步確定關聯
????在 需求陳述中使用的描述性動詞或動詞詞組,通常表示關聯關系。因此,在初步確定關聯時,大多數關聯可以通過直接提取需求陳述中的動詞詞組而得出。通過分析需 求陳述,還能發現一些在陳述中隱含的關聯。最后,分析員還應該與用戶及領域專家討論問題域實體間的相互依賴、相互作用關系,根據領域知識再進一步補充一些 關聯。
步驟2.自頂向下
????把現有類細化成更具體的子類,這模擬了人類的演繹思維過程。從應用域中常常能明顯看出應該做的自頂向下的具體化工作。例如,帶有形容詞修飾的名詞詞組往往暗示了一些具體類。但是,在分析階段應該避免過度細化。
(3)定義結構
????結構指的是多種對象的組織方式,用來反映問題空間中的復雜事物和復雜關系。這里的結構包括兩種:分類結構與組裝結構。分類結構針對的是事物的類別之間的組織關系,組織結構則對應著事物的整體與部件之間的組合關系。
????使 用分類結構,可以按事物的類別對問題空間進行層次化的劃分,體現現實世界中事物的一般性與特殊性。例如在交通工具、汽車、飛機、輪船這幾件事物中,具有一 般性的是交通工具,其它則是相對特殊化的。因此可以將汽車、飛機、輪船這幾種事物的共有特征概括在交通工具之中,也就是把對應于這些共有特征的屬性和服務 放在“交通工具”這種對象之中,而其它需要表示的屬性和服務則按其特殊性放在“汽車”、“飛機”、“輪船”這幾種對象之中,在結構上,則按這種一般與特殊 的關系,將這幾種對象劃分在兩個層次中,如圖4-4-3所示:
4-4-3? 分類結構示例
????組織結構表示事物的整體與部件之間的關系。例如把汽車看成一個整體,那么發動機、變速箱、剎車裝置等都是汽車的部件,相對于汽車這個整體就分別是一個局部。
(4)識別主題
????對 一個實際的目標系統,特別是大的系統而言,盡管通過對象和結構的認定對問題空間中的事物進行了抽象和概括,但對象和結構的數目仍然是可觀的,因此如果不對 數目眾多的對象和結構進行進一步的抽象,勢必造成對分析結果理解上的混亂,也難以搞清對象、結構之間的關聯關系,因此引入主題的概念。
主題是一種關于模型的抽象機制,它給出了一個分析模型的概貌。
主 題直觀地來看就是一個名詞或名詞短語,與對象的名字類似,只是抽象的程度不同。識別主題的一般方法是:為每一個結構追加一個主題;為每一種對象追加一個主 題;如果當前的主題的數目超過了7個,就對已有的主題進行歸并,歸并的原則是,當兩個主題對應的屬性和服務有著較密切的關聯時,就將它們歸并成一個主題。
(5)認定屬性
屬性是數據元素,用來描述對象或分類結構的實例。
認定一個屬性有三個基本原則:首先,要確認它對響應對象或分類結構的每一個實例都是適用的;其次,對滿足第一個條件的屬性還要考察其在現實世界中與這種事物的關系是不是足夠密切;第三,認定的屬性應該是一種相對的原子概念,即不依賴于其它并列屬性就可以被理解。
3.建立動態模型
當問題涉及交互作用和時序時(例如用戶界面及過程控制等),建立動態模型則是很重要的。
建立動態模型的第一步,是編寫典型交互行為的腳本。腳本是指系統在某一執行期間內出現的一系列事件。編寫腳本的目的,是保證不遺漏重要的交互步驟,它有助于確保整個交互過程的正確性和清晰性。
第二步從腳本中提取出事件,確定觸發每個事件的動作對象以及接受事件的目標對象。
第三步,排列事件發生的次序,確定每個對象可能有的狀態以及狀態間的轉換關系。
最后,比較各個對象的狀態,檢查它們之間的一致性,確保事件之間的匹配。
4.定義服務
??? 通常在完整地定義每個類中的服務之前,需要先建立起動態模型和功能模型,通過對這兩種模型的研究,能夠更正確更合理地確定每個類應該提供那些服務。
??? 正如前面已經指出的那樣,“對象”是由描述其屬性的數據,及可以對這些數據施加的操作(即服務)封裝在一起構成的獨立單元。因此,為建立完整的動態模型, 既要確定類的屬性,又要定義類的服務。在確定類中應有的服務時,既要考慮類實體的常規行為,又要考慮在本系統中特殊需要的服務。
?首先考慮常規行為:在分析階段可以認為類中定義的每個屬性都是可以訪問的,即假設在每個類中都定義了讀、寫該類每個屬性的操作。
?其次,從動態模型和功能模型中總結出特殊服務。
?最后應該盡量利用繼承機制以減少所需定義的服務數目。
五、OOD方法(面向對象的設計)
????如前所述,分析是提取和整理用戶需求,并建立問題域精確模型的過程。設計則是把分析階段得到的需求轉變成符合成本和質量要求的、抽象的系統實現方案的過程。從面向對象分析到面向對象設計(通常縮寫為OOD),是一個逐漸擴充模型的過程。或者說,面向對象設計就是用面向對象觀點建立求解域模型的過程。
??? 盡 管分析和設計的定義有明顯區別,但是在實際的軟件開發過程中二者的界限是模糊的。許多分析結果可以直接映射成設計結果,而在設計過程中又往往會加深和補充 對系統需求的理解,從而進一步完善分析結果。因此,分析和設計活動是一個多次反復迭代的過程。面向對象方法學在概念和表示方法上的一致性,保證了在各項開 發活動之間的平滑(無縫)過渡,領域專家和開發人員能夠比較容易地跟蹤整個系統開發過程,這是面向對象方法與傳統方法比較起來所具有的一大優勢。
1.面向對象設計的準則
??? 在以前的軟件設計中人們總結出幾條基本原理,這些原理在進行面向對象設計時仍然成立,但是增加了一些與面向對象方法密切相關的新特點,從而具體化為下列的面向對象設計準則:
(1)?模塊化
??? 面向對象軟件開發模式,很自然地支持了把系統分解成模塊的設計原理:對象就是模塊。它是把數據結構和操作這些數據的方法緊密地結合在一起所構成的模塊。
(2)?抽象
??? 抽象表示對規格說明的抽象(abstraction by specification)和參數化抽象(abstraction by parametrization)。
(3)?信息隱藏
??? 在面向對象方法中,信息隱藏通過對象的封裝性實現:類結構分離了接口與實現,從而支持了信息隱藏。對于類的用戶來說,屬性的表示方法和操作的實現算法都應該是隱藏的。
(4)?弱耦合
??? 在面向對象方法中,對象是最基本的模塊,因此,耦合主要指不同對象之間樸素關聯的緊密程度。弱耦合是優秀設計的一個重要標準,因為這有助于使得系統中某一部分的變化對其它部分的影響降到最低程度。
??? 當然,對象不可能是完全孤立的,當兩個對象必須樸素聯系、樸素依賴時,應該通過類的協議(即公共接口)實現耦合,而不應該依賴于類的具體實現細節。
(5)?強內聚
??? 設計中使用的一個構件內的各個元素,對完成一個定義明確的目的所做出的貢獻程度。在設計時應該力求做到高內聚。在面向對象設計中存在下述三種內聚:
??? <1>服務內聚
??? 一個服務應該完成一個且僅完成一個功能。
??? <2>類內聚
??? 一個類應該只有一個用途。
??? <3>一般-特殊內聚
??? 設計出的一般-特殊結構,應該符合多數人的概念。
(6)?可重用
??? 軟件重用是 提高軟件開發生產率和目標系統質量的重要途徑。重用也叫再用或復用,是指同一事物不作修改或稍加改動就多次重復使用。重用是從設計階段開始的。重用有兩方 面的含義:一是盡量使用已有的類(包括開發環境提供的類庫,及以往開發類似系統時創建的類),二是如果確實需要創建新類,則在設計這些新類的協議時,應該 考慮將來的可重復使用性。
??? 軟件成分的重用可以進一步劃分成以下三個級別:
<1>代碼重用
<2>設計結果重用
?設計結果重用指的是,重用某個軟件系統的設計模型(即求解域模型)。這個級別的重用有助于把一個應用系統移植到完全不同的軟/硬平臺上。
<3>分析結果重用
?這是一種更高級別的重用,即重用某個系統的分析模型。這種重用特別適用于用戶需求未改變,但系統體系結構發生根本變化的場合。
?通 過分析軟件重用的效果發現,重用率越高,生產率并不一定就越高。僅當開發人員使用已有軟構件構造系統時,其工作效率比重新從底層編寫程序的效率高時,重用 率的提高才會導致生產率提高。可見,通過軟件重用來提高軟件生產率,并不是一件輕而易舉的事情。軟構件的實用程序和程度,以及軟件開發人員的素質、開發環 境等因素,都直接影響軟件重用的效果。事實上,自20世紀60年代以來,人們就開始研究軟件重用技術,主要目的是大幅度提高軟件生產率,降低軟件成本。但是,多年來始終沒能有效地實現軟件重用,直到面向對象技術崛起之后,才為軟件重用帶來了新的希望。
2.面向對象設計的內容
????采用面向對象方法設計軟件系統時,面向對象設計模型(即求解域的對象模型)與面向對象分析模型(即求問題域的對象模型)一樣,也由主題、類-&- 對象、結構、屬性、服務等五個層次組成。這五個層次表示的細節一層比一層多,我們可以把這五個層次想象為整個模型的水平切片。此外,大多數系統的面向對象 設計模型,在邏輯上都由四大部分組成。這四大部分對應于組成目標系統的四個子系統,它們分別是問題域子系統、人-機交互子系統、任務管理子系統和數據管理 子系統。
(1)設計問題域子系統
?通過面向對象分析所得出的問題域精確模型,為設計問題域子系統奠定了良好的基礎,建立了完整的框架。只要可能,就應該保持面向對象分析所建立的問題域結構。通常,面向對象設計僅需從實現角度對問題域模型作一些補充或修改,主要是增添、合并或分解類-&-對象、屬性及服務,調整繼承關系等等。當問題域子系統過分復雜龐大時,應該把它進一步分解成若干個更小的子系統。
?下面介紹在面向對象設計過程中,可能對面向對象分析所得出的問題域模型的補充或修改:
<1>調整需求
??? 有兩種情況出現需要調整需求:用戶需求或外部環境發生了變化;分析員對問題的理解存在問題。無論哪種情況出現,通常都只需要簡單地修改分析的結果,然后把這些修改的結果反映到問題域子系統中。
<2>重用已有的類
????代碼重用從設計階段開始,在研究面向對象分析結果時就應該尋找使用已有類的方法。若因為沒有合適的類可以重用而確實需要創建新的類,則在設計這些新類的協議時,考慮到將來的可重用性。
<3>把問題域類組合在一起
??? 在面向對象設計過程中,設計者往往通過引入一個根類而把問題域組合在一起,但這是在沒有更先進的組合機制時才采用的一種組合方法。
<4>增添一般化類以建立協議
在設計過程中常常發現,一些具體類需要有一個公共的協議,也就是說,它們都需要定義一組類似的服務(很可能還需要相應的屬性)。在這種情況下可以引入一個附加類(例如,根類)。
<5>調整繼承層次
????如果面向對象分析模型中包含了多重繼承關系,然而所使用的程序設計語言卻并不提供多重繼承機制,則必須修改面向對象分析的結果。即使使用支持多重繼承的語言,有時也會出于實現考慮而對面向對象分析結果作一些調整。
(2)設計人-機交互子系統
??? 在面向對象分析過程中,已經對用戶界面需求作了初步分析,在面向對象設計過程中,則應該對系統的人-機子系統進行詳細設計,以確定人-機交互的細節,其中 包括指定窗口和報表的形式、設計命令層次等項內容。人-機交互部分的設計結果,將對用戶情緒和工作效率產生重要影響。
??? <1> 設計人-機交互界面的準則
一致性
減少步驟
及時提供反饋信息
提供撤消命令
無須記憶
易學
富有吸引力
??? <2>設計人-機交互子系統的策略
-
分類用戶
????為設計好人-機交互子系統,設計者應該認真研究使用它的用戶。設計者首先應該把將來可能與系統交互的分類。通常從下列幾個不同角度進行分類:
按技能水平分類(新手/初級/中級/高級)。 按職務分類(總經理/經理/職員)。 按所屬集團分類(職員/顧客)。-
描述用戶
????應該仔細了解未來使用系統的每類用戶的情況,把獲得的下列各項信息記錄下來:
用戶類型。 使用系統欲達到的目的。 特征(年齡、性別、受教育程度、限制因素等)。 關鍵的成功因素(需求、愛好、習慣等)。 技能水平。 完成本職工作的腳本。-
? 設計命令層次
設計命令層次的工作通常包含以下幾項內容:
研究現有的人-機交互含義和準則現在,Windows已經成了微機上圖形用戶界面事實上的工業標準。
確切初始的命令層次所謂命令層次,實質上是用過程抽象機制組織起來的、可供選用的服務的表示形式。
精化命令層次精化命令層次應考慮以下因素:次序、整體---部分關系、操作步驟。
-
? 設計人-機交互類
人-機交互類與所使用的操作系統及編程語言密切相關。
(3)設計任務管理子系統
雖 然從概念上說,不同對象可以并發地工作。但是,在實際系統中,許多對象之間往往存在相互依賴關系。此外,在實際使用的硬件中,可能僅由一個處理器支持多個 對象。因此,設計工作的一項重點就是,確定哪些是必須同時操作的對象,哪些是相互排斥的對象。然后進一步設計任務管理子系統。
<1> 分析并發性
彼 此間不存在交互,或者它們同時接受事件,則這兩個對象在本質上是并發的。通過檢查各個對象的狀態圖及它們之間交換的事件,能夠把若干個非并發的對象歸并到 一條控制線中。所謂控制線,是一條遍及狀態圖集合的路徑,在這條路徑上每次只有一個對象是活動的。在計算機系統中用任務(task)實現控制線,一般認為任務是進程(process)的別名。通常把多個任務的并發執行稱為多任務。
<2>?設計任務管理子系統
常見的任務有事件驅動型任務、時鐘驅動型任務、優先任務、關鍵任務和協調任務等。設計任務管理子系統,包括確定各類任務并把任務分配給適當的硬件或軟件去執行。
-
確定事件驅動型任務
某些任務是由事件驅動的,這類任務可能主要完成通信工作。例如,設備、屏幕窗口、其它任務、子系統、另一個處理器或其它系統通信。事件通常是表明某些數據到達的信號。
-
確定時鐘驅動任務
某些任務每隔一定時間間隔就被觸發以執行某些處理,例如,某些設備需要周期性地獲得數據;某些人-機接口、子系統、任務、處理器或其它系統也可能需要周期性地通信。在這些場合往往需要使用時鐘驅動型任務。
-
? 確定優先任務
優先任務可以滿足高優先級或低優先級的處理需求。
高優先級:某些服務具有很高的優先級,為了在嚴格限定的時間內完成這種服務,可能需要把這類服務分離成獨立的任務。
低優先級:與高優先級相反,有些服務是低優先級的,屬于低優先級處理(通常指那些背景處理)。設計時可能用額外的任務把這樣的處理分離出來。
-
? 確定關鍵任務
關鍵任務是關系到系統成功或失敗的那些關鍵處理,這類處理通常都有嚴格的可靠性要求。
-
? 確定協調任務
當系統中存在三個以上任務時,就應該增加一個任務,用它作為協調任務。
-
? 確定資源需求
使用多處理器或固件,主要是為了滿足高性能的需求。設計者必須通過計算系統載荷來估算所需要的CPU(或其它固件)的處理能力。
(4)設計數據管理子系統
數據管理子系統是系統存儲或檢索對象的基本設施,它建立在某種數據存儲管理系統之上,并且隔離了數據存儲管理模式。
<1>?選擇數據存儲管理模式
文 件管理系統、關系數據庫管理系統、面向對象數據管理系統三種數據存儲管理模式有不同的特點,適用范圍也不同,其中文件系統用來長期保存數據,具有成本低和 簡單等特點,但文件操作級別低,為提供適當的抽象級別還必須編寫額外的代碼;關系數據庫管理系統提供了各種最基本的數據管理功能,采用標準化的語言,但其 缺點是運行開銷大,數據結構比較簡單;面向對象數據管理系統增加了抽象數據類型和繼承機制,提供了創建及管理類和對象的通用服務。
<2>?設計數據管理子系統
設計數據管理子系統,既需要設計數據格式又需要設計相應的服務。設計數據格式包括用范式規范每個類的屬性表以及由此定義所需的文件或數據庫;設計相應的服務是指設計被存儲的對象如何存儲自己。
六、OOP方法( 面向對象實現)
面向對象實現主要包括兩項工作:把面向對象設計結果翻譯成用某種程序語言書寫的面向對象程序;測試并調試面向對象的程序。
面向對象程序的質量基本上由面向對象設計的質量決定,但是,所采用的程序語言的特點和程序設計風格也將對程序的生成、可重用性及可維護性產生深遠影響。
1.程序設計
(1)面向對象的語言與非面向對象的語言
到底應該選用面向對象語言還是非面向對象語言,關鍵不在于語言功能強弱。選擇編程語言的關鍵因素,是語言的一致的表達能力、可重用性及可維護性。從面向對象觀點看來,能夠更完整、更準確地表達問題和語義的面向對象語言的語法是非常重要的,因為這會帶來下述幾個重要優點:面向對象語言的形成借鑒了歷史上許多程序語言的特點,從中吸取了豐富的營養。當今的面向對象語言,從50年代誕生的LISP語言中引進了動態聯編的概念和交到式開發環境的思想,從60年代推出的SIMULA語言中引進了類的概念和繼承機制,此外,還受到70年代末期開發的Modula-2語言和Ada語言中數據抽象機制的影響。
100年代以來,面向對象語言像雨后春筍一樣大量涌現,形成了兩大類面向對象語言。一類是純面向對象語言,如Smalltalk和Eiffel等語言。另一類是混合型面向對象語言,也就是在過程語言的基礎上增加面向對象機制,如C++等語言。
一般說來,純面向對象語言著重支持面向對象方法研究和快速原型的實現,而混合型面向對象語言的目標則是提高運行速度和使傳統程序員容易接受面向對象思想。成熟的面向語言通常都提供豐富的類庫和強有力的開發環境。
下面介紹在選擇面向對象語言時應該著重考察的一些技術特點。
<1>支持類與對象概念的機制
所有面向對象語言都允許用戶動態創建對象,并且可以用指針引用動態創建的對象。允許動態創建對象,就意味著系統必須處理內存管理問題,如果不及時釋放不再需要的對象所占用的內存,動態存儲分配就有可能耗盡內存。
<2>實現整體--部分結構的機制
一般說來,有兩種實現方法,分別使用指針和獨立的關聯對象實現整體一部分結構。大多數現有的面向對象語言并不顯示支持獨立的關聯對象,在這種情況下,使用指針是最容易的實現方法,通過增加內部指針可以方便地實現關聯。
<3>實現一般--特殊結構的機制
既 包括實現繼承的機制也包括解決名字沖突的機制。所謂解決名字沖突,指的是處理在多個基類中可能出現的重名問題,這個問題僅在支持多重繼承的語言中才會遇 到。某些語言拒絕接受有名字沖突的程序,另一些語言提供了解決沖突的協議。不論使用何種語言,程序員都應該盡力避免出現名字沖突。
<4>實現屬性和服務的機制
對于實現屬性的機制應該著重考慮以下幾個方面:支持實例連接的機制;屬性的可見性控制;對屬性值的約束。對于服務來說,主要應該考慮下列因素:支持消息連接(即表達對象交互關系)的機制;控制服務可見性的機制;動態聯編。
<5>類型檢查
程序設計語言可以按照編譯時進行類型檢查的嚴格程度來分類。如果語言僅要求每個變量或屬性隸屬于一個對象,則是弱類型的;如果語法規定每個變量或屬性必須準確地隸屬于某個特定的類,則這樣的語言是強類型的。
<6>效率
許多人認為面向對象語言的主要缺點是效率低。事實上,如有完整類庫的面向對象語言,有時能比使用非面向對象語言得到運行更快的代碼。這是因為類庫中提供了更高效的算法和更好的數據結構。
<7>持久保存對象
<8>參數化類
所 謂參數化類,就是使用一個或多個類型去參數化一個類型的機制,有了這種機制,程序員就可以先定義一個參數化的類模板(即在類定義中包含以參數形式出現的一 個或多個類型),然后把數據類型作為參數傳遞進來,從而把這個類模板用在不同的應用程序中,或用在同一應用程序的不同部分。Eiffel語言中就有參數化類,C++語言也提供了類模板。
<9>開發環境
軟件工具和軟件工程環境對軟件生產率有很大影響。由于面向對象程序中繼承關系和動態聯編等引入的特殊復雜性,面向對象語言所提供的軟件工具或開發環境就顯得尤其重要了。至少應該包括下列一些最基本的軟件工具:編輯程序,編譯程序或解釋程序,瀏覽工具,調試器(debugger)等。
(2)程序設計風格
良好的程序設計風格對保證程序質量的重要性。良好的程序設計風格對面向對象實現來說尤其重要,不僅能明顯減少維護或擴充的開銷,而且有助于在新項目中重用已有的程序代碼。
良好的面向對象程序設計風格,既包括傳統的程序設計風格和準則,也包括為適應面向對象方法所特有的概念(例如,繼承性)而必須遵循的一些新準則。
<1>提高可重用性
面向對象方法的一個主要目標,就是提高軟件的可重用性。正如本書11.3節所述,軟件重用有多個層次,在編碼階段主要涉及代碼重用問題。一般說來,代碼重用有兩種:一種是本項目內的代碼重用,另一種是新項目重用舊項目的代碼。內部重用主要是找出設計中相同或相似的部分,然后利用繼承機制共享它們。
-
提高方法的內聚
-
減小方法的規模
-
保持方法的一致性
保持方法的一致性,有助于實現代碼重用。一般說來,功能相似的方法應該有一致的名字、參數特征(包括參數個數、類型和次序)、返回值類型、使用條件及出錯條件等。
-
把策略與實現分開
-
全面覆蓋
如果輸入條件的各種組合都可能出現,則應該針對所有組合寫出方法,而不能僅僅針對當前用到的組合情況寫方法。
此外,一個方法不應該只能處理正常值,對空值、極限值及界外值等異常情況也應該能夠作出有意義的響應。
-
盡量不使用全局信息
應該盡量降低方法與外界的耦合程度,不使用全局信息是降低耦合度的一項主要措施。
-
利用繼承機制
在面向對象程序中,繼承機制是實現共享和提高重用程度的主要途徑。
有時提高相似類代碼可重用性的一個有效途徑,是從不同類的相似方法中分解出不同的“因子”(即不同的代碼),把余下的代碼作為分用方法中的公共代碼,把分解出的因子作為名字相同算法不同的方法,放在不同類中定義,并被這個公用方法調用。
??? 程序員往往希望重用其它方法編寫的、解決同一類應用問題的程序代碼。重用這類代碼的一個比較安全的途徑,是把被重用的代碼封裝在類中。
<2>? 提高健壯性
??? 為提高健壯性應遵守以下幾條準則:預防用戶的誤操作,不要預先限制條件,先測試后優化。
2、面向對象測試
一般說來,對面向對象軟件的測試可分為下列四個層次進行:
(1)算法層
測試類中定義的每個方法,基本上相當于傳統軟件測試中的單元測試。
(2)類層
測試封裝在同一個類中的所有方法與屬性之間的相互作用。在面向對象軟件中類是基本模塊,因此可以認為這是面向對象測試中所特有的模塊(單元)測試。
(3)主題層
測試一組協同工作的類-&-對象之間的相互作用。大體上相當于傳統軟件測試中的子系統測試,但是也有面向對象軟件的特點(例如,對象之間通過發送消息相互作用)。
(4)系統層
把各個子系統組裝完整的面向對象軟件系統,在組裝過程中同時進行測試。
設 計測試方案的傳統技術,例如,邏輯覆蓋、等價劃分、邊界值分析和錯誤推測等方法,仍然可以作為測試類中每個方法的主要技術。面向對象測試的主要目標,也是 用盡可能低的測試成本和盡可能少的測試方案,發現盡可能多的錯誤。但是,面向對象程序中特有的封裝、繼承和多態等機制,也給面向對象測試帶來一些新特點, 增加了測試和調試的難度。
七、面向對象的語言(產品) 面向對象的語言應該具備的特征:
??? 1.用對象而非過程(功能或算法)作為程序設計的基本邏輯構件;
??? 2.每個對象屬于應該類(型),并為該類的一個實例;
??? 3.一個類可繼承其它類的性質。面向對象的語言有:??? 1.SmallTalk-76,80,(80年代下半葉)
??? 2.Actor(80年代下半葉)
??? 3.C++,Objective-C (20世紀80年代下半葉)
??? 4.Object Pascal, Object-Oriented Turbo Pascal,Apple ObjectPascal (80年代初開始)
??? 5.Eiffel (80年代上半葉)?
??? 6.Ada9X?
????? 但Microsoft Visual C++, Boland C++等都屬于混合型面向對象的語言,因為它們是在原來的過程語言的基礎上發展起來的,都保留了原來的數據類型,如整數、浮點數、字符以及記錄等。
??? 幾個有代表性的商品軟件
????Microsoft Visual Basic先從軟件的可視化、速成化和組件化開始的,這3化已經開始或正在形成信息與軟件工藝的主流之一。
??? Bland Delphi是組件軟件和復合文書工藝的軟件。它包含面向對象Pascal的編輯程序、查錯程序、可視研制環境和工具、強大的數據庫存取(BDE-Database Engine)工具;它用Object Pascal做情節描述語言。
????Optima++ Developer 是 Sybase/Powersoft出版的可視化、速成化的研制工具。它是采用C++的一種純可視編輯工具,用拖扔編程技術,從一組標準的和可增的控件制模 板中拖出組件,將其扔進應用圖表中去,并編輯其性質。它可在Windows 9X和NT下運行,它不僅是一個GUI(圖形用戶接口)建造程序,而且還是一個C/S(客戶/服務器)數據庫構造工具。
??? IBM的VisualAge(SmallTalk版),用一套圖標來代表應用組件(對象),并提供許多標準函數(例程)、部件,供GUI配置關系數據庫存取、通信、等之用。
????用戶編程時,只需用鼠標把要用的部件(圖標)拖扔到屏幕中的工作面內,按要求設置這些圖標的缺省項和參數值,再把這些圖標用線段連接起來,表示它 們之間的關系和交互操作,并最后加以測試。在組裝過程中,要添加復雜的計算/控件流,可用VisualAge的描述語言(Scripting Language-一種4GL)來編寫。如果這還不行,VisualAge則提供SmallTalk編輯環境,以添加所需的語句。
??? Digitalk(現叫ParcPlace-Digitalk)的Visual Smalltalk提 供組件組裝的可視研制環境和工具,用拖扔手段,可視地把組件組裝成一個軟件(程序),它還能自建新的組件。它最適宜研制軟件雛形的OO程序設計語言。應用 完成之后,使用Digitalk Smalltalk編譯程序編譯,其計算效率據稱可增加25%,GUI效率增加了100%。
????Prograph CPX(跨平臺)將程序面向對象結構的可視化方面做得較突出:
??? -它用圖標代表一個軟件的組成部分,對象、類、組件全部可視化;
??? -全套圖標都用多面體圖標,如類具有“ 方法”面和“ 屬性”面;
??? -能對圖標加以注釋,對象和類關系可用線段表示;
??? -通過工具可方便地將方法加入Tools菜單;
??? -既有解釋程序、又有編譯程序,可解除解釋程序速度慢的問題。
八、OO方法特點和優缺點
1.特點
?? ?(1)利用特定軟件直接從對象客體的描述到軟件結構的轉換。
?? ?(2)解決了傳統結構化方法中客觀世界描述工具與軟件結構的不一致性。
??? (3)減少了從系統分析、設計到軟件模塊結構之間的多次轉換映射的繁雜過程。
2.OO方法優缺點
??? 優點:
?? ? (1)是一種全新的系統分析設計方法(對象、類、結構屬性、方法)。
???? (2)適用于各類信息系統的開發。
???? (3)實現了對客觀世界描述到軟件結構的直接轉換 ,大大減少后續軟件開發量。
???? (4)開發工作的重用性、繼承性高,降低重復工作量。
???? (5)縮短了開發周期。
??? 缺點:
??? (1)需要一定的軟件支持環境。
??? (2)不太適宜大型的MIS開發,若缺乏整體系統設計劃分,易造成系統結構不合理、各部分關系失調等問題。
??? (3)只能在現有業務基礎上進行分類整理,不能從科學管理角度進行理順和優化。
??? (4)初學者不易接受、難學。
????面 向對象方法學把分析、設計和實現很自然地聯系在一起了。雖然面向對象設計原則上不依賴于特定的實現環境,但是實現結果和實現成本卻在很大程度上取決于實現 環境。因此,直接支持面向對象設計范式的面向對象程序語言、開發環境及類庫,對于面向對象實現來說是非常重要的。
為了把面向對象設計結果順利地轉變成面向對象程序,首先應該選擇一種適當的程序設計語言。面向對象的程序設計語言適合用來實現面向對象設計結果。事實上,具有方便的開發環境和豐富的類庫的面向對象程序設計語言,是實現面向對象設計的最佳選擇。
良好的程序設計風格對于面向對象實現來說格外重要。它既包括傳統的程序設計風格準則,也包括與面向對象方法的特點相適應的一些新準則。
面向對象方法學使用獨特的概念和完成軟件開發工作,因此,在測試面向對象程序的時候,除了繼承傳統的測試技術之外,還必須研究與面向對象程序特點相適應的新的測試技術。在這方面需要做的研究工作還很多,目前已逐漸成為國內外軟件工程界研究的一個新的熱門課題。
完畢!!!!!!!!!!!!
總結
以上是生活随笔為你收集整理的OO开发思想:面向对象的开发方法(Object oriented,OO)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实用性强,性价比高的车子有哪些?
- 下一篇: cookies可以跨域了~单点登陆(a.