软件构造学习笔记-实验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相关推荐
- 软件构造学习笔记-实验2
P1 1.设计目标 首先对图的ADT进行两种实现(从边和顶点出发),然后选择一种实现的ADT,根据输入的文件构建语料库,再利用构建的语料库,对输入字符串进行插入操作,并返回修改后的字符串. 2.有关A ...
- 软件构造学习笔记-实验4
磕磕绊绊也算是完成了最后一个实验.记录一下实验中遇到的问题. IDEA中SpotBugs的安装和使用 从网上找教程,都说IDEA没有使用版权.结果我直接在插件中就找到了.点击安装并重启即可. 使用时, ...
- 软件构造学习笔记-实验1
记录一下做实验1时遇到的问题. 准备工作 1.GitHub的注册和配置 由于之前没有接触过GitHub,所以碰到了一些问题.GitHub是什么?怎么建立GitHub远程仓库与本地仓库的连接?怎么在Gi ...
- 软件构造学习笔记-第八周
本周重点是Liskov可替换原则.它要求父类和子类的行为一致性,子类要有更强的不变量.更弱的前置条件.更强的后置条件.在该原则的要求下,每个子类都可以对父类进行替换.这在开发过程中会带来极大的便利,在 ...
- 软件构造学习笔记ATD
在面向对象的编程中,ADT的编写十分重要,与传统的c语言不同,面向对象的编程更加商业化一点,所以保密需要做好,有点商业机密的感觉.如何设计良好的抽象数据结构,通过封装来避免客户端获取数据的内部表示,避 ...
- 软件构造学习笔记(九)面向复用的软件构造技术
目录链接 Part I What is Software Reuse? Part II How to measure "reusability"? Part III Levels ...
- 哈工大软件构造学习笔记1 Views and Quality Objectives of Software Construction
先要搞清楚软件构造的对象是什么,如何刻画,在关注如何构造. 1,Five key quality objectives of software construction 软件构造的五个关键质量目标 容 ...
- 哈工大2022春软件构造学习笔记1
课程概述 第一部分:软件构造基础 第二部分:ADT+OOP 第三部分:面向可复用性和可维护性的软件构造 第四部分:面向健壮性与正确性的软件构造 第一章 软件构造的多维度视图和质量目标 软件构造的多维度 ...
- 软件构造学习笔记-第九周、第十周
因为本周五开始五一假期,所以只有一节软件构造课.因为内容还属于创建模式.结构模式.行为模式.将该堂课的内容整合到本博客中.本周的重点是程序开发模式,在写代码之前首先充分考虑采用哪种模式更有利于开发.维 ...
最新文章
- 刷题总结——拆网线(noip模拟 贪心)
- socket.io 之 engine.io
- elasticsearch-jdbc同步myslq数据到elasticsearch
- 此内容过于真实,引起强烈舒适
- 数据库设计的三大范式通俗解释
- 如何使用SQL Server数据库实验助手(DEA)工具
- Spring MVC控制流程与简易配置方案
- kettle-连接控件
- thinkphp5 数据库 链接 Connection
- mac docker 配置镜像加速器
- 操作 神通数据库_神通数据库安装及使用手册
- word转html,word转pdf
- mysql替代符号,mysql特殊符号
- 2019顺网无盘服务器配置,顺网无盘如何不安装网维客户端上传系统到无盘服务器...
- 教你解决“邮件”应用不断提示输入密码的方法!
- 撒娇吧使大家啊让你撒何地什么科的你
- elasticsearch实现类似京东的商品搜索效果(elasticsearch动态聚合)
- 计算机会计u8实验报告,用友erp,u8实验总结
- Word学习笔记:P1-页面简介文字编辑
- 转贴:谁说我会画板?
热门文章
- mysql一张表最多多少索引_MySQL一个索引最多有多少个列?真实的测试例子
- SignalR ——Android实践
- C和指针之编译出现warning: implicit declaration of function ‘matrix_multiply‘ is invalid in C99问题
- oracle 删除空间不足,oracle表空间扩容、创建、删除(解决表空间不足问题)
- ORA-00257+mysql_ORA-00257错误的解决办法
- python os.walk模块_Python之os.walk和os.path.walk
- 竟然有如何奇葩的如厕方式......
- 简单而又不平凡的杨辉三角形
- 您的屁股发热严重,请降温后使用。
- 薅羊毛丨5个平价好物,终于终于终于打折了!