天天看點

面向對象

面向對象是一種新興的程式設計方法,或者說它是一種新的程式設計範型,其基本思想是使用對象,類,繼承,封裝,消息等基本概念來進行程式設計。

它是從現實世界中客觀存在的事物(即對象)出發來構造軟體系統,并在系統構造中盡可能運用人類的自然思維方式,強調直接以問題域(現實世界)中的事物為中心來思考問題,認識問題,并根據這些事物的本質特點,把它們抽象地表示為系統中的對象,作為系統的基本構成機關(而不是用一些與現實世界中的事物相關比較遠,并且沒有對應關系的其它概念來構造系統)。這可以使系統直接地映射問題域,保持問題域中事物及其互相關系的本來面貌。

它可以有不同層次的了解:

從世界觀的角度可以認為:面向對象的基本哲學是認為世界是由各種各樣具有自己的運動規律和内部狀态的對象所組成的;不同對象之間的互相作用和通訊構成了完整的現實世界。是以,人們應當按照現實世界這個本來面貌來了解世界,直接通過對象及其互相關系來反映世界。這樣建立起來的系統才能符合現實世界的本來面目。

從方法學的角度可以認為:面向對象的方法是面向對象的世界觀在開發方法中的直接運用。它強調系統的結構應該直接與現實世界的結構相對應,應該圍繞現實世界中的對象來構造系統,而不是圍繞功能來構造系統。

從程式設計的角度來看,面向對象的程式設計語言必須有描述對象及其互相之間關系的語言成分。這些程式設計語言可以歸納為以下幾類:系統中一切皆為對象;對象是屬性及其操作的封裝體;對象可按其性質劃分為類,對象成為類的執行個體;執行個體關系和繼承關系是對象之間的靜态關系;消息傳遞是對象之間動态聯系的唯一形式,也是計算的唯一形式;方法是消息的序列。

面向對象

面向對象(object oriented,oo)是目前計算機界關心的重點,它是90年代軟體開發方法的主流。面向對象的概念和應用已超越了程式設計和軟體開發,擴充到很寬的範圍。如資料庫系統、互動式界面、應用結構、應用平台、分布式系統、網絡管理結構、cad技術、人工智能等領域。

      談到面向對象,這方面的文章非常多。但是,明确地給出對象的定義或說明對象的定義的非常少——至少我現在還沒有發現。其初,“面向對象”是專指在程式設計中采用封裝、繼承、抽象等設計方法。可是,這個定義顯然不能再适合現在情況。面向對象的思想已經涉及到軟體開發的各個方面。如,面向對象的分析(ooa,object oriented analysis),面向對象的設計(ood,object oriented design)、以及我們經常說的面向對象的程式設計實作(oop,object oriented programming)。許多有關面向對象的文章都隻是講述在面向對象的開發中所需要注意的問題或所采用的比較好的設計方法。看這些文章隻有真正懂得什麼是對象,什麼是面向對象,才能最大程度地對自己有所裨益。這一點,恐怕對初學者甚至是從事相關工作多年的人員也會對它們的概念模糊不清。

      面向對象是目前計算機界關心的重點,它是90年代軟體開發方法的主流。面向對象的概念和應用已超越了程式設計和軟體開發,擴充到很寬的範圍。如資料庫系統、互動式界面、應用結構、應用平台、分布式系統、網絡管理結構、cad技術、人工智能等領域。

一、傳統開發方法存在問題

      1.軟體重用性差

      重用性是指同一事物不經修改或稍加修改就可多次重複使用的性質。軟體重用性是軟體工程追求的目标之一。

      2.軟體可維護性差

      軟體工程強調軟體的可維護性,強調文檔資料的重要性,規定最終的軟體産品應該由完整、一緻的配置成分組成。在軟體開發過程中,始終強調軟體的可讀性、可修改性和可測試性是軟體的重要的品質名額。實踐證明,用傳統方法開發出來的軟體,維護時其費用和成本仍然很高,其原因是可修改性差,維護困難,導緻可維護性差。

      3.開發出的軟體不能滿足使用者需要

      用傳統的結構化方法開發大型軟體系統涉及各種不同領域的知識,在開發需求模糊或需求動态變化的系統時,所開發出的軟體系統往往不能真正滿足使用者的需要。

      用結構化方法開發的軟體,其穩定性、可修改性和可重用性都比較差,這是因為結構化方法的本質是功能分解,從代表目标系統整體功能的單個處理着手,自頂向下不斷把複雜的處理分解為子處理,這樣一層一層的分解下去,直到僅剩下若幹個容易實作的子處理功能為止,然後用相應的工具來描述各個最低層的處理。是以,結構化方法是圍繞實作處理功能的“過程”來構造系統的。然而,使用者需求的變化大部分是針對功能的,是以,這種變化對于基于過程的設計來說是災難性的。用這種方法設計出來的系統結構常常是不穩定的 ,使用者需求的變化往往造成系統結構的較大變化,進而需要花費很大代價才能實作這種變化。

二、面向對象的基本概念

      (1)對象。

      對象是人們要進行研究的任何事物,從最簡單的整數到複雜的飛機等均可看作對象,它不僅能表示具體的事物,還能表示抽象的規則、計劃或事件。

      (2)對象的狀态和行為。

      對象具有狀态,一個對象用資料值來描述它的狀态。

      對象還有操作,用于改變對象的狀态,對象及其操作就是對象的行為。

      對象實作了資料和操作的結合,使資料和操作封裝于對象的統一體中

      (3)類。

      具有相同或相似性質的對象的抽象就是類。是以,對象的抽象是類,類的具體化就是對象,也可以說類的執行個體是對象。

      類具有屬性,它是對象的狀态的抽象,用資料結構來描述類的屬性。

      類具有操作,它是對象的行為的抽象,用操作名和實作該操作的方法來描述。

      (4)類的結構。

      在客觀世界中有若幹類,這些類之間有一定的結構關系。通常有兩種主要的結構關系,即一般--具體結構關系,整體--部分結構關系。

      ①一般——具體結構稱為分類結構,也可以說是“或”關系,或者是“is a”關系。

      ②整體——部分結構稱為組裝結構,它們之間的關系是一種“與”關系,或者是“has a”關系。

      (5)消息和方法。

      對象之間進行通信的結構叫做消息。在對象的操作中,當一個消息發送給某個對象時,消息包含接收對象去執行某種操作的資訊。發送一條消息至少要包括說明接受消息的對象名、發送給該對象的消息名(即對象名、方法名)。一般還要對參數加以說明,參數可以是認識該消息的對象所知道的變量名,或者是所有對象都知道的全局變量名。

      類中操作的實作過程叫做方法,一個方法有方法名、參數、方法體。消息傳遞如圖10-1所示。

面向對象

二、面向對象的特征

      (1)對象唯一性。

      每個對象都有自身唯一的辨別,通過這種辨別,可找到相應的對象。在對象的整個生命期中,它的辨別都不改變,不同的對象不能有相同的辨別。

      (2)分類性。

      分類性是指将具有一緻的資料結構(屬性)和行為(操作)的對象抽象成類。一個類就是這樣一種抽象,它反映了與應用有關的重要性質,而忽略其他一些無關内容。任何類的劃分都是主觀的,但必須與具體的應用有關。

      (3)繼承性。

      繼承性是子類自動共享父類資料結構和方法的機制,這是類之間的一種關系。在定義和實作一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的内容作為自己的内容,并加入若幹新的内容。

      繼承性是面向對象程式設計語言不同于其它語言的最重要的特點,是其他語言所沒有的。

      在類層次中,子類隻繼承一個父類的資料結構和方法,則稱為單重繼承。

      在類層次中,子類繼承了多個父類的資料結構和方法,則稱為多重繼承。

      在軟體開發中,類的繼承性使所建立的軟體具有開放性、可擴充性,這是資訊組織與分類的行之有效的方法,它簡化了對象、類的建立工作量,增加了代碼的可重性。

      采用繼承性,提供了類的規範的等級結構。通過類的繼承關系,使公共的特性能夠共享,提高了軟體的重用性。

      (4)多态性(多形性)

      多态性使指相同的操作或函數、過程可作用于多種類型的對象上并獲得不同的結果。不同的對象,收到同一消息可以産生不同的結果,這種現象稱為多态性。

      多态性允許每個對象以适合自身的方式去響應共同的消息。

      多态性增強了軟體的靈活性和重用性。

三、面向對象的要素

      (1)抽象。

      抽象是指強調實體的本質、内在的屬性。在系統開發中,抽象指的是在決定如何實作對象之前的對象的意義和行為。使用抽象可以盡可能避免過早考慮一些細節。

      類實作了對象的資料(即狀态)和行為的抽象。

      (2)封裝性(資訊隐藏)。

      封裝性是保證軟體部件具有優良的子產品性的基礎。

      面向對象的類是封裝良好的子產品,類定義将其說明(使用者可見的外部接口)與實作(使用者不可見的内部實作)顯式地分開,其内部實作按其具體定義的作用域提供保護。

      對象是封裝的最基本機關。封裝防止了程式互相依賴性而帶來的變動影響。面向對象的封裝比傳統語言的封裝更為清晰、更為有力。

      (3)共享性

      面向對象技術在不同級别上促進了共享

      同一類中的共享。同一類中的對象有着相同資料結構。這些對象之間是結構、行為特征的共享關系。

      在同一應用中共享。在同一應用的類層次結構中,存在繼承關系的各相似子類中,存在資料結構和行為的繼承,使各相似子類共享共同的結構和行為。使用繼承來實作代碼的共享,這也是面向對象的主要優點之一。

      在不同應用中共享。面向對象不僅允許在同一應用中共享資訊,而且為未來目标的可重用設計準備了條件。通過類庫這種機制和結構來實作不同應用中的資訊共享。

      4.強調對象結構而不是程式結構

四、面向對象的開發方法

      目前,面向對象開發方法的研究已日趨成熟,國際上已有不少面向對象産品出現。面向對象開發方法有coad方法、booch方法和omt方法等。

      1.booch方法

      booch最先描述了面向對象的軟體開發方法的基礎問題,指出面向對象開發是一種根本不同于傳統的功能分解的設計方法。面向對象的軟體分解更接近人對客觀事務的了解,而功能分解隻通過問題空間的轉換來獲得。

      2.coad方法

      coad方法是1989年coad和yourdon提出的面向對象開發方法。該方法的主要優點是通過多年來大系統開發的經驗與面向對象概念的有機結合,在對象、結構、屬性和操作的認定方面,提出了一套系統的原則。該方法完成了從需求角度進一步進行類和類層次結構的認定。盡管coad方法沒有引入類和類層次結構的術語,但事實上已經在分類結構、屬性、操作、消息關聯等概念中展現了類和類層次結構的特征。

      3.omt方法

      omt方法是1991年由james rumbaugh等5人提出來的,其經典著作為“面向對象的模組化與設計”。

      該方法是一種新興的面向對象的開發方法,開發工作的基礎是對真實世界的對象模組化,然後圍繞這些對象使用分析模型來進行獨立于語言的設計,面向對象的模組化和設計促進了對需求的了解,有利于開發得更清晰、更容易維護的軟體系統。該方法為大多數應用領域的軟體開發提供了一種實際的、高效的保證,努力尋求一種問題求解的實際方法。

      4.uml(unified modeling language)語言

      軟體工程領域在1995年~1997年取得了前所未有的進展,其成果超過軟體工程領域過去15年的成就總和,其中最重要的成果之一就是統一模組化語言(uml)的出現。uml将是面向對象技術領域内占主導地位的标準模組化語言。

uml不僅統一了booch方法、omt方法、oose方法的表示方法,而且對其作了進一步的發展,最終統一為大衆接受的标準模組化語言。uml是一種定義良好、易于表達、功能強大且普遍适用的模組化語言。它融入了軟體工程領域的新思想、新方法和新技術。它的作用域不限于支援面向對象的分析與設計,還支援從需求分析開始的軟體開發全過程。

五、面向對象的模型

 ·對象模型

      對象模型表示了靜态的、結構化的系統資料性質,描述了系統的靜态結構,它是從客觀世界實體的對象關系角度來描述,表現了對象的互相關系。該模型主要關心系統中對象的結構、屬性和操作,它是分析階段三個模型的核心,是其他兩個模型的架構。

      1.對象和類

      (1) 對象。

      對象模組化的目的就是描述對象。

面向對象

      (2) 類。

      通過将對象抽象成類,我們可以使問題抽象化,抽象增強了模型的歸納能力。

面向對象

      (3) 屬性。

      屬性指的是類中對象所具有的性質(資料值)。

      (4) 操作和方法。

      操作是類中對象所使用的一種功能或變換。類中的各對象可以共享操作,每個操作都有一個目标對象作為其隐含參數。

  方法是類的操作的實作步驟。

      2.關聯和鍊

      關聯是建立類之間關系的一種手段,而鍊則是建立對象之間關系的一種手段。

      (1) 關聯和鍊的含義。

      連結清單示對象間的實體與概念聯結,關聯表示類之間的一種關系,鍊是關聯的執行個體,關聯是鍊的抽象。

面向對象
面向對象

      (2) 角色。

      角色說明類在關聯中的作用,它位于關聯的端點。

面向對象

      (3) 受限關聯。

      受限關聯由兩個類及一個限定詞組成,限定詞是一種特定的屬性,用來有效的減少關聯的重數,限定詞在關聯的終端對象集中說明。

      限定提高了語義的精确性,增強了查詢能力,在現實世界中,常常出現限定詞。

面向對象

      (4) 關聯的多重性。

      關聯的多重性是指類中有多少個對象與關聯的類的一個對象相關。重數常描述為“一”或“多”。

      圖10-8表示了各種關聯的重數。小實心圓表示“多個”,從零到多。小空心圓表示零或一。沒有符号表示的是一對一關聯。

面向對象

      3.類的層次結構

      (1) 聚集關系。

      聚集是一種“整體-部分”關系。在這種關系中,有整體類和部分類之分。聚集最重要的性質是傳遞性,也具有逆對稱性。

面向對象

      聚集可以有不同層次,可以把不同分類聚集起來得到一顆簡單的聚集樹,聚集樹是一種簡單表示,比畫很多線來将部分類聯系起來簡單得多,對象模型應該容易地反映各級層次,圖10-10表示一個關于微機的多極聚集。

面向對象

       (2)一般化關系。

      一般化關系是在保留對象差異的同時共享對象相似性的一種高度抽象方式。它是“一般---具體”的關系。一般化類稱為你類,具體類又能稱為子類,各子類繼承了交類的性質,而各子類的一些共同性質和操作又歸納到你類中。是以,一般化關系和繼承是同時存在的。一般化關系的符号表示是在類關聯的連線上加一個小三角形,如圖10-11

面向對象

      4.對象模型

      (1)模闆。模闆是類、關聯、一般化結構的邏輯組成。

      (2)對象模型。

      對象模型是由一個或若幹個模闆組成。模闆将模型分為若幹個便于管理的子塊,在整個對象模型和類及關聯的構造塊之間,模闆提供了一種內建的中間單元,模闆中的類名及關聯名是唯一的。

·動态模型

      動态模型是與時間和變化有關的系統性質。該模型描述了系統的控制結構,它表示了瞬間的、行為化的系統控制

性質,它關心的是系統的控制,操作的執行順序,它表示從對象的事件和狀态的角度出發,表現了對象的互相行為。

該模型描述的系統屬性是觸發事件、事件序列、狀态、事件與狀态的組織。使用狀态圖作為描述工具。它涉及到事件、狀态、操作等重要概念。

       1.事件

      事件是指定時刻發生的某件事。

面向對象

       2.狀态

       狀态是對象屬性值的抽象。對象的屬性值按照影響對象顯著行為的性質将其歸并到一個狀态中去。狀态指明了對象

對輸入事件的響應。

      3.狀态圖

      狀态圖是一個标準的計算機概念,他是有限自動機的圖形表示,這裡把狀态圖作為建立動态模型的圖形工具。

      狀态圖反映了狀态與事件的關系。當接收一事件時,下一狀态就取決于目前狀态和所接收的該事件,由該事件引起的狀态變化稱為轉換。

      狀态圖是一種圖,用結點表示狀态,結點用圓圈表示;圓圈内有狀态名,用箭頭連線表示狀态的轉換,上面标記事件名,箭頭方向表示轉換的方向。

面向對象

·功能模型

      功能模型描述了系統的所有計算。功能模型指出發生了什麼,動态模型确定什麼時候發生,而對象模型确定發生的客體。功能模型表明一個計算如何從輸入值得到輸出值,它不考慮計算的次序。功能模型由多張資料流圖組成。資料流圖用來表示從源對象到目标對象的資料值的流向,它不包含控制資訊,控制資訊在動态模型中表示,同時資料流圖也不表示對象中值的組織,值的組織在對象模型中表示。圖10-15給出了一個視窗系統的圖示顯示的資料流圖。

面向對象

       資料流圖中包含有處理、資料流、動作對象和資料存儲對象。

      1.處理

       資料流圖中的處理用來改變資料值。最低層處理是純粹的函數,一張完整的資料流圖是一個高層處理。

面向對象

       2.資料流

       資料流圖中的資料流将對象的輸出與處理、處理與對象的輸入、處理與處理聯系起來。在一個計算機中,用資料流來表示一中間資料值,資料流不能改變資料值。

      3.動作對象

       動作對象是一種主動對象,它通過生成或者使用資料值來驅動資料流圖。

      4.資料存儲對象

      資料流圖中的資料存儲是被動對象,它用來存儲資料。它與動作對象不一樣,資料存儲本身不産生任何操作,它隻響應存儲和通路的要求。

六、面向對象的分析

      面向對象分析的目的是對客觀世界的系統進行模組化。本節以上面介紹的模型概念為基礎,結合“銀行網絡系統”的具體執行個體來構造客觀世界問題的準确、嚴密的分析模型。

      分析模型有三種用途:用來明确問題需求;為使用者和開發人員提供明确需求;為使用者和開發人員提供一個協商的基礎,作為後繼的設計和實作的架構。

(一) 面向對象的分析

面向對象

     系統分析的第一步是:陳述需求。分析者必須同使用者一塊工作來提煉需求,因為這樣才表示了使用者的真實意圖,其中涉及對需求的分析及查找丢失的資訊。下面以“銀行網絡系統”為例,用面向對象方法進行開發。

銀行網絡系統問題陳述: 設計支援銀行網絡的軟體,銀行網絡包括人工出納站和分行共享的自動出納機。每個分理處用分理處計算機來儲存各自的帳戶,處理各自的事務;各自分理處的出納站與分理處計算機通信,出納站錄入帳戶和事務資料;自動出納機與分行計算機通信,分行計算機與撥款分理處結帳,自動出納機與使用者接口接受現金卡,與分行計算機通信完成事務,發放現金,列印收據;系統需要記錄保管和安全措施;系統必須正确處理同一帳戶的并發通路;每個分處理為自己的計算機準備軟體,銀行網絡費用根據顧客和現金卡的數目分攤給各分理處。

圖10-18給出銀行網絡系統的示意圖。

面向對象

(二)建立對象模型

      首先辨別和關聯,因為它們影響了整體結構和解決問題的方法,其次是增加屬性,進一步描述類和關聯的基本網絡,使用繼承合并群組織類,最後操作增加到類中去作為構造動态模型和功能模型的副産品。

      1.确定類

      構造對象模型的第一步是标出來自問題域的相關的對象類,對象包括實體實體和概念。所有類在應用中都必須有意義,在問題陳述中,并非所有類都是明顯給出的。有些是隐含在問題域或一般知識中的。

按圖10-19所示的過程确定類

面向對象

查找問題陳述中的所有名詞,産生如下的暫定類。

 軟體            銀行網絡         出納員        自動出納機           分行

 分處理          分處理計算機     帳戶          事務                 出納站

 事務資料        分行計算機       現金卡        使用者                 現金

 收據            系統             顧客          費用                 帳戶資料

 通路            安全措施         記錄保管

     根據下列标準,去掉不必要的類和不正确的類。

 (1) 備援類:若兩個類表述了同一個資訊 ,保留最富有描述能力的類。如"使用者"和"顧客"就是重複的描述,因為"顧客"最富有描述性,是以保留它。

 (2) 不相幹的類:除掉與問題沒有關系或根本無關的類。例如,攤派費用超出了銀行網絡的範圍。

 (3) 模糊類:類必須是确定的,有些暫定類邊界定義模糊或範圍太廣,如"記錄保管"就模糊類,它是"事務"中的一部分。

 (4) 屬性:某些名詞描述的是其他對象的屬性,則從暫定類中删除。如果某一性質的獨立性很重要,就應該把他歸屬到類,而不把它作為屬性。

 (5) 操作:如果問題陳述中的名詞有動作含義,則描述的操作就不是類。但是具有自身性質而且需要獨立存在的操作應該描述成類。如我們隻構造電話模型,"撥号"就是動态模型的一部分而不是類,但在電話撥号系統中,"撥号"是一個重要的類,它日期、時間、受話地點等屬性。

      在銀行網絡系統中,模糊類是"系統"、"安全措施"、"記錄保管"、"銀行網絡"等。屬于屬性的有:"帳戶資料"、"收據"、"現金"、"事務資料"。屬于實作的如:"通路"、"軟體"等。這些均應除去。

   2.準備資料字典

   為所有模組化實體準備一個資料字典。準确描述各個類的精确含義,描述目前問題中的類的範圍,包括對類的成員、用法方面的假設或限制。

   3.确定關聯

   兩個或多個類之間的互相依賴就是關聯。一種依賴表示一種關聯,可用各種方式來實作關聯,但在分析模型中應删除實作的考慮,以便設計時更為靈活。關聯常用描述性動詞或動詞詞組來表示,其中有實體位置的表示、傳導的動作、通信、所有者關系、條件的滿足等。從問題陳述中抽取所有可能的關聯表述,把它們記下來,但不要過早去細化這些表述。

  下面是銀行網絡系統中所有可能的關聯,大多數是直接抽取問題中的動詞詞組而得到的。在陳述中,有些動詞詞組表述的關聯是不明顯的。最後,還有一些關聯與客觀世界或人的假設有關,必須同使用者一起核實這種關聯,因為這種關聯在問題陳述中找不到。

   銀行網絡問題陳述中的關聯:

 ·銀行網絡包括出納站和自動出納機;

 ·分行共享自動出納機;

 ·分理處提供分理處計算機;

 ·分理處計算機儲存帳戶;

 ·分理處計算機處理帳戶支付事務;

 ·分理處擁有出納站;

 ·出納站與分理處計算機通信;

 ·出納員為帳戶錄入事務;

 ·自動出納機接受現金卡;

 ·自動出納機與使用者接口;

 ·自動出納機發放現金;

 ·自動出納機列印收據;

 ·系統處理并發通路;

 ·分理處提供軟體;

 ·費用分攤給分理處。

  隐含的動詞詞組:

 ·分行由分理處組成;

 ·分理處擁有帳戶;

 ·分行擁有分行計算機;

 ·系統提供記錄保管;

 ·系統提供安全;

 ·顧客有現金卡。

  基于問題域知識的關聯:

 ·分理處雇傭出納員;

 ·現金卡通路帳戶。

  使用下列标準去掉不必要和不正确的關聯:

 (1) 若某個類已被删除,那麼與它有關的關聯也必須删除或者用其它類來重新表述。在例中,我們删除了"銀行網絡",相關的關聯也要删除。

 (2) 不相幹的關聯或實作階段的關聯:删除所有問題域之外的關聯或涉及實作結構中的關聯。如"系統處理并發通路"就是一種實作的概念。

 (3) 動作:關聯應該描述應用域的結構性質而不是瞬時事件,是以應删除"自動出納機接受現金卡","自動出納機與使用者接口"等。

 (4) 派生關聯:省略那些可以用其他關聯來定義的關聯。因為這種關聯是備援的。銀行網絡系統的初步對象圖如圖10-20所示。其中含有關聯。

面向對象

     4.确定屬性

   屬性是個體對象的性質,屬性通常用修飾性的名詞詞組來表示.形容詞常常表示具體的可枚舉的屬性值,屬性不可能在問題陳述中完全表述出來,必須借助于應用域的知識及對客觀世界的知識才可以找到它們。隻考慮與具體應用直接相關的屬性,不要考慮那些超出問題範圍的屬性。首先找出重要屬性,避免那些隻用于實作的屬性,要為各個屬性取有意義的名字。按下列标準删除不必要的和不正确的屬性:

 (1) 對象:若實體的獨立存在比它的值重要,那麼這個實體不是屬性而是對象。如在郵政目錄中,"城市"是一個屬性,然而在人口普查中,"城市"則被看作是對象。在具體應用中,具有自身性質的實體一定是對象。

 (2) 定詞:若屬性值取決于某種具體上下文,則可考慮把該屬性重新表述為一個限定詞。

 (3) 名稱:名稱常常作為限定詞而不是對象的屬性,當名稱不依賴于上下文關系時,名稱即為一個對象屬性,尤其是它不惟一時。

 (4) 辨別符:在考慮對象模糊性時,引入對象辨別符表示,在對象模型中不列出這些對象辨別符,它是隐含在對象模型中,隻列出存在于應用域的屬性。

 (5) 内部值:若屬性描述了對外不透明的對象的内部狀态,則應從對象模型中删除該屬性。

 (6) 細化:忽略那些不可能對大多數操作有影響的屬性。

  5.使用繼承來細化類

   使用繼承來共享公共機構,以次來組織類,可以用兩種方式來進行。

 (1) 自底向上通過把現有類的共同性質一般化為父類,尋找具有相似的屬性,關系或操作的類來發現繼承。例如"遠端事務"和"出納事務"是類似的,可以一般化為"事務"。有些一般化結構常常是基于客觀世界邊界的現有分類,隻要可能,盡量使用現有概念。對稱性常有助于發現某些丢失的類。

 (2) 自頂向下将現有的類細化為更具體的子類。具體化常常可以從應用域中明顯看出來。應用域中各枚舉字情況是最常見的具體化的來源。例如:菜單,可以有固定菜單,頂部菜單,彈出菜單,下拉菜單等,這就可以把菜單類具體細化為各種具體菜單的子類。當同一關聯名出現多次且意義也相同時,應盡量具體化為相關聯的類,例如"事務"從"出納站"和"自動出納機"進入,則"錄入站"就是"出納站"和"自動出納站"的一般化。在類層次中,可以為具體的類配置設定屬性和關聯。各屬性和都應配置設定給最一般的适合的類,有時也加上一些修正。

      應用域中各枚舉情況是最常見的具體化的來源。

   6.完善對象模型

   對象模組化不可能一次就能保證模型是完全正确的,軟體開發的整個過程就是一個不斷完善的過程。模型的不同組成部分多半是在不同的階段完成的,如果發現模型的缺陷,就必須傳回到前期階段去修改,有些細化工作是在動态模型和功能模型完成之後才開始進行的。

  (1) 幾種可能丢失對象的情況及解決辦法:

 ·同一類中存在毫無關系的屬性和操作,則分解這個類,使各部分互相關聯;

 ·一般化體系不清楚,則可能分離扮演兩種角色的類

 ·存在無目标類的操作,則找出并加上失去目标的類;

 ·存在名稱及目的相同的備援關聯,則通過一般化建立丢失的父類,把關聯組織在一起。

  (2) 查找多餘的類。

  類中缺少屬性,操作和關聯,則可删除這個類。

  (3)查找丢失的關聯。

   丢失了操作的通路路徑,則加入新的關聯以回答查詢。

  (4) 網絡系統的具體情況作如下的修改:

 ①現金卡有多個獨立的特性。把它分解為兩個對象:卡片權限和現金卡。

 a.卡片權限:它是銀行用來鑒别使用者通路權限的卡片,表示一個或多個使用者帳戶的通路權限;各個卡片權限對象中可能具有好幾個現金卡,每張都帶有安全碼,卡片碼,它們附在現金卡上,表現銀行的卡片權限。

 b.現金卡:它是自動出納機得到表示碼的資料卡片,它也是銀行代碼和現金卡代碼的資料載體。

 ②"事務"不能展現對帳戶之間的傳輸描述的一般性,因它隻涉及一個帳戶,一般來說,在每個帳戶中,一個"事務"包括一個或多個"更新",一個"更新"是對帳戶的一個動作,它們是取款,存款,查詢之一。一個"更新"中所有"更新"應該是一個原子操作。

 ③"分理處"和"分離處理機"之間,"分行"和"分行處理機"之間的差別似乎并不影響分析,計算機的通信處理實際上是實作的概念,将"分理處計算機"并入到"分理處",将"分行計算機"并入到"分行"。

面向對象

(三)建立動态模型

   1.準備腳本

   動态分析從尋找事件開始,然後确定各對象的可能事件順序。在分析階段不考慮算法的執行,算法是實作模型的一部分。

   2.确定事件

   确定所有外部事件。事件包括所有來自或發往使用者的資訊、外部裝置的信号、輸入、轉換和動作,可以發現正常事件,但不能遺漏條件和異常事件。

   3.準備事件跟蹤表

   把腳本表示成一個事件跟蹤表,即不同對象之間的事件排序表,對象為表中的列,給每個對象配置設定一個獨立的列。

面向對象
面向對象

   4.構造狀态圖

   對各對象類建立狀态圖,反映對象接收和發送的事件,每個事件跟蹤都對應于狀态圖中一條路徑。

面向對象

(四)建立功能模組化

   功能模型用來說明值是如何計算的,表明值之間的依賴關系及相關的功能,資料流圖有助于表示功能依賴關系,其中的處理應于狀态圖的活動和動作,其中的資料流對應于對象圖中的對象或屬性。

   1.确定輸入值、輸出值

   先列出輸入、輸出值,輸入、輸出值是系統與外界之間的事件的參數。

   2.建立資料流圖

   資料流圖說明輸出值是怎樣從輸入值得來的,資料流圖通常按層次組織。

面向對象
面向對象
面向對象

(五)确定操作

   在建立對象模型時,确定了類、關聯、結構和屬性,還沒有确定操作。隻有建立了動态模型和功能模型之後,才可能最後确定類的操作。

七、面向對象的設計

   面向對象設計是把分析階段得到的需求轉變成符合成本和品質要求的、抽象的系統實作方案的過程。從面向對象分析到面向對象設計,是一個逐漸擴充模型的過程。

   瀑布模型把設計進一步劃分成概要設計和詳細設計兩個階段,類似地,也可以把面向對象設計再細分為系統設計和對象設計。系統設計确定實作系統的政策和目标系統的高層結構。對象設計确定解空間中的類、關聯、接口形式及實作操作的算法。

(一)面向對象設計的準則

   1.子產品化

   面向對象開發方法很自然地支援了把系統分解成子產品的設計原則:對象就是子產品。它是把資料結構和操作這些資料的方法緊密地結合在一起所構成的子產品。

   2.抽象

   面向對象方法不僅支援過程抽象,而且支援資料抽象。

   3.資訊隐藏

   在面向對象方法中,資訊隐藏通過對象的封裝性來實作。

   4.低耦合

   在面向對象方法中,對象是最基本的子產品,是以,耦合主要指不同對象之間互相關聯的緊密程度。低耦合是設計的一個重要标準,因為這有助于使得系統中某一部分的變化對其它部分的影響降到最低程度。

   5.高内聚

   (1)操作内聚。

   (2)類内聚。

   (3)一般——具體内聚。

(二)面向對象設計的啟發規則

   1.設計結果應該清晰易懂

   使設計結果清晰、易懂、易讀是提高軟體可維護性和可重用性的重要措施。顯然,人們不會重用那些他們不了解的設計。

   要做到:

   (1)用詞一緻。

   (2)使用已有的協定。

   (3)減少消息模式的數量。

   (4)避免模糊的定義。

   2.一般——具體結構的深度應适當

   3.設計簡單類

   應該盡量設計小而簡單的類,這樣便以開發和管理。為了保持簡單,應注意以下幾點:

   (1)避免包含過多的屬性。

   (2)有明确的定義。

   (3)盡量簡化對象之間的合作關系。

   (4)不要提供太多的操作。

   4.使用簡單的協定

   一般來說,消息中參數不要超過3個。

   5.使用簡單的操作

   面向對象設計出來的類中的操作通常都很小,一般隻有3至5行源程式語句,可以用僅含一個動詞和一個賓語的簡單句子描述它的功能

   6.把設計變動減至最小

   通常,設計的品質越高,設計結果保持不變的時間也越長。即使出現必須修改設計的情況,也應該使修改的範圍盡可能小。

(三)系統設計

   系統設計是問題求解及建立解答的進階政策。必須制定解決問題的基本方法,系統的高層結構形式包括子系統的分解、它的固有并發性、子系統配置設定給硬軟體、資料存儲管理、資源協調、軟體控制實作、人機互動接口。

1.系統設計概述

    設計階段先從高層入手,然後細化。系統設計要決定整個結構及風格,這種結構為後面設計階段的更詳細政策的設計提供了基礎。

   (1)系統分解。

   系統中主要的組成部分稱為子系統,子系統既不是一個對象也不是一個功能,而是類、關聯、操作、事件和限制的集合。

   (2)确定并發性。

   分析模型、現實世界及硬體中不少對象均是并發的。

   (3)處理器及任務配置設定。

   各并發子系統必須配置設定給單個硬體單元,要麼是一個一般的處理器,要麼是一個具體的功能單元。

   (4)資料存儲管理。

   系統中的内部資料和外部資料的存儲管理是一項重要的任務。通常各資料存儲可以将資料結構、檔案、資料庫組合在一起,不同資料存儲要在費用、通路時間、容量及可靠性之間做出折衷考慮。

   (5)全局資源的處理。

   必須确定全局資源,并且制定通路全局資源的政策。

   (6)選擇軟體控制機制。

   分析模型中所有互動行為都表示為對象之間的事件。系統設計必須從多種方法中選擇某種方法來實作軟體的控制。

   (7)人機互動接口設計。

   設計中的大部分工作都與穩定的狀态行為有關,但必須考慮使用者使用系統的互動接口。

   2.系統結構的一般架構

   3.系統分解——建立系統的體系結構

   可用的軟體庫以及程式員的程式設計經驗。

   通過面向對象分析得到的問題域精确模型,為設計體系結構奠定了良好的基礎,建立了完整的架構。

   4.選擇軟體控制機制

   軟體系統中存在兩種控制流,外部控制流和内部控制流。

   5.資料存儲管理

   資料存儲管理是系統存儲或檢索對象的基本設施,它建立在某種資料存儲管理系統之上,并且隔離了資料存儲管理模式的影響。

   6.設計人機互動接口

   在面向對象分析過程中,已經對使用者界面需求作了初步分析,在面向對象設計過程中,則應該對系統的人機互動接口進行詳細設計,以确定人機互動的細節,其中包括指定視窗和報表的形式、設計指令層次等項内容。

(四)對象設計

   1.對象設計概述

   2.三種模型的結合

   (1)獲得操作。

   (2)确定操作的目标對象。

   3.算法設計

   4.優化設計

   5.控制的實作

   6.調整繼承

   7.關聯的設計

八、面向對象的實作

(一)程式設計語言

   1.選擇面向對象語言

   采用面向對象方法開發軟體的基本目的和主要優點是通過重用提高軟體的生産率。是以,應該優先選用能夠最完善、最準确地表達問題域語義的面向對象語言。

   在選擇程式設計語言時,應該考慮的其他因素還有:對使用者學習面向對象分析、設計和編碼技術所能提供的教育訓練操作;在使用這個面向對象語言期間能提供的技術支援;能提供給開發人員使用的開發工具、開發平台,對機器性能和記憶體的需求,內建已有軟體的容易程度。

   2.程式設計風格

   (1)提高重用性。

   (2)提高可擴充性。

   (3)提高健壯性。

(二)類的實作

   在開發過程中,類的實作是核心問題。在用面向對象風格所寫的系統中,所有的資料都被封裝在類的執行個體中。而整個程式則被封裝在一個更進階的類中。在使用既存部件的面向對象系統中,可以隻花費少量時間和工作量來實作軟體。隻要增加類的執行個體,開發少量的新類和實作各個對象之間互相通信的操作,就能建立需要的軟體。

   一種方案是先開發一個比較小、比較簡單的來,作為開發比較大、比較複雜的類的基礎。

   (1)“原封不動”重用。

   (2)進化性重用。

   一個能夠完全符合要求特性的類可能并不存在。

   (3)“廢棄性”開發。

   不用任何重用來開發一個新類。

   (4)錯誤處理。

   一個類應是自主的,有責任定位和報告錯誤。

(三)應用系統的實作

   應用系統的實作是在所有的類都被實作之後的事。實作一個系統是一個比用過程性方法更簡單、更簡短的過程。有些執行個體将在其他類的初始化過程中使用。而其餘的則必須用某種主過程顯式地加以說明,或者當作系統最高層的類的表示的一部分。

   在c++和c中有一個main( )函數,可以使用這個過程來說明構成系統主要對象的那些類的執行個體。

(四)面向對象測試

   (1)算法層。

   (2)類層。

   測試封裝在同一個類中的所有方法和屬性之間的互相作用。

   (3)模闆層。

   測試一組協同工作的類之間的互相作用。

   (4)系統層。

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

九、面向對象和基于對象的差別

      很多人沒有區分“面向對象”和“基于對象”兩個不同的概念。面向對象的三大特點(封裝,繼承,多态)卻一不可。通常“基于對象”是使用對象,但是無法利用現有的對象模闆産生新的對象類型,繼而産生新的對象,也就是說“基于對象”沒有繼承的特點。而“多态”表示為父類類型的子類對象執行個體,沒有了繼承的概念也就無從談論“多态”。現在的很多流行技術都是基于對象的,它們使用一些封裝好的對象,調用對象的方法,設定對象的屬性。但是它們無法讓程式員派生新對象類型。他們隻能使用現有對象的方法和屬性。是以當你判斷一個新的技術是否是面向對象的時候,通常可以使用後兩個特性來加以判斷。“面向對象”和“基于對象”都實作了“封裝”的概念,但是面向對象實作了“繼承和多态”,而“基于對象”沒有實作這些,的确很饒口。

      從事面向對象程式設計的人按照分工來說,可以分為“類庫的建立者”和“類庫的使用者”。使用類庫的人并不都是具備了面向對象思想的人,通常知道如何繼承和派生新對象就可以使用類庫了,然而我們的思維并沒有真正的轉過來,使用類庫隻是在形式上是面向對象,而實質上隻是庫函數的一種擴充。

      面向對象是一種思想,是我們考慮事情的方法,通常表現為我們是将問題的解決按照過程方式來解決呢,還是将問題抽象為一個對象來解決它。很多情況下,我們會不知不覺的按照過程方式來解決它,而不是考慮将要解決問題抽象為對象去解決它。有些人打着面向對象的幌子,幹着過程程式設計的勾當。