筆記 - 物件導向程式設計(Object-oriented programming) - ver1-part2
和ChatGPT討論並生成草稿,再透過自己的理解修改。
此文章作為學習紀錄的用途。
將語意(Meaning)對應成物件模型
上一篇僅說明物件導向程式設計(Object-oriented programming)的元素的基本定義,而應用時通常是從語意對應,實作成所需的程式。
可以直接透過多種AI工具(對話式AI)完成將語意對應成物件模型的任務。
1. 語意(Meaning)
本文的語意(Meaning)是「語言所表達的意思(meaning)」。
1.1 語意(Meaning)和「業務語意」
語意(Meaning)
🎯 比喻
語意就像一封信的用意,雖然文字寫得清楚,理解卻需根據上下文、收信人背景、當時情境來決定真正的意思。
📘 說明
語意是一段語句的意圖、邏輯結構、作用的分析。
需求可以來自:
- 語言敘述(需求會談等)
- 分析及規劃文件(簡報摘要、規格草稿、企劃簡述)
- 規格文件(API文件、標準規範、合約模型)
業務語意
「業務語意」是公司裡對「業務概念」所形成的語言邏輯。就像各部門對訂單的認知,會有各自角色的解釋與關注點。
目的是透過「一致性的理解」,使「需求」依照預期的轉化為軟體。
建立一致的語意(Meaning)
在協作的環境中,需透過明確的機制「對齊」語意並達到「一致性」:
-
詞彙表:
依照使用範圍,為名詞與術語紀錄定義,例如客戶、訂單、核准等,並作為參照標準。
將一致的詞彙用在各個名稱,從需求到模型,以供辨識。 -
協作工具:
使用互動式工具(如Figma、Miro、BPMN流程)進行跨部門驗證,讓參與人員都能直接操作模型,進行模擬與驗證,在模型中逐步對齊語意。
高階概念到低階概念的語意(Meaning)
層次 | 特性 | 常見來源 | 說明 |
---|---|---|---|
高階概念 | 模糊、抽象、指向範圍 | Epic、Feature、使用者故事、訪談、需求會議 | 需要分析、拆解、推斷其中的邏輯和資訊 |
中階概念 | 有對應結構,但仍需釐清細節 | 規格文件、流程圖 | 可初步轉為模型草稿 |
低階概念 | 明確、結構化模型 | UML模型 | 可實作程式 |
1.2 語意對應到模型元素
將語意對應到模型元素並且對齊(雙向對應)。
對應到模型後要驗證雙向對應。
語意(Meaning)的分類與對應模型元素
語意類型 | 說明 | 對應模型元素 |
---|---|---|
實體 | 具有行為的主詞 | 類別(Class)、抽象類別(Abstract Class) |
行為 | 可被呼叫或描述的動作 | 方法、建構式(Constructor) |
屬性 | 狀態、資料描述 | 屬性(值類型、類別(Class)、集合類型) |
限制 | 業務規則、條件、狀態轉移 | 方法內部邏輯、驗證機制、狀態切換邏輯 |
範例:「使用者登入系統,若帳號已綁定Google則可快速登入,否則須先進行驗證。」
語意類型 | 語意片段 | 說明 | 對應模型元素 |
---|---|---|---|
實體 | 帳號(使用者) | 可持有狀態(是否綁定)、行為(登入、綁定) | 類別(Class) |
行為 | 登入、快速登入、進行驗證 | 方法有各自的邏輯 | 方法 |
屬性 | 是否已綁定Google | 影響快速登入方法 | 屬性(值類型) |
限制 | 若未綁定,須先驗證 | 方法中包含流程分支 | 條件邏輯(if-else) |
判斷類別(Class)、抽象類別(Abstract Class)、介面(Interface)
語意中的「實體」,可轉為類別(Class)、抽象類別(Abstract Class)。
語意片段 | 說明 | 對應模型元素 |
---|---|---|
行事曆包含任務與提醒功能 | 行事曆是「實體」,並且包含狀態與行為 | 類別(Class) |
一般用戶與管理員皆為使用者 | 使用者可「指稱」多種實體,包含「共同行為邏輯」 | 抽象類別(Abstract Class) |
可匯出、可列印、可通知 | 表示能力、行為合約,無具體屬性 | 介面(Interface) |
判斷方法(Method)
語意中的「動作」、「描述動作」可轉為「方法」。
分析是否有:
- 動作的「主詞」: 類別(Class)/抽象類別(Abstract Class)/介面(Interface)。
- 動作及「條件」: 用在方法名稱、方法邏輯。
- 動作依賴或關聯的名詞,描述「條件的判斷點」、「產生結果」: 變數、參數、回傳值,可能是資料或類別(Class)。
- 依賴或關聯的類別(Class),使用UML關係。
語意片段 | 說明 | 程式碼樣式 |
---|---|---|
使用者建立任務 | 使用者為類別(Class),建立任務為方法 | User.createTask() |
若已啟用通知則寄出訊息 | 若已啟用通知為條件語意,寄出訊息為方法 | sendIfEnabled() |
搜尋時間範圍內的訂單 | 時間範圍為輸入參數,訂單為回傳值,搜尋為方法 | search(start, end): Order |
判斷建構式(Constructor)
語意中若出現「建立」、「新的」、「產生」+「實體」,通常對應到建構式(Constructor)。
語意片段 | 說明 | 程式碼樣式 |
---|---|---|
建立並且命名新任務 | 任務為「實體」,輸入命名 | new Task(name) |
建立預設帳號 | 帳號為「實體」,使用預設參數 | new User(default) |
判斷屬性
屬性分為:
- 類別(Class): 實體,使用UML關係。
- 值: 資料,非實體。
- 集合: 包含多個實體或資料。
語意片段 | 說明 | 程式碼樣式 |
---|---|---|
任務標題是文字 | 文字是值 | title: String |
任務有負責人 | 負責人是類別(Class) | owner: User |
提醒時間點為多個時間 | 多個時間是集合(值) | notificationTimes: List<DateTime> |
訂單含有多個商品項目 | 商品項目是集合(類別(Class)) | items: List<Product> |
1.3 UML關係的語意判斷
在語意中,當主詞和受詞都是實體時,對應到UML關係。
判斷步驟範例
兩個實體具有「實例」關係:
-
是否屬於「單向」的「使用」、「觸發」等「臨時關係」的語意?
- 是 → 使用 依賴(Dependency): 語意為「使用(use)」。
- 否 → 下一步。
-
是否具備「部分-整體」、「組成」的語意?
- 否 → 使用 關聯(Association): 維持一段時間的關係,生命週期彼此不影響,例如用在可為空值的屬性。
- 是 →
- 參照實體是否可被多個實體共用?
- 是 → 使用 聚合(Aggregation): 語意為「有(has a)」。
- 否 → 使用 組合(Composition): 語意為「是一部分(is a part of)」,子實體不單獨存在。
- 參照實體是否可被多個實體共用?
兩個實體具有「類別(Class)層次」關係:
-
是否為「是一種(is a)」的語意?
- 是 → 使用 泛化(Generalization)。
-
其中一實體有「提供具體功能」、「實現」的語意?
- 是 → 使用 實作(Realization)。
其他狀況:
-
多種判斷同時符合
- 是否存在潛在實體
- 是 → 分離出不同實體並判斷其關係。
- 否 → 根據語意判斷是否衝突,或是開會討論相關的內容。
- 是否存在潛在實體
-
無法判斷或屬於模糊語意?
- 先使用 關聯(Association),後續迭代開發再做調整,否則開會討論。
是否有完全的優先順序判斷步驟? 有多種解答,可能簡單地從語意及相關定義判斷比較快,也可能參考既有模組使用適合的判斷步驟。另外還有既有的設計模式可以用。
UML關係與實體類型判斷
語意片段 | 說明 | 實體 A(結構所有者) | 實體 B(被參照方) | UML關係 |
---|---|---|---|---|
登入服務需引用授權服務 | 引用是「使用」 | 登入服務(類別(Class)/抽象類別(Abstract Class)) | 授權服務(類別(Class)/抽象類別(Abstract Class)/介面(Interface)) | 依賴(Dependency) |
顧客購買商品 | 存在關係 | - | - | 關聯(Association) |
訂單含有多個商品 | 訂單有商品,商品不依附訂單 | 訂單(類別(Class)) | 商品(類別(Class)) | 聚合(Aggregation) |
任務中包含多個子任務 | 子任務不單獨存在 | 任務(類別(Class)) | 子任務(類別(Class)) | 組合(Composition) |
一般用戶與管理員皆為使用者 | 皆為是「是一種」,繼承基本功能 | 使用者(類別(Class)/抽象類別(Abstract Class)) | 管理員/一般用戶(類別(Class)) | 泛化(Generalization) |
報表類支援匯出與列印 | 支援功能,實作行為 | 報表(類別(Class)/抽象類別(Abstract Class)) | 匯出與列印功能(介面(Interface)) | 實作(Realization) |
1.4 從語意(Meaning)概念層次區分工作流程
1. 概念層
- 來源: 使用者故事、訪談紀錄、需求討論紀錄。
- 輸入條件:
- 語句中已出現明確實體與動作語意。
- 談話或記錄中可標記出「誰做了什麼」。
- 輸出: 語意標記表: 語意實體,以及其動作、資料、限制條件。
2. 對齊及轉換層(分析和規劃)
- 來源: 語意分類表、詞彙表、臨時的紀錄文件、先前的設計。
- 輸入條件:
- 語意實體可對應模型元素(如類別(Class)、屬性)。
- 動作語意可轉換成方法、輸入/輸出資料、限制條件。
- 狀況:
- 若有語意未對應元素,返回概念層進行修訂。
- 若資料無法確定型別,使用通用類型(string)。
- 既有模型的遷移對應設計及流程。
- 輸出: UML草稿圖。
3. 設計層
- 輸入條件:
- 單獨範圍內的所有語意已分類(類別(Class)/屬性/方法/關係)。
- 輸出: UML文件或是相同作用的模型設計文件。
工具與文件說明
工具 / 文件類型 | 運用階段 | 格式說明 | 標準依據 |
---|---|---|---|
語意標記表 | 概念層 | 欄位: 語意片段、實體、動作、屬性語意、限制語意、關聯語意。 | - |
UML草稿圖 | 對齊及轉換層 | 使用簡化 UML圖。 | UML 2.5.1 |
語意對應表/結構對應表 | 跨層 | 欄位: 語意片段、對應模型元素、判斷依據、是否確定。 | - |
模型遷移對應文件 | 設計層 | 欄位: 版本、變更摘要、影響元素、修改原因、審查者、驗證狀態。 | - |
UML文件 | 設計層 | 採用 UML 2.5.1 規範 | UML 2.5.1 |
備註 | - | 記錄非結構語意、尚未建模片段、模糊語意選擇與其替代判斷依據 | 未完成紀錄 |