設計模式李建忠(面向對象程序設計部分)

面向對象 

面向對象(Object Oriented,OO)是當前計算機界關心的重點,它是90年代軟件開發方法的主流。面向對象的概念和應用已超越了程序設計和軟件開發,擴展到很寬的範圍。如數據庫系統、交互式界面、應用結構、應用平臺、分佈式系統、網絡管理結構、CAD技術、人工智能等領域。       談到面向對象,這方面的文章很是多。可是,明確地給出對象的定義或說明對象的定義的很是少——至少我如今尚未發現。其初,「面向對象」是專指在程序設計中採用封裝、繼承、抽象等設計方法。但是,這個定義顯然不能再適合如今狀況。面向對象的思想已經涉及到軟件開發的各個方面。如,面向對象的分析(OOA,Object Oriented Analysis),面向對象的設計(OOD,Object Oriented Design)、以及咱們常常說的面向對象的編程實現(OOP,Object Oriented Programming)。許多有關面向對象的文章都只是講述在面向對象的開發中所須要注意的問題或所採用的比較好的設計方法。看這些文章只有真正懂得什麼是對象,什麼是面向對象,才能最大程度地對本身有所裨益。這一點,恐怕對初學者甚至是從事相關工做多年的人員也會對它們的概念模糊不清。 html

      面向對象是當前計算機界關心的重點,它是90年代軟件開發方法的主流。面向對象的概念和應用已超越了程序設計和軟件開發,擴展到很寬的範圍。如數據庫系統、交互式界面、應用結構、應用平臺、分佈式系統、網絡管理結構、CAD技術、人工智能等領域。程序員

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

      1.軟件重用性差
      重用性是指同一事物不經修改或稍加修改就可屢次重複使用的性質。軟件重用性是軟件工程追求的目標之一。算法

      2.軟件可維護性差
      軟件工程強調軟件的可維護性,強調文檔資料的重要性,規定最終的軟件產品應該由完整、一致的配置成分組成。在軟件開發過程當中,始終強調軟件的可讀性、可修改性和可測試性是軟件的重要的質量指標。實踐證實,用傳統方法開發出來的軟件,維護時其費用和成本仍然很高,其緣由是可修改性差,維護困難,致使可維護性差。數據庫

      3.開發出的軟件不能知足用戶須要
      用傳統的結構化開發大型軟件系統涉及各類不一樣領域的知識,在開發需求模糊或需求動態變化的系統時,所開發出的軟件系統每每不能真正知足用戶的須要。編程

      用結構化方法開發的軟件,其穩定性、可修改性和可重用性都比較差,這是由於結構化方法的本質是功能分解,從表明目標系統總體功能的單個處理着手,自頂向下不斷把複雜的處理分解爲子處理,這樣一層一層的分解下去,直到僅剩下若干個容易實現的子處理功能爲止,而後用相應的工具來描述各個最低層的處理。所以,結構化方法是圍繞實現處理功能的「過程」來構造系統的。然而,用戶需求的變化大部分是針對功能的,所以,這種變化對於基於過程的設計來講是災難性的。用這種方法設計出來的系統結構經常是不穩定的 ,用戶需求的變化每每形成系統結構的較大變化,從而須要花費很大代價才能實現這種變化。安全

2、面向對象的基本概念

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

      (2)對象的狀態和行爲。
      對象具備狀態,一個對象用數據值來描述它的狀態。
      對象還有操做,用於改變對象的狀態,對象及其操做就是對象的行爲。
      對象實現了數據和操做的結合,使數據和操做封裝於對象的統一體中數據結構

      (3)類。
      具備相同或類似性質的對象的抽象就是類。所以,對象的抽象是類,類的具體化就是對象,也能夠說類的實例是對象。
      類具備屬性,它是對象的狀態的抽象,用數據結構來描述類的屬性。
      類具備操做,它是對象的行爲的抽象,用操做名和實現該操做的方法來描述。併發

      (4)類的結構。
      在客觀世界中有若干類,這些類之間有必定的結構關係。一般有兩種主要的結構關係,即通常--具體結構關係,總體--部分結構關係。框架

      ①通常——具體結構稱爲分類結構,也能夠說是「或」關係,或者是「is a」關係。
      ②總體——部分結構稱爲組裝結構,它們之間的關係是一種「與」關係,或者是「has a」關係。

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

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

             

2、面向對象的特徵

      (1)對象惟一性。
      每一個對象都有自身惟一的標識,經過這種標識,可找到相應的對象。在對象的整個生命期中,它的標識都不改變,不一樣的對象不能有相同的標識。

      (2)分類性。
      分類性是指將具備一致的數據結構(屬性)和行爲(操做)的對象抽象成類。一個類就是這樣一種抽象,它反映了與應用有關的重要性質,而忽略其餘一些無關內容。任何類的劃分都是主觀的,但必須與具體的應用有關。

      (3)繼承性。
      繼承性是子類自動共享父類數據結構和方法的機制,這是類之間的一種關係。在定義和實現一個類的時候,能夠在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容做爲本身的內容,並加入若干新的內容。

      繼承性是面向對象程序設計語言不一樣於其它語言的最重要的特色,是其餘語言所沒有的。

      在類層次中,子類只繼承一個父類的數據結構和方法,則稱爲單重繼承。
      在類層次中,子類繼承了多個父類的數據結構和方法,則稱爲多重繼承。
      在軟件開發中,類的繼承性使所創建的軟件具備開放性、可擴充性,這是信息組織與分類的行之有效的方法,它簡化了對象、類的建立工做量,增長了代碼的可重性。
      採用繼承性,提供了類的規範的等級結構。經過類的繼承關係,使公共的特性可以共享,提升了軟件的重用性。

      (4)多態性(多形性)
      多態性使指相同的操做或函數、過程可做用於多種類型的對象上並得到不一樣的結果。不一樣的對象,收到同一消息能夠產生不一樣的結果,這種現象稱爲多態性。
      多態性容許每一個對象以適合自身的方式去響應共同的消息。
      多態性加強了軟件的靈活性和重用性。

3、面向對象的要素

      (1)抽象。 
      抽象是指強調實體的本質、內在的屬性。在系統開發中,抽象指的是在決定如何實現對象以前的對象的意義和行爲。使用抽象能夠儘量避免過早考慮一些細節。

      類實現了對象的數據(即狀態)和行爲的抽象。
 
      (2)封裝性(信息隱藏)。
      封裝性是保證軟件部件具備優良的模塊性的基礎。
      面向對象的類是封裝良好的模塊,類定義將其說明(用戶可見的外部接口)與實現(用戶不可見的內部實現)顯式地分開,其內部實現按其具體定義的做用域提供保護。
      對象是封裝的最基本單位。封裝防止了程序相互依賴性而帶來的變更影響。面向對象的封裝比傳統語言的封裝更爲清晰、更爲有力。

      (3)共享性
      面向對象技術在不一樣級別上促進了共享
      同一類中的共享。同一類中的對象有着相同數據結構。這些對象之間是結構、行爲特徵的共享關係。
      在同一應用中共享。在同一應用的類層次結構中,存在繼承關係的各類似子類中,存在數據結構和行爲的繼承,使各類似子類共享共同的結構和行爲。使用繼承來實現代碼的共享,這也是面向對象的主要優勢之一。
      在不一樣應用中共享。面向對象不只容許在同一應用中共享信息,並且爲將來目標的可重用設計準備了條件。經過類庫這種機制和結構來實現不一樣應用中的信息共享。

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

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是一種定義良好、易於表達、功能強大且廣泛適用的建模語言。它融入了軟件工程領域的新思想、新方法和新技術。它的做用域不限於支持面向對象的分析與設計,還支持從需求分析開始的軟件開發全過程。

5、面向對象的模型

 ·對象模型

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

      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.數據存儲對象
      數據流圖中的數據存儲是被動對象,它用來存儲數據。它與動做對象不同,數據存儲自己不產生任何操做,它只響應存儲和訪問的要求。 

6、面向對象的分析

      面向對象分析的目的是對客觀世界的系統進行建模。本節以上面介紹的模型概念爲基礎,結合「銀行網絡系統」的具體實例來構造客觀世界問題的準確、嚴密的分析模型。
      分析模型有三種用途:用來明確問題需求;爲用戶和開發人員提供明確需求;爲用戶和開發人員提供一個協商的基礎,做爲後繼的設計和實現的框架。

(一) 面向對象的分析

             

     系統分析的第一步是:陳述需求。分析者必須同用戶一塊工做來提煉需求,由於這樣才表示了用戶的真實意圖,其中涉及對需求的分析及查找丟失的信息。下面以「銀行網絡系統」爲例,用面向對象方法進行開發。
銀行網絡系統問題陳述:設計支持銀行網絡的軟件,銀行網絡包括人工出納站和分行共享的自動出納機。每一個分理處用分理處計算機來保存各自的賬戶,處理各自的事務;各自分理處的出納站與分理處計算機通訊,出納站錄入賬戶和事務數據;自動出納機與分行計算機通訊,分行計算機與撥款分理處結賬,自動出納機與用戶接口接受現金卡,與分行計算機通訊完成事務,發放現金,打印收據;系統須要記錄保管和安全措施;系統必須正確處理同一賬戶的併發訪問;每一個分處理爲本身的計算機準備軟件,銀行網絡費用根據顧客和現金卡的數目分攤給各分理處。
圖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.創建數據流圖
   數據流圖說明輸出值是怎樣從輸入值得來的,數據流圖一般按層次組織。

           

            

 

(五)肯定操做

   在創建對象模型時,肯定了類、關聯、結構和屬性,尚未肯定操做。只有創建了動態模型和功能模型以後,纔可能最後肯定類的操做。 

7、面向對象的設計

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

   瀑布模型把設計進一步劃分紅概要設計和詳細設計兩個階段,相似地,也能夠把面向對象設計再細分爲系統設計和對象設計。系統設計肯定實現系統的策略和目標系統的高層結構。對象設計肯定解空間中的類、關聯、接口形式及實現操做的算法。

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

   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.關聯的設計
     

8、面向對象的實現

(一)程序設計語言

   1.選擇面嚮對象語言
   採用面向對象方法開發軟件的基本目的和主要優勢是經過重用提升軟件的生產率。所以,應該優先選用可以最完善、最準確地表達問題域語義的面嚮對象語言。

   在選擇編程語言時,應該考慮的其餘因素還有:對用戶學習面向對象分析、設計和編碼技術所能提供的培訓操做;在使用這個面嚮對象語言期間能提供的技術支持;能提供給開發人員使用的開發工具、開發平臺,對機器性能和內存的需求,集成已有軟件的容易程度。

   2.程序設計風格
   (1)提升重用性。
   (2)提升可擴充性。
   (3)提升健壯性。

(二)類的實現

   在開發過程當中,類的實現是核心問題。在用面向對象風格所寫的系統中,全部的數據都被封裝在類的實例中。而整個程序則被封裝在一個更高級的類中。在使用既存部件的面向對象系統中,能夠只花費少許時間和工做量來實現軟件。只要增長類的實例,開發少許的新類和實現各個對象之間互相通訊的操做,就能創建須要的軟件。

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

   (1)「原封不動」重用。
   (2)進化性重用。
   一個可以徹底符合要求特性的類可能並不存在。
   (3)「廢棄性」開發。
   不用任何重用來開發一個新類。
   (4)錯誤處理。
   一個類應是自主的,有責任定位和報告錯誤。

(三)應用系統的實現

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

   在C++和C中有一個main( )函數,可使用這個過程來講明構成系統主要對象的那些類的實例。

(四)面向對象測試

   (1)算法層。
   (2)類層。
   測試封裝在同一個類中的全部方法和屬性之間的相互做用。
   (3)模板層。
   測試一組協同工做的類之間的相互做用。
   (4)系統層。
   把各個子系統組裝成完整的面向對象軟件系統,在組裝過程當中同時進行測試。 

9、面向對象和基於對象的區別

      不少人沒有區分「面向對象」和「基於對象」兩個不一樣的概念。面向對象的三大特色(封裝,繼承,多態)卻一不可。一般「基於對象」是使用對象,可是沒法利用現有的對象模板產生新的對象類型,繼而產生新的對象,也就是說「基於對象」沒有繼承的特色。而「多態」表示爲父類類型的子類對象實例,沒有了繼承的概念也就無從談論「多態」。如今的不少流行技術都是基於對象的,它們使用一些封裝好的對象,調用對象的方法,設置對象的屬性。可是它們沒法讓程序員派生新對象類型。他們只能使用現有對象的方法和屬性。因此當你判斷一個新的技術是不是面向對象的時候,一般可使用後兩個特性來加以判斷。「面向對象」和「基於對象」 都實現了「封裝」的概念,可是面向對象實現了「繼承和多態」,而「基於對象」沒有實現這些,的確很饒口。 

      從事面向對象編程的人按照分工來講,能夠分爲「類庫的建立者」和「類庫的使用者」。使用類庫的人並不都是具有了面向對象思想的人,一般知道如何繼承和派生新對象就可使用類庫了,然而咱們的思惟並無真正的轉過來,使用類庫只是在形式上是面向對象,而實質上只是庫函數的一種擴展。 

      面向對象是一種思想,是咱們考慮事情的方法,一般表現爲咱們是將問題的解決按照過程方式來解決呢,仍是將問題抽象爲一個對象來解決它。不少狀況下,咱們會不知不覺的按照過程方式來解決它,而不是考慮將要解決問題抽象爲對象去解決它。有些人打着面向對象的幌子,幹着過程編程的勾當。 

相關文章
相關標籤/搜索