软件构造学习笔记-实验3
本次實驗要求從五項要求(航班管理、高鐵車次管理、操作系統進程管理、大學課表管理、學習日程管理)里完成三項要求,并且盡量實現復用。
面向可復用性和可維護性的設計:PlanningEntry
1.首先設計一個類CommonPlanningEntry來實現共同的操作,比如創建新計劃項、啟動、取消、完成、獲取名字、獲取狀態。
2.對于各情形的個性化特征
如果各應用在某個維度上的特征值完全相同,則可以將針對處理該共性特征
值的操作在 PlanningEntry和 CommonPlanningEntry中定義和實現,即實現完全的復用。如果在某個維度上的特征取值完全不同,就必須在各個應用的具體子類中分別實現其對不同特征取值的個性化操作。有以下幾種方案。
3.方案1:將所有特殊操作均放入頂層的抽象接口
將各應用中出現的所有特殊操作都放入 PlanningEntry 接口中定義并CommonPlanningEntry 中實現它們。對各應用的具體子類,如果接口中的某個操作不適用于自己,則應用開發者不要使用它們。例如,override 后的方法體設置為空實現,或者直接 assert false,或者 throws new Exception。但是,這么做會導致各個應用子類中大量 override 空實現的方法,代碼會很不美。另一方面,這種做法會導致違反 LSP 原則,因為子類中空實現的 block 方法不再符合接口中 block方法的 spec,子類型對象無法替代父類型對象。
4.方案 2:將各特殊操作分別放入底層的應用子類
將針對不同特征取值的具體操作分別放在五個應用的子類中加以實現。例如:針對高鐵和進程應用的 PlanningEntry 子類中實現 block 方法,其他三個應用的 PlanningEntry 子類不需實現該方法。該方案的缺點是:某些方法的代碼可能是重復的、分散在多個類中,可維護性和可復用性差,將來一旦面臨變化就需要修改多處代碼。
5.方案 3:為不同特征取值分別定義接口并在子類中實現其特殊操作
為每個維度上的不同特征取值分別定義不同的接口,在接口中定義特殊的操作,各應用的具體子類根據自己的需求來實現不同特征的接口。以“位置數量”維度為例:設置一個位置、兩個位置、多個位置的接口。這種方案與方案 2 有同樣的缺陷:某些局部共性的操作仍然需要在多個子類中分別 override。
6.方案 4:定義接口并實現具體類,通過繼承樹實現各應用在多維度上的不同特征取值的組合
在方案 3 基礎上,除了為每個維度上的每個特征取值定義相應的接口,另外為每個接口分別構造一個實現類,該類一方面繼承 CommonPlanningEntry中的全局共性操作,另一方面在該類中完成對局部共性操作的代碼。(有種步步為營的感覺)缺點是如果同時考慮五個維度上的特征,將可能組合出非常多的子類數量,形成了龐大的繼承樹,給軟件系統的維護代碼極大困難。
7.方案5:CRP,通過接口組合實現局部共性特征的復用(推薦)
針對方案 4,通過 delegation 機制進行改造。每個維度分別定義自己的接口,針對每個維度的不同特征取值,分別實現針對該維度接口的不同實現類,實現其特殊操作邏輯。進而,通過接口組合,將各種局部共性行為復合在一起,形成滿足每個應用要求的特殊接口(包含了該應用內的全部特殊功能),從而該應用子類可直接實現該組合接口。在應用子類內,不是直接實現每個特殊操作,而是通過 delegation 到外部每個維度上的各具體實現類的相應特殊操作邏輯。
8.方案 6:使用 decorator 設計模式
將 CommonPlanningEntry 看作是原始的、未被裝飾的計劃項實體,將這五個維度看作是五種“裝飾”(每個維度的不同特征取值可以產生不同的“裝飾”效果)。
面向復用的設計:Location
PlanningEntry 的某些子類型的 rep 中不可避免的需要表達“位置”信息。需設計 Location 類,它可以是接口、抽象類或具體類,是 immutable 的。
一個“位置”對象的屬性包括:經度、緯度、名稱、是否可共享使用。所謂的“是否可共享”是指:該位置是否可同時被多個計劃項所使用。應用 3 中的“位置”是“某個 CPU 核”,它無需使用經度和緯度加以描述,只需使用名稱區分即可。
面向復用的設計:Timeslot
不可變類。為一個單獨的“起止時間對”設計 Timeslot 類,它是一個帶有起始時間和結束時間的ADT,應包含日期(年/月/日)和時間(時/分),符合 yyyy-MM-dd HH:mm 的語法規則。例如:(2020-03-01 12:00, 2020-03-01 14:00)
總結
以上是生活随笔為你收集整理的软件构造学习笔记-实验3的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件构造学习笔记-第十一周
- 下一篇: 软件构造学习笔记-第十二周