系統對象和類分析


靜態分析階段(定義類的關係以及對象的關係)

關聯和鏈接
   1) 關聯——針對類而言,表示類之間的使用關係。
      . 類的相互的使用關係稱爲雙向關聯。
      . 指類圖中用直線表示的關係;
      . 線可以是水平也可以是垂直的;
      . 可以在關係線上給一個邏輯名稱描述這個關係;
   2) 鏈接——針對對象而言
      . 指對象圖中二個對象間的關係;

類的關聯
   1)一個類中的屬性是另一個類的對象,另一個類中也有這個類的對象作爲其屬性。(雙向關聯)"has a"(一對一關聯)
   2)一個類中包含另一個類的多個對象(集合)作屬性,另一個類中也有這個類的一個對象作爲其屬性。(一對多關聯)
   3)一個類中包含有另一類的多個對象(集合)作屬性,另一個類中同樣也有這個類的多個對象作屬性。(多對多關聯),
以上所介紹的關聯關係都是雙向關聯。

多對多關聯是複雜的關聯關係,要是用關聯類來把多對多轉變成兩個一對多關係,也可以通過在多對多關聯中的類中加上一個唯一標識對象的鍵值,

關聯和多樣性
   1) 多樣性顯示了一個類中對象和另一個類中對象聯繫的可能性;
   2) 在類圖中,每個類只有一個矩形,因此聯接會確定一個類有多少個對象鏈接於另一個類的對象;
   3) 聯接線的末端有標記;

多樣性的值
   1) 2: 剛好二個;(確定值)
   2) *: 0至多個; (不確定值)
   3) 5..15: 5到15個; (範圍值)
   4) 2,4,6: 2、4、6個; (可選值)
   5) 10..*: 最少10個;
   6) 0..10: 最多10個;

複雜性的聯接
   1) 多樣性標記“*”出現在聯接的兩端;
   2) 你命名了類圖中所有聯接並分配了多樣性後,是時候重新審視他們並嘗試解決複雜聯接。可使用聯接類或符合條件聯接。

關聯類(類似於數據庫中索引表)
   1) 這意味着聯接它本身必須編碼爲一個類,這個類帶有解決衝突的屬性;
   2) 這種技術用於分析階段解決多對多關係;

符合條件的聯接
   1) 通過使用屬性值可解決多對多問題;
   2) 分配一個唯一的屬性值;

依賴,一個類,通過類中的方法包含另一個類的對象,並通過此對象調用另一個類中的方法,方法參數就是一個類對另一個類發送的消息(也可能是對象)。

分析階段的邏輯關係

   1) 在一個系統中必須存在一些關係以便進行適當地操作;
   2) 邏輯關係表達了一個類和另一個類如何關聯、一個對象怎樣得到或使用另一個對象;
   3) 問下列問題:
      . 一個類依賴於另一個類的某些功能嗎?
      . 是否存在一種非常強的關係以致一個對象缺少了另一個便不能存在?
   4) 在這個模塊討論的邏輯關係如下:
      . 繼承(Inheritance):
        a. 一般,(泛化)父類,子類的泛化,也就是抽取共性,抽象
        b. 特殊,(特化)子類,父類的特化,也就是在泛化抽象中加上了某種特性,特化
      . 多態(Polymorphism)
      . 關聯(Association)
        a. 聚合(Aggregation)
        b. 組合(Composition)
    
繼承(Inheritance)
   1) 繼承的概念描述了你如何在一組類似或相同目的類間共享或得到屬性以及功能;
   2) 單繼承和多重繼承;
   3) 使用繼承,我們能夠 :
      . 降低全部系統的尺寸;
      . 改善設計和維護的功能;
   4) Car、Bus、Train、Airplane、Ship, 他們都是交通工具。他們可以移動以及駕駛,它們可以將人從A地運往B地。
    
子類和父類
   1) 當一個類繼承自其它類,它被稱爲“子類”;
   2) 當一個類被繼承自其它類,它被稱爲“父類”;

注意:如果繼承關係沒有處理好,在使用多態上就會出現問題,所以要正確的處理繼承關係。

繼承分析
 
繼承的二種類型:

   . 一般繼承:

         

   . 特殊繼承:

         

多態
   1) 是一個和繼承關係密切的OO術語;
   2) 多態這個名字來源於希臘,意思是“多種形態”;
   3) 從分析透視圖看來,多態意味着不同類型和多種屬性可分配於類;
   4) Java和C++支持多態;
 
抽象類
   1) 是一些包含未實現功能的類,這些類不能實例化。一個類繼承了一個抽象類繼承了所有方法(包括抽象方法);
   2) 任何類繼承了抽象類後除非實現了所有的抽象方法,否則也是抽象的;
 
UML中關於抽象類的符號
   1) 抽象類的類名爲斜體;
   2) 抽象方法名也是斜體;

角色:表示一類數據結構的關係結構,角色可以是不同的類,可以通過角色來區別不同的對象的所能夠使用的功能。

反身(反射)關聯(加角色)

   1) 對象圖中,相同類的二個實體間的聯繫;
   2) 但是在類圖中只有一個類代表這些對象;
   3) 因此,這種關聯迴轉到相同的類。這樣的關聯稱爲反身關聯;
   4) 反身關聯在關聯線的末端必須存在角色名字。這明確地說明你是如何關聯這個類的二個對象。

             wife
             |ˉˉˉˉˉ ˉˉˉˉˉ ˉˉˉˉˉ ˉ  |
        |ˉˉˉˉˉ ˉˉˉˉˉ ˉˉˉˉˉ|
        |  Person       |        |
        |__________|        |married
        |ˉˉˉˉˉ ˉˉ ˉˉ ˉˉ ˉˉ |       |
        |__________|        |
            ↑____________|
             husband

關聯(Association)
   1) 關聯用於描述類圖中二個類間的關係;
   2) 包括一些更緊密關係諸如:聚合(Aggregation)和組合(Composition)
      . 聯繫:廚師使用刀;
      . 聚合:一輛車有一個車載電臺;
      . 組合:一輛車一般只包括一個發動機;

        |ˉˉˉˉˉ ˉˉ ˉˉ ˉˉ ˉˉ |        用刀     |ˉˉˉˉˉ ˉˉ ˉˉ ˉˉ ˉˉ |
        |   Chef          | chops with  |   Knife         |
        |___廚師___ |------------>    |____刀____ |
        |ˉˉˉˉˉ ˉˉˉˉˉˉˉ ˉˉ  |                    | ˉˉˉˉˉ ˉˉ ˉˉ ˉˉ ˉˉ|
        |__________ |                    |__________|

聚合(Aggregation)
   1) 是關聯中的一種;
   2) 更緊密的關聯方式;
   3) 聚合是一種整體/部分關係,但“部分”可以被其它對象共享(“部分可以脫離整體存在”),因而有可能在“整體”外存活。
   4) 表現爲“Has A”關係;

        |ˉˉˉˉˉ ˉˉ ˉˉ ˉˉ ˉˉ|                    |ˉˉˉˉˉ ˉˉ ˉˉ ˉˉ ˉˉˉ|
        |    Car          |     has a       | CarRadio   |
        |__________| ◇------------ |__________|
        |ˉˉˉ ˉˉˉˉ ˉˉ ˉˉ ˉˉ|                    |ˉˉˉˉ ˉ ˉ ˉ ˉ ˉ ˉ ˉ|
        |__________|                    |__________|

組合(Composition)
   1) 最緊密的關聯方式;
   2) 表現爲“always contains”關係,部分不能離開整體存在,整體也不能夠缺少部分而使用 例如:車不能沒有引擎
   3) 在UML圖上表現爲一黑色的菱形

        |ˉˉˉˉ ˉ ˉ ˉ ˉ ˉ ˉ ˉ |                    |ˉˉˉˉ ˉ ˉ ˉ ˉ ˉ ˉˉ|
        |   Car            |     driven by |  Enginee    |
        |__________ | ◆------------ |__________|
        |ˉˉˉˉˉ ˉˉˉˉ ˉˉ ˉˉ |                      |ˉˉˉˉˉ ˉˉ ˉˉ ˉ ˉ ˉ|
        |__________|                     |__________|

方法的擴散

方法的擴散,是建立在聚合和組合的關係之上,類和類之間的方法的調用,會造成方法的擴散,也就是類中的方法通過關聯的屬性來調用這個屬性的類型中定義的方法,方法擴散,可以導致整體的多個部分中的方法被連鎖調用。

方法的擴散:
    . 代理,整體和部分的類型是同一個類別(同一父類,或實現統一接口),他們之間的方法傳遞叫代理 ,可以使用多態特性。
    . 委託,整體和部分的類型是不同類別,他們的方法傳遞叫作委託。

動態模型分析

在分析階段創建動態模型
   1) 一旦在分析階段完成對象模型建模,你可以開始對系統和對象在整個時間段內運作方式進行建模,這稱爲動態建模。
   2) 動態建模發生二次:
      . 在邏輯分析階段(確信每個操作都是可能的)
        a. 時序圖(Sequence diagrams)/協作圖(Collaboration diagram);
        b. 狀態轉換圖(State transition diagram);
        c. 活動圖(Activity diagram);
      . 在物理設計階段(分配方法描述給對應的類)
責任
 
在OOA&D中,“責任”指:
   . 一個類知道什麼(狀態);
   . 一個類做什麼(行爲);
   . 一個類型知道什麼(狀態);
   . 一個類型做什麼(行爲);

分配責任
 
在分配責任時,很重要去確定以及實現以下內容:
   . 專家(指你所分配責任的類完全可實現其責任,這減小了額外對象的依賴以及支持低耦合);
   . 創建者(誰應該創建一個實例);
   . 高聚合(一個類的屬性一起完成得很好);
   . 低耦合(減少對象間的依賴性);

改變的必要
   1) 一個系統中的對象存在是因爲它們完成一些作務幫助系統完成它們的目標;
   2) 每個任務需要一定時間完成以及需要在對象間傳遞一些信息;
   3) 系統中的每個對象代表一組特定的活動;
   4) 你也應該考慮一個操作中所調用的對象以及它們是如何交互去完成這個操作的, 一個對象所完成的每個操作或子操作是如何改變對象的內在狀態的;


時序圖
   1) 模仿一定時間內一個系統的單個操作;
   2) 每個時序圖:
      . 和一個用例或一個用例中的一個情景直接聯繫;
      . 確定每個過程中所調用的對象;
      . 確定在一個過程中發現的行業或事件;
      . 確定在每個過程中必須傳輸什麼信息;
      . 確定每個行爲後需要什麼響應;
      . 對於每個用例至少產生一個時序圖
   3) 在分析階段,他們僅影響交互。在設計階段,每個交互將會轉爲一個方法調用。
   4) 一個用例至少一個時序圖, 時序圖可以製作得很複雜以顯示一個用例的多個情景,但最好還是每個情景對應一個時序圖。

協作圖
   1) 可以作爲時序圖的可選對象;
   2) 對象通過標有序號的箭頭連接,這些箭頭顯示了信息的流程;
   3) 箭頭從動作源指向目標對象;
   4) 箭頭標有序號顯示了在一個情景中它們使用的順序;
   5) 協作圖看上去像對象圖的子集。操作中被調用的對象在圖中表現爲裝有對象名稱的盒子。


狀態轉換圖
   1) 時序圖和協作圖顯示了在一定時間段內系統中對象是如何傳遞信息的;
   2) 狀態轉換圖顯示了在一定時間段內一個對象是如何改變的,它的方法是如何被其它對象所調用;
   3) 組成:狀態和事件;
   4) 箭頭用於顯示對象各種狀態間的路徑;
   5) 每個箭頭顯示了該對象是如何完成特定事件;
   乏值,也就是狀態轉換的臨界值,狀態轉換的臨界條件也就叫作乏值條件。
狀態
   1) 所有對象均有狀態,任何對象的當前狀態由存儲於其屬性中的值指示;
   2) 設想一臺打印機,它要麼閒置、要麼忙碌,打印機只有二種狀態:閒置和忙碌;

事件
   1) 事件是一個對象從一種狀態轉換到另一種狀態的促進因素;
   2) 事件表現爲方法調用。方法是一個對象的某些或一系列改變狀態的任務;
   3) 當一些對象調用打印機的print()方法,狀態由閒置改變爲忙碌,print()方法的調用就是導致狀態改變的事件;
   4) 一個對象通常處於它狀態中的一種,這意味着他們是穩定的。同時也意味着狀態的改變應該越快越好。

             |ˉˉˉˉ ˉˉ ˉˉˉ ˉˉˉˉ |      print       |ˉˉˉˉˉ ˉˉˉ ˉˉˉ ˉˉˉ |
             |   idle           |--------------->|      busy       |
    ●---->|                    |                    |                    |
             |                    |<---------------|                    |
             |__________|      eof         |__________|
                  |
                  | delete
                  ↓
                  ◎

活動圖
   1) 顯示一個對象和工作流的關係以及描述了相應的處理方法;
   2) 每個用例只有一個活動圖;
   3) 每個活動表現爲一個圓,該圓上有連接線連到下一個活動。這個連接線被稱爲板機(trigger);
   4) 一個活動能產生多個板機,這依賴於活動的結果;

設計原則與模式

軟件設計的核心問題,可維護性和可複用性。

設計原則

(OCP)開-閉原則,軟件實體應對擴展開放,對修改關閉,也就是屏蔽了修改對使用者的影響(簡單工廠模式不支持開閉原則),實現開閉原則要儘量使用抽象,實質就是要儘量降低耦合性,封裝可變性。可變性間不能混合。(基本原則)

(LSP)里氏代換原則,任何使用父類的地方都可以把父類替換爲子類而不影響正常運行。(多態的使用)


(DIP)依賴倒轉原則,要把依賴關係建立到抽象(接口、父類)上,不要依賴於實現(子類,實現類)。(避免類關係複雜,提高可擴展性),針對接口編程,推遲實現。

(ISP)接口隔離原則,使用多個專用接口替代單一接口。

(CARR)組合/聚合複用原則,使用組合或聚合關係,替代繼承。

(LoD)迪米特法則(最少支持原則),一個對象或模塊應該和其他對象和模塊儘量少通信(依賴)。

設計模式主要分三個類型:創建型、結構型和行爲型

創建型:
    單例模式:保證一個類只有一個實例,並提供一個訪問它的全局訪問點
    抽象工廠:提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們的具體類
    工廠方法:定義一個用於創建對象的接口,讓子類決定實例化哪一個類,Factory Method使一個類的實例化延遲到了子類
    建造者模式:將一個複雜對象的構建與他的表示相分離,使得同樣的構建過程可以創建不同的表示
    原型模式:用原型實例指定創建對象的種類,並且通過拷貝這些原型來創建新的對象
結構型:
    組合模式:將對象組合成樹形結構以表示部分整體的關係,Composite使得用戶對單個對象和組合對象的使用具有一致性
    外觀模式:爲子系統中的一組接口提供一致的界面,facade提供了一高層接口,這個接口使得子系統更容易使用
    代理模式:爲其他對象提供一種代理以控制對這個對象的訪問
    適配器模式:將一類的接口轉換成客戶希望的另外一個接口,Adapter模式使得原本由於接口不兼容而不能一起工作那些類可以一起工作
    裝飾模式:動態地給一個對象增加一些額外的職責,就增加的功能來說,Decorator模式相比生成子類更加靈活
    橋接模式:將抽象部分與它的實現部分相分離,使他們可以獨立的變化
    享元模式:運用共享技術有效的支持大量細粒度的對象
行爲型:
    迭代器模式:提供一個方法順序訪問一個聚合對象的各個元素,而又不需要暴露該對象的內部表示
    觀察者模式:定義對象間一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知自動更新
    模板方法:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中,TemplateMethod使得子類可以不改變一個算法的結構即可以重定義該算法得某些特定步驟
    命令模式:將一個請求封裝爲一個對象,從而使你可以用不同的請求對客戶進行參數化,對請求排隊和記錄請求日誌,以及支持可撤銷的操作
    狀態模式:允許對象在其內部狀態改變時改變他的行爲。對象看起來似乎改變了他的類
    策略模式:定義一系列的算法,把他們一個個封裝起來,並使他們可以互相替換,本模式使得算法可以獨立於使用它們的客戶
    職責鏈模式:使多個對象都有機會處理請求,從而避免請求的送發者和接收者之間的耦合關係
    中介者模式:用一箇中介對象封裝一些列的對象交互
    訪問者模式:表示一個作用於某對象結構中的各元素的操作,它使你可以在不改變各元素類的前提下定義作用於這個元素的新操作
    解釋器模式:給定一個語言,定義他的文法的一個表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子
    備忘錄模式:在不破壞對象的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章