Lab3 心得体会

引入 IntervalSet,这是一个 mutable 的 ADT,描述了一组在时间轴上 分布的“时间段”(interval),每个时间段附着一个特定的标签,且标签不重复。

例如:下图的时间段集合可表示为{ A=[0,5], B=[10,30], C=[30,35] }。 在该例子中,标签是简单的字符串(“A”、“B”、“C”),但实际应用中标签可以是 任何 immutable 类型的 ADT,也就是 IntervalSet中的 L。

例如上节应用 1 中的标签应该是“员工”ADT(Employee),应用 2 中的标

签是“进程”ADT(Process),应用 3 中的标签是“课程”ADT(Course)。注 意,一定要保证 L 是 immutable 的。

但是,IntervalSet中,同一个标签对象 L 只被绑定到唯一一个时间段 上,这可以满足诸如排班表管理这样的简单应用,却无法满足诸如操作系统进程 调度和课程表管理这种复杂应用:同一个标签对象 L 可被绑定到多个时间段上。

如下图所示,标签对象“A”与两个时间段发生联系,“B”也是如此。该图可 表示为{ A=[[0,5],[20,25]], B=[[10,20],[25,30]], C=[[30,35]] }。

为接口 IntervalSet设计应提供的共性接口方法,并确定它们是静态方 法还是实例方法:

⚫ 创建一个空对象:empty()

在当前对象中插入新的时间段和标签:void insert(long start, long end, L label)
⚫ 获得当前对象中的标签集合:Set labels()

⚫ 从当前对象中移除某个标签所关联的时间段: boolean remove(L label)

⚫ 返回某个标签对应的时间段的开始时间:long start (L label)

⚫ 返回某个标签对应的时间段的结束时间:long end (L label)

⚫ …不限于上述方法,你可以继续抽象各应用所需要的其他全局共性方法 注 1:为简化起见,时间轴上的时刻都统一用 long 数据类型表示。

注 2:上述方法若有需要抛出的异常,可自定义异常类并在上述方法定义中 使用。

注 3:接口中定义的方法应当是该 ADT 所有实例对象都统一具有的“行为”

(由各方法的 spec 所规定,但实现方式可能不同)。如果某方法对某些实例对 象是有价值的、对其他实例对象是不存在的“行为”,那么就不应该放在接口里。 当你读完 3.6.1 节描述的各类差异之后,可能需要返回到这里重新评估上述给 出的各个方法是否都是“统一具有的行为”,从而对它们做出删减或增加。

请根据你对应用的理解和抽象,为上述各方法设计 Spec,并据此设计相应的 测试用例。

进而,设计一个类 CommonIntervalSet来实现接口 IntervalSet。 请设计它的 rep、RF、AI、Safety from Rep Exposure,实现各个接口方法、 checkRep()、toString(),其中 toString()将对象内容表示为人容易理解的 文本字符串形式。

MultiIntervalSet的设计与实现
你可自行决定将 MultiIntervalSet实现为接口、抽象类或是具体类。 如果是接口或抽象类,那么必须还要实现一个具体类,其名字应 为 CommonMultiIntervalSet。

在其 rep 中,要求必须使用 IntervalSet作为其 rep 的一部分,意即必 须复用 IntervalSet及其实现类中已经实现的功能。除此之外没有其他限制。

MultiIntervalSet所应提供的方法包括:

创建一个空对象: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] }。

⚫ …不限于上述方法,你可以继续抽象需要的其他全局共性方法

为上述各方法设计 Spec,并据此设计相应的测试用例。

进而,设计 rep、RF、AI、Safety from Rep Exposure,实现各个方法、 checkRep()、toString(),其中 toString()将对象内容表示为人容易理解的 文本字符串形式。

3.3.1 节里的三个“注”,对 MultiIntervalSet 来说仍然有效。

问题:考虑 MultiIntervalSet和 IntervalSetSet之间的共性和差 异,它们二者可以进一步抽象形成一个更高层次的 ADT 吗?如果可以,你可以不 受本节要求的限制,使用一个 ADT 来替代这两个 ADT。

在ADT的复用中,不仅仅是像面向场景的编程的函数的复用,ADT能够复用数据结构和一系列方法,就像c语言,多个程序复用性更低

重新思考Lab2中的问题:为ADT撰写复杂的specification, invariants, RI, AF,时刻注意ADT是否有rep exposure,这些工作的意义是什么?你是否愿意在以后的编程中坚持这么做?
时刻提醒编程者要注意表示泄露等问题,这些工作能够为在一定程度上指导编程的进行,提高编程效率。会。

之前你将别人提供的API用于自己的程序开发中,本次实验你尝试着开发给别人使用的API,是否能够体会到其中的难处和乐趣?
需要考虑的层面太多,挺难也乐在其中。

你之前在使用其他软件时,应该体会过输入各种命令向系统发出指令。本次实验你开发了一个解析器,使用语法和正则表达式去解析输入文件并据此构造对象。你对语法驱动编程有何感受?
更加便捷直观。

Lab1和Lab2的大部分工作都不是从0开始,而是基于他人给出的设计方案和初始代码。本次实验是你完全从0开始进行ADT的设计并用OOP实现,经过五周之后,你感觉“设计ADT”的难度主要体现在哪些地方?你是如何克服的?
ADT编写,子类的构思,区分差异方案的选择

“抽象”是计算机科学的核心概念之一,也是ADT和OOP的精髓所在。本实验的五个应用既不能完全抽象为同一个ADT,也不是完全个性化,如何利用“接口、抽象类、类”三层体系以及接口的组合、类的继承、设计模式等技术完成最大程度的抽象和复用,你有什么经验教训?
java中的类都是围绕着类进行的。可以通过创建新类来复用代码,而不必从头编写。可以使用别人已经开发并调试好的类。此方法使用的窍门在于使用类而不破坏现有的程序代码。达到这一目的的方法有两种。第一种方法非常直观:在新类中创建现有类的对象,通过现有类的对象调用其中的成员,来达到复用代码的目的。由于新类是由现有类的对象所组成的,所以这种方式称为组合。该方式只是复用了现有程序的代码,而并非它的形式。

关于本实验的工作量、难度、deadline。好难
到目前为止你对《软件构造》课程的评价。好难
————————————————
版权声明:本文为CSDN博主「HITyyzh」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/HITyyzh/article/details/118420378

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值