软件构造课程实验报告 实验 3:面向复用和可维护性的软件构造
目录
1 实验目标概述········································································································································· 1
2 实验环境配置········································································································································· 1
3 实验过程·················································································································································· 1
3.1 待开发的三个应用场景··············································································································· 2
3.2 面向可复用性和可维护性的设计:PlanningEntry ············································· 2
3.2.1 PlanningEntry的共性操作····················································································· 2
3.2.2 局部共性特征的设计方案······························································································· 3
3.2.3 面向各应用的 PlanningEntry 子类型设计(个性化特征的设计方案)····· 3
3.3 面向复用的设计:R ··················································································································· 3
3.4 面向复用的设计:Location·································································································· 4
3.5 面向复用的设计:Timeslot·································································································· 4
3.6 面向复用的设计:EntryState 及 State 设计模式······················································ 5
3.7 面向应用的设计:Board ········································································································· 6
3.8 Board 的可视化:外部 API 的复用······················································································· 6
3.9 可复用 API 设计及 Façade 设计模式······················································································ 7
3.9.1 检测一组计划项之间是否存在位置独占冲突 ····························································· 7
3.9.2 检测一组计划项之间是否存在资源独占冲突 ····························································· 7
3.9.3 提取面向特定资源的前序计划项················································································· 7
3.10 设计模式应用······························································································································· 7
3.10.1 Factory Method······················································································································ 7
3.10.2 Iterator······································································································································ 8
3.11 应用设计与开发·························································································································· 8
3.11.1 航班应用································································································································ 9
3.11.2 高铁应用································································································································ 9
3.11.3 课表应用······························································································································10
3.12 基于语法的数据读入···············································································································10
3.13 应对面临的新变化 ···················································································································11
3.13.1 变化 1:航班支持经停,即包含最多 1 个中间经停机场·································11
3.13.2 变化 2:如果高铁车次已经分配了车厢资源,则不能被取消··························11
软件构造课程实验报告 实验 3:面向复用和可维护性的软件构造
3.13.3 变化 3:课程可以有多个教师一起上课,且需要区分次序·······························11
3.14 Git 仓库结构································································································································11
4 实验进度记录·······································································································································12
5 实验过程中遇到的困难与解决途径······························································································12
6 实验过程中收获的经验、教训、感想·························································································13
6.1 实验过程中收获的经验和教训·······························································································13
6.2 针对以下方面的感受·················································································································13
软件构造课程实验报告 实验 3:面向复用和可维护性的软件构造
1
1 实验目标概述
本次实验覆盖课程第 3、4、5 章的内容,目标是编写具有可复用性和可维护
性的软件,主要使用以下软件构造技术:
子类型、泛型、多态、重写、重载
继承、代理、组合
常见的 OO 设计模式
语法驱动的编程、正则表达式
基于状态的编程
API 设计、API 复用
本次实验给定了五个具体应用(高铁车次管理、航班管理、操作系统进程管
理、大学课表管理、学习活动日程管理),学生不是直接针对五个应用分别编
程
实现,而是通过 ADT 和泛型等抽象技术,开发一套可复用的 ADT 及其实
现,充
分考虑这些应用之间的相似性和差异性,使 ADT 有更大程度的复用(可复
用性)
和更容易面向各种变化(可维护性)。
2 实验环境配置
在新分支上开发,使用命令 git checkout -b 312change 即可创建新的分支,使
用 git checkout master 即可再切换回 master 分支。
在这里给出你的 GitHub Lab3 仓库的 URL 地址(Lab3-学号)。
https://github.com/ComputerScienceHIT/Lab3-1180300616
3 实验过程
请仔细对照实验手册,针对每一项任务,在下面各节中记录你的实验过程、
阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但
千万不要把你的源代码全部粘贴过来!)。
软件构造课程实验报告 实验 3:面向复用和可维护性的软件构造
2
3.1 待开发的三个应用场景
列出你所选定的三个应用。
- 航班管理
- 高铁车次管理
- 大学课表管理
这三个应用场景都是在一条时间线上对资源进行分配、管理。就资源(分配
对象)来说:13 是单个资源,2 是多个可区分资源;就位置来说:三者各不相同,
1 一起一终,2 一起一终还有中间位置,3 只有一个位置,但 12 不可更改,3 可
以更改;就时间分配来说,13 不可阻塞,2 可以阻塞
3.2 面向可复用性和可维护性的设计:PlanningEntry
该节是本实验的核心部分。
3.2.1 PlanningEntry的共性操作 - 3 个工厂方法分别能够返回指定类型的 PlanningEntry 实现类
- 以目标状态进行分类,能够将状态转换为 RUNNING、BLOCKED、CANCELLED、ENDED
四种之一 - 都能够获取关于 entry 的一些信息
软件构造课程实验报告 实验 3:面向复用和可维护性的软件构造
3
3.2.2 局部共性特征的设计方案
都在 CommonPlanningEntry 中实现
3.2.3 面向各应用的 PlanningEntry 子类型设计(个性化特征的设计方案) - Train 多一个 block(阻塞)函数
- Train 和 Flight 获取的是到达和离开的时间,Course 获取的是时间列表
- Course 可以更换位置
3.3 面向复用的设计:R
三者分别实现: - Plane
- Train
软件构造课程实验报告 实验 3:面向复用和可维护性的软件构造
4 - Teacher
3.4 面向复用的设计:Location
直接用 List 存储即可
3.5 面向复用的设计:Timeslot
与 Location 类似
软件构造课程实验报告 实验 3:面向复用和可维护性的软件构造
5
3.6 面向复用的设计:EntryState 及 State 设计模式
记录五种状态,可以获取状态,并控制各状态的转换,状态转换函数会检查能否转换
例:
规则如图:
软件构造课程实验报告 实验 3:面向复用和可维护性的软件构造
6
3.7 面向应用的设计:Board
以 FlightBoard 为例:
四个实现函数
3.8 Board 的可视化:外部 API 的复用
以 FlightBoard 为例
直接调用官方库即可,多次遍历筛选出符合条件的 entry(实例中没有符合条件的)
软件构造课程实验报告 实验 3:面向复用和可维护性的软件构造
7
3.9 可复用 API 设计及 Façade 设计模式
3.9.1 检测一组计划项之间是否存在位置独占冲突
只在 Course 中需要
时间存在交叉的同时地点相同即存在 Conflict
3.9.2 检测一组计划项之间是否存在资源独占冲突
和位置独占冲突同理
3.9.3 提取面向特定资源的前序计划项
多次遍历找出刚好挨着的即可
3.10 设计模式应用
3.10.1 Factory Method
软件构造课程实验报告 实验 3:面向复用和可维护性的软件构造
8
调用构造函数即可
3.10.2 Iterator
重写 compare 函数
然后调用比较、排序即可
3.11 应用设计与开发
在 CommonApp 中实现共性功能
软件构造课程实验报告 实验 3:面向复用和可维护性的软件构造
9
3.11.1 航班应用
menu 函数展示菜单,App 函数调用私有函数实现功能
3.11.2 高铁应用
思路与 Flight 相同,没有文件读取功能,增加阻塞功能
软件构造课程实验报告 实验 3:面向复用和可维护性的软件构造
10
3.11.3 课表应用
思路与 Flight 相同,没有文件读取功能,增加修改计划项位置的功能
3.12 基于语法的数据读入
在 FlightBoard 中实现
软件构造课程实验报告 实验 3:面向复用和可维护性的软件构造
11
“Flight:(.?),(.?)\n\{\nDepartureAirport:(.?)\nArrivalAirport:(.?)\nDepatureTi
me:(.?)\nArrivalTime:(.?)\nPlane:(.?)\n\{\nType:(.?)\nSeats:(.?)\nAge:(.?)\n\}
\n\}\n”
正则表达式如上,通过调用 java 自有 Pattern 和 Matcher 类进行文件读取
3.13 应对面临的新变化
只考虑你选定的三个应用的变化即可。
3.13.1 变化 1:航班支持经停,即包含最多 1 个中间经停机场
原生设计支持多个机场
3.13.2 变化 2:如果高铁车次已经分配了车厢资源,则不能被取消
代价极小
修改 CommonEntry 中的 cancel 函数增加判定条件即可
3.13.3 变化 3:课程可以有多个教师一起上课,且需要区分次序
CourseEntry 原生支持多个 object,只需在获取教师时按顺序压入 List
中即可
3.14 Git 仓库结构
请在完成全部实验要求之后,利用 Git log 指令或 Git 图形化客户端或
GitHub上项目仓库的Insight页面,给出你的仓库到目前为止的Object Graph,
尤其是区分清楚 314change 分支和 master 分支所指向的位置。
软件构造课程实验报告 实验 3:面向复用和可维护性的软件构造
12
4 实验进度记录
日期 时间段 计划任务 实际完成情况
2020-4-19 15:02-23:36 完成基础架构 按时完成
2020-4-26 19:30-23:46 完成 Entry 按时完成
2020-5-3 11:50-18:35 完成 Board 和可视化 按时完成
2020-5-10 12:00-19:45 完成 App 按时完成
2020-5-17 11:02-21:14 完成 314change,完善 App 按时完成
5 实验过程中遇到的困难与解决途径
遇到的难点 解决途径
正则表达式不太会写 上网查资料
GUI 不会写 上网查资料
软件构造课程实验报告 实验 3:面向复用和可维护性的软件构造
13
6 实验过程中收获的经验、教训、感想
6.1 实验过程中收获的经验和教训
6.2 针对以下方面的感受
(1) 重新思考 Lab2 中的问题:面向 ADT 的编程和直接面向应用场景编程,
你体会到二者有何差异?本实验设计的ADT在五个不同的应用场景下使
用,你是否体会到复用的好处?
面向 ADT 的应用场景更广,代码复用率高;体会到了
(2) 重新思考 Lab2 中的问题:为 ADT 撰写复杂的 specification, invariants, RI,
AF,时刻注意 ADT 是否有 rep exposure,这些工作的意义是什么?你是
否愿意在以后的编程中坚持这么做?
为自己和别人在修改、阅读代码时提供便利;非常愿意
(3) 之前你将别人提供的 API 用于自己的程序开发中,本次实验你尝试着开
发给别人使用的 API,是否能够体会到其中的难处和乐趣?
很有乐趣
(4) 在编程中使用设计模式,增加了很多类,但在复用和可维护性方面带来了
收益。你如何看待设计模式?
非常实用
(5) 你之前在使用其他软件时,应该体会过输入各种命令向系统发出指令。本
次实验你开发了一个解析器,使用语法和正则表达式去解析输入文件并
据此构造对象。你对语法驱动编程有何感受?
极大提高效率
(6) Lab1 和 Lab2 的大部分工作都不是从 0 开始,而是基于他人给出的设计
方案和初始代码。本次实验是你完全从 0 开始进行 ADT 的设计并用 OOP
实现,经过五周之后,你感觉“设计 ADT”的难度主要体现在哪些地方?
你是如何克服的?
有一个清晰的项目结构是很难的;绘制思维导图
(7) “抽象”是计算机科学的核心概念之一,也是 ADT 和 OOP 的精髓所在。
本实验的五个应用既不能完全抽象为同一个 ADT,也不是完全个性化,
如何利用“接口、抽象类、类”三层体系以及接口的组合、类的继承、设
计模式等技术完成最大程度的抽象和复用,你有什么经验教训?
在项目开始前一定要提前规划好项目结构,不然在代码编写的过程中可
能会多次重构乃至推翻重写
软件构造课程实验报告 实验 3:面向复用和可维护性的软件构造
14
(8) 关于本实验的工作量、难度、deadline。
工作量很大,难度较高,deadline 勉强够
(9) 到目前为止你对《软件构造》课程的评价。
一门非常实用的课程