UML 類別圖
Relationship
- Dependency
- “uses-a”
- Association
- “knows-a”
- Composition
- “has-a”
- child 的存在依賴於 parent,若刪除 parent,child 也會隨之刪除
- Aggregation
- “has-a”
- child 的存在獨立於 parent,若刪除 parent,child 不會隨之刪除
- Inheritance
- “is-a”
- Implementation
- “can-do”
- 實現 interface
other features
- Navigation
- 當兩個 class 都可以看到對方,就用沒箭頭的關聯線,否則有箭頭
- Role Name
- 類別中的 Attribute
- Multiplicity
- 關聯端點上可以寫數量,代表物件個數
- Self-Association
- 同個類別的物件彼此有關係
軟體設計原則
Encapsulate What Varies
- 把經常改變的程式碼封裝起來,使日後修改時不會影響其他區塊的程式碼
- 實際使用的情境,可以把常改變的東西放在 interface 後,使日後改變實作時不影響呼叫該 interface 的程式碼
Favor Composition over Inheritance
- Composition(組合)在很多情境可以取代掉 Inheritance(繼承),甚至實現 Polymorphism(多型)
- 只有當 is-a 的情境出現,才用繼承比較好
- Composition 使用起來更有彈性
SOLID 設計原則
Single Responsibility Principle, SRP
- 單一職責原則
- A class should have only one reason to change.
- 可以把一個複雜的 module 拆成多個
Open-Close Principle, OCP
- 開放封閉原則
- You should be able to extend the behavior of a system without having to modify that system.
- 要可以擴充,同時不修改到原系統
LiskovSubstitution Principle, LSP
- 里氏替換原則
- 父類別有的功能,子類別必須遵從,父類別的部分要可以直接替換成子類別
Interface Segregation Principle, ISP
- 介面隔離原則
- No client should be forced to depend on methods it does not use
- 以 interface 來說,不該讓 module 實現它不需要的功能,可以把 interface 拆小
Dependency Inversion Principle, DIP
- 反向依賴原則
- 高階模組不應該依賴低階模組,兩者都應依賴抽象層
Modularity
Coupling
- type
- Tight coupling
- Content coupling
- 一個模組依賴另一個模組的內部運作
- ex: 一個模組直接存取另一個模組的變數,假設回傳的數值是公尺,如果另一個模組要修改成公分,就會影響到這個模組
- 可以用 getter 抽象出 getMeter(),這樣就不會直接存取變數
- Common coupling
- 多個模組共同存取和修改同個 global data
- ex: 一個模組錯誤修改會導致其他人都壞掉
- External coupling
- 多個模組直接存取同個 external I/O
- ex: API 要改就會全部都影響到
- Content coupling
- Medium coupling
- Control coupling
- 一個模組影響另一個模組的內部邏輯(比如說透過參數)
- ex: 參數要改個寫法就會影響一堆模組
- Data-Sructure coupling
- 多個模組共同存取同個 data structure
- ex: Data structure 要改就會影響到其他模組
- Control coupling
- Loose coupling
- Data Coupling
- 兩個模組 share/pass 同樣的資料
- Message Coupling
- 多個模組間透過 message 或是 command 來溝通
- 和 control coupling 的差別在於,並沒有去控制某個模組,只是叫他做某件事情
- No Coupling
- 不是好的設計
- 模組間沒有關聯,或是有個超巨大的模組
- Data Coupling
- Tight coupling
Cohesion
- type
- Weak cohesion
- Coincidental cohesion
- 唯一的關聯是他們在同個檔案
- ex: single file program
- Temporal cohesion
- 關聯的地方是他們在同個時間點被執行
- ex: 「執行 shutdown 相關的活動」
- Logical cohesion
- 活動間可以被歸類在同個 general category
- ex: Backup Controller,可能有很多地方需要 Backup
- Coincidental cohesion
- Medium cohesion
- Procedureal cohesion
- command 間存在執行順序
- ex: Clean car module 可能包含噴水、填表格、擦乾等等
- 但是 Clean car module 此處包含了操控財務資料的狀況
- Communicational cohesion
- 所有的 activities 都支援相同的 input/output
- ex: 提取文章的作者、提取文章的標題、提取文章的內容
- Sequential cohesion
- 某個 activities 的輸出是另一個 activities 的輸入,且具有順序性
- Procedureal cohesion 和 Communicational cohesion 的結合
- 這個沒那麼糟糕
- Procedureal cohesion
- Strong cohesion
- Functional cohesion
- Module 只支援只和一個問題相關的 activities
- Object cohesion
- 所有的 activities 都只會修改一個 object
- Functional cohesion
- Weak cohesion