面向复用和可维护性的软件构造

软件构造课程实验报告 实验 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 待开发的三个应用场景
列出你所选定的三个应用。

  1. 航班管理
  2. 高铁车次管理
  3. 大学课表管理
    这三个应用场景都是在一条时间线上对资源进行分配、管理。就资源(分配
    对象)来说:13 是单个资源,2 是多个可区分资源;就位置来说:三者各不相同,
    1 一起一终,2 一起一终还有中间位置,3 只有一个位置,但 12 不可更改,3 可
    以更改;就时间分配来说,13 不可阻塞,2 可以阻塞
    3.2 面向可复用性和可维护性的设计:PlanningEntry
    该节是本实验的核心部分。
    3.2.1 PlanningEntry的共性操作
  4. 3 个工厂方法分别能够返回指定类型的 PlanningEntry 实现类
  5. 以目标状态进行分类,能够将状态转换为 RUNNING、BLOCKED、CANCELLED、ENDED
    四种之一
  6. 都能够获取关于 entry 的一些信息
    软件构造课程实验报告 实验 3:面向复用和可维护性的软件构造
    3
    3.2.2 局部共性特征的设计方案
    都在 CommonPlanningEntry 中实现
    3.2.3 面向各应用的 PlanningEntry 子类型设计(个性化特征的设计方案)
  7. Train 多一个 block(阻塞)函数
  8. Train 和 Flight 获取的是到达和离开的时间,Course 获取的是时间列表
  9. Course 可以更换位置
    3.3 面向复用的设计:R
    三者分别实现:
  10. Plane
  11. Train
    软件构造课程实验报告 实验 3:面向复用和可维护性的软件构造
    4
  12. 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) 到目前为止你对《软件构造》课程的评价。
    一门非常实用的课程
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值