1. 程式人生 > >Python設計模式 - UML - 總覽

Python設計模式 - UML - 總覽

state gen cat ati 接口編程 合作 直觀 常用 框架

說到設計模式就不得不涉及建模思想,說到建模思想自然而然會應用UML,目前業界開源的UML工具很多,用起來也非常便捷。近幾年來隨著軟件應用領域開發模式轉向快速叠代試錯,UML在敏捷開發,尤其是web及mobile開發領域應用越來越少。

就國內軟件行業發展現狀來說,穩定成熟的商業軟件鳳毛麟角,初具雛形的互聯網App大行其道,競爭中的公司更看重的是快速占領市場,小團隊快速叠代試錯,而不是長期、精心打磨同一款軟件產品,所以註重統一規範、充分需求分析、嚴密框架設計的UML顯得相對繁瑣,自然會被靈活敏捷的各類開發過程文檔取代,比如建模草圖、wiki、看板、註釋等輕文檔。

對於敏捷開發和傳統開發來說,不管是否廣泛使用UML工具,建模總是必不可少的,可以幫助我們理清思路,更好地分析和設計易擴展、易維護的軟件框架。從當前市面上看,基於圖表的UML是熟悉建模思想及設計模式的最好選擇。

UML簡介

簡單地說,UML的核心是圖表,是與具體編程語言無關的設計規範,用來定義、細化、編寫、構造軟件系統中的要素,以可視化的圖形定義軟件開發中涉及到的參與者、實體、流程及它們之間的調用關系,覆蓋軟件開發所有階段的抽象表述。

UML的優勢在於分析、建模和整理設計思路。

建模思想

在最終設計和實現軟件系統之前,通常都需要劃一定的時間在不同的層次上抽象開發模型,稍微上點規模的項目,團隊協作是必不可少了,開發模型也可以幫助團隊成員更好地溝通交流,所以不管是草圖還是UML,我們都需要對開發中的項目構建一些直觀、明確的文檔化記錄。建模的出發點有以下幾個方面:

- 更好地理解用戶需求,避免曲解或遺漏
- 更好地進行系統分析和設計,避免返工
- 幫助團隊交流和項目協同開發,避免埋坑
- 幫助提高開發速度和質量,降低溝通成本

UML常用圖

UML常用圖有13種,大體可以歸類為結構圖(Structure Diagrams)和行為圖(Behavior Diagrams)。

  • 結構圖:強調的是系統構建的靜態結構,包括類圖、對象圖、包圖、組件圖、部署圖、組合結構圖

  

  類圖(Class Diagram)

  類圖是最常用的UML圖,也是其他UML圖的基礎。類圖用來顯示類、接口以及它們之間的靜態結構和關系。

  類圖中的元素:類,接口、關系、協作、約束、註釋、包

  類圖中的關系:泛化、實現、關聯、聚合、組合、依賴

  對象圖(Object Diagram)

    對象圖可以看作是類圖在系統某一時刻的鏡像。

    對象圖中的元素:對象、鏈接、包

     對象圖中的關系:泛化、實現、關聯、聚合、組合、依賴

  包圖(Package Diagram)

    包圖是對各個包及包之間關系的描述,展現系統中模塊與模塊之間的依賴關系。

     包圖中的元素:類、接口、組件、節點、協作、用例及其他包

     包圖中的關系:泛化、細化、依賴

  組件圖(Component Diagram)

    組件圖又稱構建圖,用來建模系統的各個組件,包括源代碼文件、二進制文件、腳本文件、可以執行文件之間的關系

     組件圖中的元素:構件、接口、關系、端口、連接器

     組件中的關系:依賴、泛化

  部署圖(Deployment Diagram)

    部署圖是展示運行系統中的軟件和硬件的物理架構及處理節點的組件分布情況

     部署圖中的元素:結點、結點實例、結點類型、結點容器、物件、連接

     部署圖中的關系:依賴、關聯

  組合結構圖(Composite Structure Diagram)

    組合結構圖用來描述某一部分及其成員的組成結構關系,成員之間的連接關系,與外部組件的接口及協作

     組合結構圖的元素:部件、連接件、端口

     組合結構圖的關系:關聯、組合、泛化、依賴

  • 行為圖:強調系統中對象的動態行為,包括用例圖、活動圖、狀態圖、交互概述圖、通信圖、時序圖、時間圖

  

  用例圖(Use Case Diagram)

    用例圖從客戶角度展現需求模型中希望哪些參與者提供什麽樣的用例功能,以及功能模塊之間的調用關系

    用例圖中的元素:參與者、用例、關系

     用例圖中的關系:關聯、包含、擴展、泛化

  活動圖(Activity Diagram)

    活動圖用來描述用例功能所要求進行的活動以及活動之間的約束關系,有利於對象間的流程控制

    活動圖的元素:活動狀態、動作狀態、控制點、轉移、開始節點、終止節點、對象、對象流、泳道

     活動圖的關系:控制轉移、分支與合並、分叉與匯合

  狀態圖(State Machine Diagram)

    狀態圖用來描述特定對象所有可能的狀態,以及由各事件引發的狀態之間的轉換變化,強調從狀態到狀態的控制流

     狀態圖的元素:狀態、轉換、事件、活動、動作

     狀態圖的關系:狀態與狀態之間有組合、轉換關系

  交互概述圖(Interaction Overview Diagram)

    交互概述圖是將活動圖和時序圖嫁接在一起的圖,合並了時序圖片段和控制流構造

     交互概述圖的元素:活動狀態、動作狀態、控制點、轉移、開始節點、終止節點、對象、對象流、泳道

     交互概述圖的關系:控制轉移、分支與合並、分叉與匯合

  通信圖(Communication)

    通信圖描述發送和接受消息的對象之間的合作及調用關系

     通信圖的元素:對象、鏈、消息

     通信圖的關系:通過鏈讓消息在不同對象間傳遞

  時序圖(Sequence Diagram)

    時序圖也叫序列圖或順序圖,用來描述對象之間傳送消息的時間順序

     時序圖的元素:角色、對象、生命線、控制焦點、消息

     時序圖的關系:時序圖對象之間有約束關系

  時間圖(Timing Diagram)

    用來描述單個或多個對象隨時間變化或維持的狀態

     時間圖的元素:時間約束、持續時間約束、生命線、狀態、條件、事件

     時間圖的關系:事件之間有時間約束關系,狀態之間有轉移關系

UML常用符號

  • actor: 角色/參與者

技術分享圖片

  • usecase:用例

技術分享圖片

  • class diagram: 類圖 抽象類用斜體表示

技術分享圖片技術分享圖片

  • object diagram:對象圖

技術分享圖片

  • interface:接口

技術分享圖片

  • package: 包

技術分享圖片

  • start, end: 開始、結束

技術分享圖片技術分享圖片

  • state: 狀態

技術分享圖片

  • component: 構件

技術分享圖片

  • node:節點

   技術分享圖片

  • note: 註釋

技術分享圖片

  • <<include>>:包含關系

技術分享圖片

  • <<extend>>:擴展關系

技術分享圖片

  • generalization:泛化

技術分享圖片

  • dependency:依賴關系 註意箭頭指向:B依賴A

技術分享圖片

  • aggregation:聚合

技術分享圖片

  • composition:組合

技術分享圖片

  • association:關聯

技術分享圖片

        multiplicity: 多重性

*         - 1  僅為1

            - *  從0到無窮大

             - 0..1 0 或者 1

          - n..m [n, m]之間的任何數

UML擴展與細化

正如本文開始所述,UML在快速叠代的互聯網和移動互聯網時代似乎沒有以前應用那麽廣泛,更多時候開發人員在隱性使用UML特性,比如說繪制類、包、用例、組件等草圖輔助設計,但不會花費大量時間制作正式的UML圖例同時因為需求的不斷變化而頻繁返工。而且面向接口編程在框架設計中應用越來越多,但接口特性在UML2.0中並沒有得到相應擴展和細化,所以當前軟件開發過程,尤其是web & mobile app的開發過程的特點需要UML進一步升級以適應軟件工程的發展。對於UML的擴展與細化,個人有以下方面不太成熟的看法,僅供參考:

  • 根據已實現代碼生成UML各類圖:其實這種功能在不少IDE中已經提供了,但是功能還不夠全面和易用
  • 細化UML圖在接口方面的規範和契約:這個嘗試在UML中暫時還沒有發現,在其他開發流程和工具中倒是有抽象且細化接口導入、導出、約束等契約
  • 在UML中擴展新的分支xUML(根據xUML自動生成代碼):這個需要豐富的代碼庫支撐,暫時還不太容易做到,一旦抽象出基礎代碼庫,應該會大大提升開發效率
  • 淘汰老化UML概念:UML常用的十三種圖中,常用的也就幾種,其他的規範和契約雖然都在但實用性越來越小,所以需要適當瘦身

Python設計模式 - UML - 總覽