lab3

2020年春季学期
计算机学院《软件构造》课程

Lab 3实验报告

姓名 陆玄宇
学号 1180300504
班号 1803005
电子邮件 781351087@qq.com
手机号码 15827169211

目录

1 实验目标概述 1
2 实验环境配置 1
3 实验过程 1
3.1 待开发的三个应用场景 1
3.2 面向可复用性和可维护性的设计:PlanningEntry 1
3.2.1 PlanningEntry的共性操作 1
3.2.2 局部共性特征的设计方案 2
3.2.3 面向各应用的PlanningEntry子类型设计(个性化特征的设计方案) 2
3.3 面向复用的设计:R 2
3.4 面向复用的设计:Location 2
3.5 面向复用的设计:Timeslot 2
3.6 面向复用的设计:EntryState及State设计模式 2
3.7 面向应用的设计:Board 2
3.8 Board的可视化:外部API的复用 2
3.9 PlanningEntryCollection的设计 2
3.10 可复用API设计及Façade设计模式 2
3.10.1 检测一组计划项之间是否存在位置独占冲突 2
3.10.2 检测一组计划项之间是否存在资源独占冲突 2
3.10.3 提取面向特定资源的前序计划项 2
3.11 设计模式应用 2
3.11.1 Factory Method 3
3.11.2 Iterator 3
3.11.3 Strategy 3
3.12 应用设计与开发 3
3.12.1 航班应用 3
3.12.2 高铁应用 3
3.12.3 进程应用 3
3.12.4 课表应用 3
3.12.5 学习活动应用 3
3.13 基于语法的数据读入 3
3.14 应对面临的新变化 3
3.14.1 变化1 3
3.14.2 变化2 4
3.14.3 变化3 4
3.15 Git仓库结构 4
4 实验进度记录 4
5 实验过程中遇到的困难与解决途径 4
6 实验过程中收获的经验、教训、感想 5
6.1 实验过程中收获的经验和教训 5
6.2 针对以下方面的感受 5

1实验目标概述
本次实验覆盖课程第 3、4、5 章的内容,目标是编写具有可复用性和可维护性的软件,主要使用以下软件构造技术:

子类型、泛型、多态、重写、重载
继承、代理、组合
常见的 OO 设计模式
语法驱动的编程、正则表达式
基于状态的编程
API 设计、API 复用

本次实验给定了五个具体应用(高铁车次管理、航班管理、操作系统进程管理、大学课表管理、学习活动日程管理),学生不是直接针对五个应用分别编程实现,而是通过 ADT 和泛型等抽象技术,开发一套可复用的 ADT 及其实现,充分考虑这些应用之间的相似性和差异性,使 ADT 有更大程度的复用(可复用性)和更容易面向各种变化(可维护性)。
2实验环境配置
在这里给出你的GitHub Lab3仓库的URL地址(Lab3-学号)。
3实验过程
请仔细对照实验手册,针对每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。
3.1待开发的三个应用场景
此次实验我选择了航班管理,高铁车次管理和大学课表管理

由实验手册中的指导图在位置的数量上,一个是起点加终点,一个是起点加终点和一组中间位置,还有一个只需一个具体位置即可;高铁和航班的位置皆不可更改,而教室位置可以更改;航班所需资源飞机和课程所需资源老师都是单个可区分资源,而列车是由多个带次序的可区分资源“车厢”组成;航班和课程都不可被阻塞而高铁可以;三个项目的时间都可被设定

3.2面向可复用性和可维护性的设计:PlanningEntry
该节是本实验的核心部分。
3.2.1PlanningEntry的共性操作

设定四种状态,状态之间可以转化
并可获取当前计划项状态和名字及位置,时间,资源

3.2.2局部共性特征的设计方案
在Allplanningentry中可以添加各项资源,获取各项属性或寻找各项属性

3.2.3面向各应用的PlanningEntry子类型设计(个性化特征的设计方案)
3个子类型主要在Location、TimeSlot、Resource等信息的存储模式和信息的修改这两方面有所不同
3.3面向复用的设计:R
航班应用中的资源是“飞机”

高铁应用中的资源是“车厢”

课表应用中的资源为“教师”

3.4面向复用的设计:Location

Location需要有地点名字和是否可被共享
3.5面向复用的设计:Timeslot

选用数组处理时间,方便进行跨度的比较
用string进行时间的读入,按格式转化为一维数组存储时间

3.6面向复用的设计:EntryState及State设计模式

设计了各种计划项的状态

Checkrep采用计划项不能同时存在两个状态进行检查
用数字代表状态
3.6.1检测一组计划项之间是否存在位置独占冲突
3.6.2检测一组计划项之间是否存在资源独占冲突
3.6.3提取面向特定资源的前序计划项
3.7设计模式应用
请分小节介绍每种设计模式在你的ADT和应用设计中的具体应用。
3.7.1Factory Method

读入名字和位置进行返回
3.7.2Iterator
3.7.3Strategy
3.8应用设计与开发
3.9基于语法的数据读入
按格式读入时间

4实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 时间段 计划任务 实际完成情况
5.3 19-22 阅读实验手册,理解实验要求 已完成
5.5 20-22.30 设计实现计划项的内容,设计各种状态 已完成
5.7 20-22 设计实现位置及时间表 未完成
5.10 20-22 设计实现局部共性特征 已完成
5.11 20-22 完成表格可视化 未完成
5.12 10-11 查阅资料
5.12 20-21 表格可视化 未完成
5.13 20-21 完成飞机子项目 完成一部分
5.14 20-22 完成高铁子项目 完成一部分
5.15 20-21 完成课程子项目 完成一部分
5实验过程中遇到的困难与解决途径
遇到的难点 解决途径

不知道怎么做表格的可视化 未解决

关于按格式读入不知如何处理
未解决

6实验过程中收获的经验、教训、感想
6.1实验过程中收获的经验和教训
对于java的知识掌握的太少了,有关复用的设计不知道怎么样才能够复用,抓不到共同点,对于设计模式的理解不到位,实在需要提高自己的能力
6.2针对以下方面的感受
(1)重新思考Lab2中的问题:面向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,也不是完全个性化,如何利用“接口、抽象类、类”三层体系以及接口的组合、类的继承、设计模式等技术完成最大程度的抽象和复用,你有什么经验教训?
(8)关于本实验的工作量、难度、deadline。
难度十分大
(9)到目前为止你对《软件构造》课程的评价。
能学到很多对设计有帮助的知识,但是没有前置课程感觉难度太大

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值