[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AAGBF8Yb-1625403535792)(media/b7c1f747a870edf8b0db7af7453bb908.jpeg)]
2021年春季学期
计算学部《软件构造》课程
**Lab 3实验报告
**
姓名 | 田轩 |
---|---|
学号 | 1190200924 |
班号 | 1903012 |
电子邮件 | 1585315932@qq.com |
手机号码 | 13609170381 |
目录
实验目标概述
本次实验覆盖课程第 4-11 讲的内容,目标是编写具有可复用性和可维护性的
软件,主要使用以下软件构造技术:
⚫ 子类型、泛型、多态、重写、重载
⚫ 继承、代理、组合
⚫ 语法驱动的编程、正则表达式
⚫ API 设计、API 复用
本次实验给定了三个具体应用(值班表管理、操作系统进程调度管理、大学
课表管理),学生不是直接针对每个应用分别编程实现,而是通过ADT和泛型等
抽象技术,开发一套可复用的ADT及其实现,充分考虑这些应用之间的相似性
和差异性,使ADT有更大程度的复用(可复用性)和更容易面向各种变化(可维护性)。
实验环境配置
在这里给出你的GitHub Lab3仓库的URL地址(Lab3-学号)。
实验过程
请仔细对照实验手册,针对每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。
待开发的三个应用场景
简要介绍三个应用。
-
值班表管理(DutyRoster): 一个单位有 n 个员工,在某个时间段内(例 如寒假 1
月 10 日到 3 月 6 日期间),每天只能安排唯一一个员工在单位
值班,且不能出现某天无人值班的情况;每个员工若被安排值班 m 天
(m>1),那么需要安排在连续的 m 天内。值班表内需要记录员工的名
字、职位、手机号码,以便于外界联系值班员。 -
操作系统进程调度管理(ProcessSchedule):考虑计算机上有一个单核
CPU,多个进程被操作系统创建出来,它们被调度在 CPU 上执行,由操
作系统决定在各个时段内执行哪个线程。操作系统可挂起某个正在执行
的进程,在后续时刻可以恢复执行被挂起的进程。可知:每个时间只能
有一个进程在执行,其他进程处于休眠状态;一个进程的执行被分为多
个时间段;在特定时刻,CPU 可以“闲置”,意即操作系统没有调度执行
任何进程;操作系统对进程的调度无规律,可看作是随机调度。 -
大学课表管理(CourseSchedule):看一下你自己的课表,每周一上午 8:00-10:00
和每周三上午 8:00-10:00 在正心楼 11
教室上“软件构造”课程。课程需要特定的教室和特定的教师。在本应用中,我们对实际的课
表进行简化:针对某个班级,假设其各周的课表都是完全一样的(意即
同样的课程安排将以“周”为单位进行周期性的重复,直到学期结束);
一门课程每周可以出现 1 次,也可以安排多次(例如每周一和周三的“软
件构造”课)且由同一位教师承担并在同样的教室进行;允许课表中有
空白时间段(未安排任何课程);考虑到不同学生的选课情况不同,同一
个时间段内可以安排不同的课程(例如周一上午 1-2 节的计算方法和软
件构造);一位教师也可以承担课表中的多门课程。
面向可复用性和可维护性的设计:IntervalSet<L>
该节是本实验的核心部分。
IntervalSet<L>的共性操作
-
empty()方法,创建一个空对象并返回。具体实现为new
一个Interval的实现类CommomIntervalSet、,赋值给一个Interval类型,并返回。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jt5R7WsP-1625403535798)(media/30d2e297f9509215781cff78504981c5.png)]
-
insert方法,向Interset对象中插入一个时间段并标记标签。需要传递的参数为该时间段的开始时间long
start,结束时间long end,以及对应的标签L label。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9LCmQHe-1625403535801)(media/29dbc15cdb4362dc3f6568e0e87cbde4.png)]
-
labels方法,用于获得当前对象中的所有标签的集合。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AzkMjZV1-1625403535804)(media/7f93da135fd22b8f9c26b72b75d6b6e5.png)]
-
remove方法,从当前对象中移除某个标签所关联的时间段。所需传递的参数为待移除的标签L
label。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ErPlP1iV-1625403535807)(media/9932a5c7ca0a97bd6379b8fe4f83caa1.png)]
-
start方法,返回指定标签对应的时间段的开始时间。所需传递的参数为目标标签L
label。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sBrmgSOy-1625403535809)(media/9419679e10ed4f7ec859f10bf50036c7.png)]
-
end方法,返回指定标签对应的时间段的结束时间。所需传递的参数为目标标签L
label。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZHknBQ0I-1625403535811)(media/4c43a1526106c300cacb5197f208112d.png)]
-
BlankCheck方法,检查当前对象是否存在空白时间段。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uE4poujJ-1625403535813)(media/7960671fc120de28cb7d9d74a062b7e6.png)]
-
RepeatCheck方法,检查当前对象是否存在重叠时间段。由装饰类Decorator定义。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sWPYGGwF-1625403535815)(media/e4ab6dd28c64c2bb0adeb812105faa30.png)]
局部共性特征的设计方案
-
通过IsBlankCheck<L>类,实现装饰类中定义的BlankCheck方法。其具体实现如下。
-
遍历标签集合labels中的
-