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