软件构造lab3 - 实验报告

本次实验旨在通过面向可复用性和可维护性的设计,实现一套适用于多种应用场景(如航班、高铁、学习日程管理)的软件构造技术。实验涉及子类型、泛型、多态等技术,以及Factory Method、Iterator、Strategy等设计模式。核心设计包括PlanningEntry接口及其子类型,以及Resource、Location、Timeslot、EntryState等类,实现了数据读入、冲突检测和API设计等功能。实验过程中,通过不断应对新变化,如飞机中转、高铁资源分配限制和学习活动暂停,以提升软件的灵活性和适应性。
摘要由CSDN通过智能技术生成

1. 实验目标概述

本次实验覆盖课程第 3、4、5 章的内容,目标是编写具有可复用性和可维护性的软件,主要使用子类型、泛型、多态、重写、重载、继承、代理、组合、常见的 OO 设计模式、语法驱动的编程、正则表达式、 基于状态的编程、API 设计、API 复用等软件构造技术:
本次实验给定了五个具体应用(高铁车次管理、航班管理、操作系统进程管理、大学课表管理、学习活动日程管理),学生不是直接针对五个应用分别编程实现,而是通过 ADT 和泛型等抽象技术,开发一套可复用的 ADT 及其实现,充分考虑这些应用之间的相似性和差异性,使 ADT 有更大程度的复用(可复用性)和更容易面向各种变化(可维护性)。

2. 实验环境配置

3. 实验过程

请仔细对照实验手册,针对每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。

3.1 待开发的三个应用场景

列我选择的三个应用场景:
航班管理
高铁车次管理
学习日程管理
这三个场景的异同点:
位置的数量:分别为1个、2个和多个
仅有学习日程的位置可更改
航班为单个资源,高铁为有序多个资源,学习日程为无序多个资源
仅有高铁车次可阻塞
时间均在创建时设定

3.2 面向可复用性和可维护性的设计:PlanningEntry

该节是本实验的核心部分。

3.2.1 PlanningEntry的共性操作

分别设置3个工厂方法能够分别返回指定类型的PlanningEntry实现类
另外还包含有start,end,cancel状态的设置方法,计划项名,计划项类型和状态的getter方法。

3.2.2 局部共性特征的设计方案

CommonPlanningEntry类实现了PlanningEntry接口中共性方法。
如状态转换方法与getter方法。

3.2.3 面向各应用的PlanningEntry子类型设计(个性化特征的设计方案)

3个PlanningEntry子类型的主要差距在于资源和地点不同以及地点不同引起的时间不同。其次火车需要比其他两个子类型多考虑block状态。因此在设计时对于不同子类型Resource,Location以及Timeslot的getter方法设计也不相同。Plane有两个地点返回方法分别代表起飞机场和降落机场。Activity只有一个地点返回方法,但他的地点可以重新选择,火车的Resource,Location以及Timeslot都是通过输入想要查找的序号来进行返回。
计划项种类在通过工厂方法创建时及确定,无需输入,在构造函数中自行初始化
3个PlanningEntry子类型需要的资源也不同,Plane需要单一可区分资源,Train需要多个可区分资源,Activity需要多个不可区分资源,所以在设计时使用List存储Train资源,而对Activity资源则设置资源和数量两个属性进行存储。
对于Plane的2个Location,使用两个变量分别存储,而Train则使用链表。
此外,ActivitEntry可以在开始前设置新地点,则再该计划项子类中添加对应的Setter方法。在设置之前进行状态的判断。

@Override

public void setLocation(Location newloc) {
if (this.getState().getStateStr().equals(“ALLOCATED”) ||this.getState().getStateStr().equals(“WAITING”))
location = ChangeableLocationEntryImpl.setLocations(newloc);
else
System.out.println(“该状态下不可重新设置地点”);
}
不过飞机对于地点用两个变量分别存储这样的设计导致3.14节修改的复杂。

3.3 面向复用的设计:R

资源有Plane、Train和Activity 3种,由于还是有一些共性,所以设置了Resource接口,有上述3个实现类:。Resource接口中有3种子类的工厂方法,以及对资源名称和类型的获取(activity中将发行部门视作类型)
对于activity的发行时间输入要求用户自行规范,不进行额外检查
3种子类均为immutable,设计有各个成员变量的Getter,且对于资源相等的判断仅取决于资源编号,默认资源编号具有唯一性。

3.4 面向复用的设计:Location

设计为一个Location代表一个单一地点,具有经度,纬度,地点名称以及是否可共享四种属性,考虑到之后实验操作过程中经纬度没有实际用途,直接按照设置默认值的方式处理,地点的区分仅靠地点名称,对与每个属性都有对应的getter。

3.5 面向复用的设计:Timeslot

根据观察发现,所有时间都以时间段方式存在,所以一个Timeslot里存储两个时间点,来确认两时间点之间的时间段,为了方便创建,还设计了Time类来表示一个时间点,对于输入有所要求,必须以“年-月-日 小时:分钟”形式输入,并分别存在两个String里,toString来输出对应时间点。

@Override
public String toString()
{
	return ymd + " " + time;
}

在Timeslot里设计开始与结束时间的getter&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值