OO開發思想:面向對象的開發方法(Object oriented,OO)

面向對象的開發方法(Object oriented,OO)認爲是好文章吧,拿來分享一下(轉載)

面向對象的開發方法(Object oriented,OO)git

    從事軟件開發的工程 師們經常有這樣 的體會:在軟件開發過程當中,使用者會不斷地提出各類更改要求,即便在軟件投入使用後,也經常須要對其作出修改,在用結構化開發的程序中,這種修改每每是很 困難的,並且還會由於計劃或考慮不周,不但舊錯誤沒有獲得完全改正,又引入了新的錯誤;另外一方面,在過去的程序開發中,代碼的重用率很低,使得程序員的效 率並不高,爲提升軟件系統的穩定性、可修改性和可重用性,人們在實踐中逐漸創造出軟件工程的一種新途徑――面向對象方法學。程序員

1、面向對象的方法(OO方法)簡介算法

 面向對象方法學的出發點和基本原則是儘量模擬人類習慣的思惟方式,使開發軟件的方法與過程儘量接近人類認識世界、解決問題的方法與過程。因爲客觀世界的問題都是由客觀世界中的實體及實體相互間的關係構成的,所以咱們把客觀世界中的實體抽象爲對象(Object)。持面向對象觀點的程序員認爲計算機程序的結構應該與所要解決的問題一致,而不是與某種分析或開發方法保持一致,他們的經驗代表,對任何軟件系統而言,其中最穩定的成分每每是其相應問題論域(problem domain)中的成分。(例如在過去幾百年中複式計賬的原則未作任何實質性的改變,而其使用的工具早已從鵝毛筆變成了計算機。)數據庫

    因此,「面向對象」是一種認識客觀世界的世界觀,是從結構組織角度模擬客觀世界的一種方法。通常人們在認識和了解客觀現實世界時,一般運用的一些構造法則:編程

  • 區分對象及其屬性,例如區分臺式計算機和筆記本計算機;安全

  • 區分總體對象及其組成部分,例如區分臺式計算機組成(主機、顯示器等);服務器

  • 不一樣對象類的造成以及區分,例如全部類型的計算機(大、中、小型計算機、服務器、工做站和普通微型計算機等)。數據結構

 通俗地講,對象指的是一個獨立的、異步的、併發的實體,它能「知道一些事情」 (即存儲數據),「作一些工做」(即封裝服務),並「與其它對象協同工做」(經過交換消息),從而完成系統的全部功能。併發

 由於所要解決的問題具備特殊性,因此對象是不固定的。一個僱員能夠做爲一個對象,一家公司也能夠做爲一個對象,到底應該把什麼抽象爲對象,由所要解決的問題決定。框架

 從以上的簡單介紹中咱們能夠看出,面向對象所帶來的好處是程序的穩定性與可修改性(因爲把客觀世界分解成一個一個的對象,而且把數據和操做都封裝在對象的內部)、可複用性(經過面向對象技術,咱們不只能夠複用代碼,並且能夠複用需求分析、設計、用戶界面等等)。

 面向對象方法具備下述四個要點:

1. 認爲客觀世界是由各類對象組成的,任何事物都是對象,複雜的對象能夠由比較簡單的對象以某種方式組合而成。按照這種觀點,能夠認爲整個世界就是一個最複雜 的對象。所以,面向對象的軟件系統是由對象組成的,軟件中的任何元素都是對象,複雜的軟件對象由比較簡單的對象組合而成。

2.把全部對象都劃分紅各類對象類(簡稱爲類(Class)),每一個對象類都定義了一組數據和一組方法,數據用於表示對象的靜態屬性,是對象的狀態信息。所以,每當創建該對象類的一個新實例時,就按照類中對數據的定義爲這個新對象生成一組專用的數據,以便描述該對象獨特的屬性值。

 例如,熒光屏上不一樣位置顯示的半徑不一樣的幾個圓,雖然都是Circle類的對象,可是,各自都有本身專用的數據,以便記錄各自的圓心位置、半徑等等。

    類中定義的方法,是容許施加於該類對象上的操做,是該類全部對象共享的,並不須要爲每一個對象都複製操做的代碼。

3.按照子類(或稱爲派生類)與父類(或稱爲基類)的關係,把若干個對象類組成一個層次結構的系統(也稱爲類等級)。

4.對象彼此之間僅能經過傳遞消息互相聯繫。

 

2、OO方法的基本思想

   對象是事物運行方式、處理方法和屬性值的一種抽象表述。它是嚴格信息包和有關信息包的操做描述;它是事物的本質,不會隨周圍環境改變而變化的相對固定的最小的集合。它可用一組屬性和能夠執行的一組操做來定義。

    例:在計算機屏幕上畫多邊形,每一個多邊形是一個用有序頂點的集所定義的對象。

    這些頂點的次序決定了它們的鏈接方式,頂點集定義了一個多邊形對象的狀態,包括它的形狀和它在屏幕上的位置,在多邊形上的操做包括:draw(屏幕顯示)、 move(移動)、 contains(檢查某點是否在多邊形內)。

    類是一組具備相同數據結構和相同操做的對象的集合。

    類的定義包括一組數據屬性和在數據上的一組合法的操做。在一個類中,每一個對象都是類的實例(instance)。同類的對象具備相同的方法集。

 

    類還具備父類、子類之分。父類高層次的類,表達共性,子類低層次表達個性。子類經過繼承機制得到父類的屬性和操做。例如:電視機、電話、計算機等都是電子產品,它們具備電子產品的公共特性,當定義電視機類Video電話類Telephone和計算機類Computer時候,爲避免它們公共特性的重複編碼,可將這些電子產品的公共特性部分定義爲電子產品類,將VideoTelephoneComputer定義爲它的子類,子類繼承了父類的全部屬性和操做,並且子類本身還可擴充定義本身的屬性和操做:如電子產品類具備型號、價格、顏色等屬性,computer則繼承了這些屬性,並擴充本身的屬性:顯示類型、內存大小等屬性。

1.發現對象的途經

(1)古典法
候選的對象和類一般來自下列來源:
有形事物:汽車、氣象數據、壓力傳感器。
角色:父親、教師、醫生、女兵。
事件:降落、中斷、要求。
交互做用:借款、會議、交叉。
候選的對象還可能來自:
結構:「 是一個」及「 …的部分」關係。
其它系統:與待研製系統有交往的其它系統。
承擔的角色:用戶與待研製系統交往時所承擔的不一樣角色,如站長、站調、統計員等。
地點:待研製系統中重要的具體地點、辦公處以及場所,如信號樓、技術科、調度室。
組織單位:用戶所屬組織,如生產部、經營部、總務處等。
(2)領域分析法
    古典法是集中於問題的有形事物,而領域分析法則集中於問題領域中重要的對象、操做以及關係識別。其任務是在某一問題領域中識別出全部一切應用問題共有的客體和類,例如,銷售、會計、債券交易、編譯程序等都是問題領域。
    領域分析法舉例
    例如,須要研製一個郵政銷售(函售)系統,所考慮的函售應用問題如它們的關健對象一時想不出來,可對整個銷售領域進行領域分析,即從現存的零售、批發系統中發現那些一時想不出來的對象,或獲得啓發而定出所需對象。
(3)結構化分析法

  它是利用結構化分析的成果,如DFD(數據流程圖)、實體關係圖、數據字典等,找出和識別對象。
    數據流程圖中的數據存儲、外部實體,有些非系統內部的數據流(它可來自外部的刺激或系統對外界的響應)等都可以做爲候選對象。如存戶來銀行存款,便是外部對銀行存款系統的的一個刺激,其數據內容是存戶款;給存戶的月終結算,是系統對外部的響應。 

2.對象具備以下特徵

   模塊性: 對象是一個獨立存在的實體。從外部能夠了解它的功能,其內部細節是「 隱蔽」的, 不 受外界干擾。對象之間的相互依賴性很小。因此,模塊性體現了抽象和信息的隱蔽。它使得一個複雜的軟件系統能夠經過定義一組相對獨立的模塊來實現,這些獨立 模塊彼此之間只需交換那些爲了完成系統功能所必須交換的信息。當模塊內部實現發生變化而致使代碼修改時,只要對外接口操做的功能不變,就不會給軟件系統帶 來影響。

    繼承和類比性:對象之間屬性關係的共同性,即子模塊繼承了父模塊的屬性;經過類比方法抽象出典型對象的過程爲類比。

    繼承:是利用已有的定義做爲基礎來創建新的定義,而沒必要重複定義它們。
例如,汽車具備「 型號」、「 年代」和「 引擎」等屬性,其子類吉普車、轎車及卡車都繼承了這些屬性。

    動態鏈接性:各個對象之間統1、方便、動態的消息傳遞機制。它是面嚮對象語言的共同特性,其含義是將一條發送給一個對象的消息與包含該消息的方法的對象聯接起來,它使得增長新的數據類型不須要改變現有的代碼。

 

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

    實例就是由某個特定的類所描述的一個具體的對象。類是對具備相同屬性和行爲的一組類似的對象的抽象,類在現實世界中並不能真正存在。在地球上並無抽象的「中國人」,只有一個個具體的中國人,例如,張3、李4、王五,一樣,誰也沒見過抽象的「圓」。

    實際上類是創建對象時使用的「樣板」,按照這個樣板所創建的一個個具體的對象,就是類的實際例子,一般稱爲實例。

  •   消息(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.定義服務

    一般在完整地定義每一個類中的服務以前,須要先創建起動態模型和功能模型,經過對這兩種模型的研究,可以更正確更合理地肯定每一個類應該提供那些服務。

    正如前面已經指出的那樣,「對象」是由描述其屬性的數據,及能夠對這些數據施加的操做(即服務)封裝在一塊兒構成的獨立單元。所以,爲創建完整的動態模型, 既要肯定類的屬性,又要定義類的服務。在肯定類中應有的服務時,既要考慮類實體的常規行爲,又要考慮在本系統中特殊須要的服務。

 首先考慮常規行爲:在分析階段能夠認爲類中定義的每一個屬性都是能夠訪問的,即假設在每一個類中都定義了讀、寫該類每一個屬性的操做。

 其次,從動態模型和功能模型中總結出特殊服務。

 最後應該儘可能利用繼承機制以減小所需定義的服務數目。

 

5、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年代以來,面嚮對象語言像雨後春筍同樣大量涌現,造成了兩大類面嚮對象語言。一類是純面嚮對象語言,如SmalltalkEiffel等語言。另外一類是混合型面嚮對象語言,也就是在過程語言的基礎上增長面向對象機制,如C++等語言。

通常說來,純面嚮對象語言着重支持面向對象方法研究和快速原型的實現,而混合型面嚮對象語言的目標則是提升運行速度和使傳統程序員容易接受面向對象思想。成熟的面向語言一般都提供豐富的類庫和強有力的開發環境。

下面介紹在選擇面嚮對象語言時應該着重考察的一些技術特色。

<1>支持類與對象概念的機制

全部面嚮對象語言都容許用戶動態建立對象,而且能夠用指針引用動態建立的對象。容許動態建立對象,就意味着系統必須處理內存管理問題,若是不及時釋放再也不須要的對象所佔用的內存,動態存儲分配就有可能耗盡內存。

<2>實現總體--部分結構的機制

通常說來,有兩種實現方法,分別使用指針和獨立的關聯對象實現總體一部分結構。大多數現有的面嚮對象語言並不顯示支持獨立的關聯對象,在這種狀況下,使用指針是最容易的實現方法,經過增長內部指針能夠方便地實現關聯。

<3>實現通常--特殊結構的機制

既 包括實現繼承的機制也包括解決名字衝突的機制。所謂解決名字衝突,指的是處理在多個基類中可能出現的重名問題,這個問題僅在支持多重繼承的語言中才會遇 到。某些語言拒絕接受有名字衝突的程序,另外一些語言提供瞭解決衝突的協議。不論使用何種語言,程序員都應該盡力避免出現名字衝突。

<4>實現屬性和服務的機制

對於實現屬性的機制應該着重考慮如下幾個方面:支持實例鏈接的機制;屬性的可見性控制;對屬性值的約束。對於服務來講,主要應該考慮下列因素:支持消息鏈接(即表達對象交互關係)的機制;控制服務可見性的機制;動態聯編。

<5>類型檢查

程序設計語言能夠按照編譯時進行類型檢查的嚴格程度來分類。若是語言僅要求每一個變量或屬性隸屬於一個對象,則是弱類型的;若是語法規定每一個變量或屬性必須準確地隸屬於某個特定的類,則這樣的語言是強類型的。

<6>效率

許多人認爲面嚮對象語言的主要缺點是效率低。事實上,若有完整類庫的面嚮對象語言,有時能比使用非面嚮對象語言獲得運行更快的代碼。這是由於類庫中提供了更高效的算法和更好的數據結構。

<7>持久保存對象

<8>參數化類

所 謂參數化類,就是使用一個或多個類型去參數化一個類型的機制,有了這種機制,程序員就能夠先定義一個參數化的類模板(即在類定義中包含以參數形式出現的一 個或多個類型),而後把數據類型做爲參數傳遞進來,從而把這個類模板用在不一樣的應用程序中,或用在同一應用程序的不一樣部分。Eiffel語言中就有參數化類,C++語言也提供了類模板。

<9>開發環境

軟件工具和軟件工程環境對軟件生產率有很大影響。因爲面向對象程序中繼承關係和動態聯編等引入的特殊複雜性,面嚮對象語言所提供的軟件工具或開發環境就顯得尤爲重要了。至少應該包括下列一些最基本的軟件工具:編輯程序,編譯程序或解釋程序,瀏覽工具,調試器(debugger)等。

 

(2程序設計風格

良好的程序設計風格對保證程序質量的重要性。良好的程序設計風格對面向對象實現來講尤爲重要,不只能明顯減小維護或擴充的開銷,並且有助於在新項目中重用已有的程序代碼。

良好的面向對象程序設計風格,既包括傳統的程序設計風格和準則,也包括爲適應面向對象方法所特有的概念(例如,繼承性)而必須遵循的一些新準則。

<1>提升可重用性

面向對象方法的一個主要目標,就是提升軟件的可重用性。正如本書11.3節所述,軟件重用有多個層次,在編碼階段主要涉及代碼重用問題。通常說來,代碼重用有兩種:一種是本項目內的代碼重用,另外一種是新項目重用舊項目的代碼。內部重用主要是找出設計中相同或類似的部分,而後利用繼承機制共享它們。

  • 提升方法的內聚

  • 減少方法的規模

  • 保持方法的一致性

保持方法的一致性,有助於實現代碼重用。通常說來,功能類似的方法應該有一致的名字、參數特徵(包括參數個數、類型和次序)、返回值類型、使用條件及出錯條件等。

  • 把策略與實現分開

  • 全面覆蓋

若是輸入條件的各類組合均可能出現,則應該針對全部組合寫出方法,而不能僅僅針對當前用到的組合狀況寫方法。

此外,一個方法不該該只能處理正常值,對空值、極限值及界外值等異常狀況也應該可以做出有意義的響應。

  • 儘可能不使用全局信息

應該儘可能下降方法與外界的耦合程度,不使用全局信息是下降耦合度的一項主要措施。

  • 利用繼承機制

在面向對象程序中,繼承機制是實現共享和提升重用程度的主要途徑。

有時提升類似類代碼可重用性的一個有效途徑,是從不一樣類的類似方法中分解出不一樣的「因子」(即不一樣的代碼),把餘下的代碼做爲分用方法中的公共代碼,把分解出的因子做爲名字相同算法不一樣的方法,放在不一樣類中定義,並被這個公用方法調用。

    程序員每每但願重用其它方法編寫的、解決同一類應用問題的程序代碼。重用這類代碼的一個比較安全的途徑,是把被重用的代碼封裝在類中。

<2>  提升健壯性

    爲提升健壯性應遵照如下幾條準則:預防用戶的誤操做,不要預先限制條件,先測試後優化。

二、面向對象測試

通常說來,對面向對象軟件的測試可分爲下列四個層次進行:

(1)算法層

測試類中定義的每一個方法,基本上至關於傳統軟件測試中的單元測試。

(2)類層

測試封裝在同一個類中的全部方法與屬性之間的相互做用。在面向對象軟件中類是基本模塊,所以能夠認爲這是面向對象測試中所特有的模塊(單元)測試。

(3)主題層

測試一組協同工做的類-&-對象之間的相互做用。大致上至關於傳統軟件測試中的子系統測試,可是也有面向對象軟件的特色(例如,對象之間經過發送消息相互做用)。

(4)系統層

把各個子系統組裝完整的面向對象軟件系統,在組裝過程當中同時進行測試。

設 計測試方案的傳統技術,例如,邏輯覆蓋、等價劃分、邊界值分析和錯誤推測等方法,仍然能夠做爲測試類中每一個方法的主要技術。面向對象測試的主要目標,也是 用盡量低的測試成本和儘量少的測試方案,發現儘量多的錯誤。可是,面向對象程序中特有的封裝、繼承和多態等機制,也給面向對象測試帶來一些新特色, 增長了測試和調試的難度。

7、面向對象的語言(產品)
      面向對象的語言應該具有的特徵
    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菜單;
    -既有解釋程序、又有編譯程序,可解除解釋程序速度慢的問題。

8、OO方法特色和優缺點

1.特色

    (1)利用特定軟件直接從對象客體的描述到軟件結構的轉換。

    (2)解決了傳統結構化方法中客觀世界描述工具與軟件結構的不一致性。

    (3)減小了從系統分析、設計到軟件模塊結構之間的屢次轉換映射的繁雜過程。

2.OO方法優缺點

    優勢:

     (1)是一種全新的系統分析設計方法(對象、類、結構屬性、方法)。

     (2)適用於各種信息系統的開發。

     (3)實現了對客觀世界描述到軟件結構的直接轉換 ,大大減小後續軟件開發量。

     (4)開發工做的重用性、繼承性高,下降重複工做量。

     (5)縮短了開發週期。

    缺點:

    (1)須要必定的軟件支持環境。

    (2)不太適宜大型的MIS開發,若缺少總體系統設計劃分,易形成系統結構不合理、各部分關係失調等問題。

    (3)只能在現有業務基礎上進行分類整理,不能從科學管理角度進行理順和優化。

    (4)初學者不易接受、難學。

 

    面 向對象方法學把分析、設計和實現很天然地聯繫在一塊兒了。雖然面向對象設計原則上不依賴於特定的實現環境,可是實現結果和實現成本卻在很大程度上取決於實現 環境。所以,直接支持面向對象設計範式的面向對象程序語言、開發環境及類庫,對於面向對象實現來講是很是重要的。

爲了把面向對象設計結果順利地轉變成面向對象程序,首先應該選擇一種適當的程序設計語言。面向對象的程序設計語言適合用來實現面向對象設計結果。事實上,具備方便的開發環境和豐富的類庫的面向對象程序設計語言,是實現面向對象設計的最佳選擇。

良好的程序設計風格對於面向對象實現來講格外重要。它既包括傳統的程序設計風格準則,也包括與面向對象方法的特色相適應的一些新準則。

面向對象方法學使用獨特的概念和完成軟件開發工做,所以,在測試面向對象程序的時候,除了繼承傳統的測試技術以外,還必須研究與面向對象程序特色相適應的新的測試技術。在這方面須要作的研究工做還不少,目前已逐漸成爲國內外軟件工程界研究的一個新的熱門課題。

完畢!!!!!!!!!!!!

相關文章
相關標籤/搜索