软件构造实验3总结

目录

1 实验目标概述 1
2 实验环境配置 1
3 实验过程 1
3.1 待开发的三个应用场景 1
3.2 面向可复用性和可维护性的设计:IntervalSet 1
3.2.1 IntervalSet的共性操作 1
3.2.2 局部共性特征的设计方案 2
3.2.3 面向各应用的IntervalSet子类型设计(个性化特征的设计方案) 2
3.3 面向可复用性和可维护性的设计:MultiIntervalSet 2
3.3.1 MultiIntervalSet的共性操作 2
3.3.2 局部共性特征的设计方案 2
3.3.3 面向各应用的MultiIntervalSet子类型设计(个性化特征的设计方案) 2
3.4 面向复用的设计:L 2
3.5 可复用API设计 2
3.5.1 计算相似度 2
3.5.2 计算时间冲突比例 2
3.5.3 计算空闲时间比例 2
3.6 应用设计与开发 2
3.6.1 排班管理系统 3
3.6.2 操作系统的进程调度管理系统 3
3.6.3 课表管理系统 3
3.7 基于语法的数据读入 3
3.8 应对面临的新变化 3
3.8.1 变化1 3
3.8.2 变化2 3
3.9 Git仓库结构 3
4 实验进度记录 3
5 实验过程中遇到的困难与解决途径 4
6 实验过程中收获的经验、教训、感想 4
6.1 实验过程中收获的经验和教训 4
6.2 针对以下方面的感受 4

1实验目标概述
本次实验覆盖课程第 4-11 讲的内容,目标是编写具有可复用性和可维护性的
软件,主要使用以下软件构造技术:
⚫ 子类型、泛型、多态、重写、重载
⚫ 继承、代理、组合
⚫ 语法驱动的编程、正则表达式
⚫ API 设计、API 复用
本次实验给定了三个具体应用(值班表管理、操作系统进程调度管理、大学
课表管理),学生不是直接针对每个应用分别编程实现,而是通过 ADT 和泛型等抽象技术,开发一套可复用的 ADT 及其实现,充分考虑这些应用之间的相似性和差异性,使 ADT 有更大程度的复用(可复用性)和更容易面向各种变化(可维护性)
2实验环境配置
实验环境在之前的几次试验中已经基本完善,在原来基础上继续进行开发即可。

在这里给出你的GitHub Lab3仓库的URL地址(Lab3-学号)。
https://classroom.github.com/a/ZAJ8w2eC
3实验过程
请仔细对照实验手册,针对每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。
3.1待开发的三个应用场景
简要介绍三个应用。
分析三个应用场景的异同,理解需求:它们在哪些方面有共性、哪些方面有差异。
第一个应用场景是值班表管理,它要求安排员工在连续的m天中值班,每天只能安排唯一一个员工在单位值班,且不能出现某天无人值班的情况。值班表内需要记录员工的名字、职位、手机号码,以便于外界联系值班员。
第二个应用场景是操作系统进程调度管理,它要求模拟操作系统的调度行为,每个时间只能有一个进程在执行,其他进程处于休眠状态;一个进程的执行被分为多个时间段;在特定时刻,CPU 可以“闲置”,意即操作系统没有调度执行任何进程;操作系统对进程的调度无规律,可看作是随机调度。
第三个场景是大学课表管理,它要求对课程的教师、教师等内容进行安排。针对某个班级,假设其各周的课表都是完全一样的(意即同样的课程安排将以“周”为单位进行周期性的重复,直到学期结束);一门课程每周可以出现 1 次,也可以安排多次(例如每周一和周三的“软件构造”课)且由同一位教师承担并在同样的教室进行;允许课表中有空白时间段(未安排任何课程);考虑到不同学生的选课情况不同,同一个时间段内可以安排不同的课程(例如周一上午 1-2 节的计算方法和软件构造);一位教师也可以承担课表中的多门课程。
共同点是三个应用都包含了具有不同特征的“时间段集合”对象,该对象拥有起始和结束时间以及表明其性质的标签。
3.2面向可复用性和可维护性的设计:IntervalSet
该节是本实验的核心部分。
3.2.1IntervalSet的共性操作
这是一个可变的ADT,描述了一组在时间轴上分布的“时间段”(interval),每个时间段附着一个特定的标签,且标签不重复。它包含了三个应用中都会用到的几种方法。L就是相应的“标签”,在三个应用中分别为“员工”ADT(Employee),“进程”ADT(Process),“课程”ADT(Course)。且 L 是 immutable 的。
在这里插入图片描述

3.2.2局部共性特征的设计方案
CommonIntervalSet类实现了IntervalSet接口中的共性方法,包括
⚫ 创建一个空对象:empty()
⚫ 在当前对象中插入新的时间段和标签:void insert(long start,
long end, L label)
⚫ 获得当前对象中的标签集合:Set labels()
⚫ 从当前对象中移除某个标签所关联的时间段:boolean remove(L
label)
⚫ 返回某个标签对应的时间段的开始时间:long start (L label)
⚫ 返回某个标签对应的时间段的结束时间:long end (L label)
等方法,具体实现为
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2.3面向各应用的IntervalSet子类型设计(个性化特征的设计方案)
各个子类都应用到了时间段的内容,在标签方面有所不同。值班表DutyIntervalSet类继承了CommonIntervalSet,此外还定义了排班开始和结束时间以及员工列表等内容。
在这里插入图片描述

操作系统进程调度管理ProcessIntervalSet继承了MultiIntervalSet类。
大学课表管理CourseIntervalSet继承了MultiIntervalSet类,还定义了开始的年月日以及周数、课程列表等内容。
在这里插入图片描述

3.3面向可复用性和可维护性的设计:MultiIntervalSet
3.3.1MultiIntervalSet的共性操作
MultiIntervalSet类实现了IntervalSet接口中的大部分方法以及其他的一些方法,包括
⚫ 创建一个空对象:empty()或不带任何参数的构造函数
⚫ 创建一个非空对象:构造函数 MultiIntervalSet(IntervalSet
initial),利用 initial 中包含的数据创建非空对象
⚫ 在当前对象中插入新的时间段和标签:void insert(long start,
long end, L label)
⚫ 获得当前对象中的标签集合:Set labels()
⚫ 从当前对象中移除某个标签所关联的所有时间段:boolean remove(L
label)
⚫ 从 当 前 对 象 中 获 取 与 某 个 标 签 所 关 联 的 所 有 时 间 段 :IntervalSet intervals(L label),返回结果表达为IntervalSet的形式,其中的时间段按开始时间从小到大的次序排列。例如:当前对象为{ “A”=[[0,10],[20,30]], “B”=[[10,20]] },那么 intervals(“A”)返回的结果是{ 0=[0,10], 1=[20,30] }。

3.3.2局部共性特征的设计方案
在IntervalSet中,同一个标签对象 L 只被绑定到唯一一个时间段上,这可以满足诸如排班表管理这样的简单应用,却无法满足诸如操作系统进程调度和课程表管理这种复杂应用:同一个标签对象 L 可被绑定到多个时间段上。因此在设计上大部分与CommonIntervalSet的设计区别不大,但是额外设计了同一个标签对象 L 可被绑定到多个时间段上。
在这里插入图片描述

3.3.3面向各应用的MultiIntervalSet子类型设计(个性化特征的设计方案)
操作系统进程调度管理ProcessIntervalSet继承了MultiIntervalSet类。
大学课表管理CourseIntervalSet继承了MultiIntervalSet类,还定义了开始的年月日以及周数、课程列表等内容。
在这里插入图片描述

3.4面向复用的设计:L
标签总共有三种,包括“员工”ADT(Employee),“进程”ADT(Process),“课程”ADT(Course)。
Employee类中包含了员工的姓名、职位和电话等成员变量。
在这里插入图片描述

Process类中包含了进程的ID、名称、最大执行时间、最小执行时间、已经运行的总时间以及是否运行完结等成员变量。
在这里插入图片描述

Course类中包含课程ID、名称、上课地点、老师姓名等内容。
在这里插入图片描述

3.5可复用API设计
3.5.1计算相似度
按照时间轴从早到晚的次序,针对同一个时间段内两个对象里的 interval,若它们标注的 label 等价,则二者相似度为 1,否则为 0;若同一时间段内只有一个对象有 interval 或二者都没有,则相似度为 0。将各interval 的相似度与 interval 的长度相乘后求和,除以总长度,即得到二者的整体相似度。

3.5.2计算时间冲突比例
是指同一个时间段内安排了两个不同的 interval 对象。用发生冲突的时间段总长度除于总长度,得到冲突比例,是一个[0,1]之间的值。

3.5.3计算空闲时间比例
指某时间段内没有安排任何 interval 对象。用空闲的时间段总长度除于总长度,得到空闲比例,是一个[0,1]之间的值。

3.6应用设计与开发
利用上述设计和实现的ADT,实现手册里要求的各项功能。
3.6.1排班管理系统
使用GUI设计的方式,定义了界面以及按钮和相应的提示标签,点击按钮就可以实现相应的功能。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.6.2操作系统的进程调度管理系统
在这部分内容中我用到了多线程的知识,并自己定义了线程相应的内容。
在这里插入图片描述

点击界面的相应按钮即可实现相应的功能。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.6.3课表管理系统
点击按钮实现相应功能。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.7基于语法的数据读入
扩展功能为:从一个外部文本文件读入数据并使用正则表达式 parser 对其进行解析,从中抽取信息,构造值班表对象。

3.8应对面临的新变化
3.8.1变化1
可以应对变化,代价较小。只需让DutyIntervalSet类改为继承MultiIntervalSet,再添加一个时间不同的员工对象即可
3.8.2变化2
可以应对变化,代价较小。只需让CourseIntervalSet类改为继承CommonIntervalSet即可。
3.9Git仓库结构
请在完成全部实验要求之后,利用Git log指令或Git图形化客户端或GitHub上项目仓库的Insight页面,给出你的仓库到目前为止的Object Graph,尤其是区分清楚change分支和master分支所指向的位置。
4实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。

5实验过程中遇到的困难与解决途径
遇到的难点 解决途径

不理解实验要求
对不理解的知识上网查资料进行了解,请教同学。

不清楚GUI如何设计和使用
上网查找教程,在图书馆找相应的书籍进行学习,请教同学。

在程序运行时出现许多bug
修改代码书写方式,利用System.out.println()输出关键信息的方法找出错误。

6实验过程中收获的经验、教训、感想
6.1实验过程中收获的经验和教训
6.2针对以下方面的感受
(1)重新思考Lab2中的问题:面向ADT的编程和直接面向应用场景编程,你体会到二者有何差异?本实验设计的ADT在三个不同的应用场景下使用,你是否体会到复用的好处?
ADT 的编程对于每个部分的责任更为明确,易于管理、维护;体会到了

(2)重新思考Lab2中的问题:为ADT撰写复杂的specification, invariants, RI, AF,时刻注意ADT是否有rep exposure,这些工作的意义是什么?你是否愿意在以后的编程中坚持这么做?
意义是对于ADT每个部分的功能、限制更为了解,避免以后的冲突;愿意

(3)之前你将别人提供的API用于自己的程序开发中,本次实验你尝试着开发给别人使用的API,是否能够体会到其中的难处和乐趣?
学习提供 API 能够在之后适应面向客户端编程

(4)你之前在使用其他软件时,应该体会过输入各种命令向系统发出指令。本次实验你开发了一个解析器,使用语法和正则表达式去解析输入文件并据此构造对象。你对语法驱动编程有何感受?
设计模式是不断在变化的,也是不固定、多态的

(5)Lab1和Lab2的大部分工作都不是从0开始,而是基于他人给出的设计方案和初始代码。本次实验是你完全从0开始进行ADT的设计并用OOP实现,经过五周之后,你感觉“设计ADT”的难度主要体现在哪些地方?你是如何克服的?
难点主要在于 ADT 内外的责任以及功能与功能的衔接;
进行整体规划并在设计过程中不断调整和完善

(6)“抽象”是计算机科学的核心概念之一,也是ADT和OOP的精髓所在。本实验的五个应用既不能完全抽象为同一个ADT,也不是完全个性化,如何利用“接口、抽象类、类”三层体系以及接口的组合、类的继承、设计模式等技术完成最大程度的抽象和复用,你有什么经验教训?
抽象需要我们有对实际意义的理解以及将其与程序链接的想象力

(7)关于本实验的工作量、难度、deadline。
工作量大,难度大,deadl较为合理

(8)到目前为止你对《软件构造》课程的评价。
这门课程极大地增强了我的编程能力,加深了我对java编程语言的理解,让我深刻地体会到了面向对象以及抽象和复用的思想,这门课使我受益匪浅。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值