OO第四单元作业总结

OO第四单元作业总结

一、作业架构设计

1.1第十三次作业

1.1.1设计思路

在这次的作业中,主体是类和接口,之间有关联和实现关系,类和接口内部有继承关系,其中,接口的继承允许多继承,而类的继承只有单继承。对于每一个类或者接口,都有其对应的继承列表、方法列表和关联列表,特定的,对于类来说,还包含属性列表和实现列表,通过构建树形结构来实现查询。在搜索给定的类的实现的接口时,需要递归查询其父类实现的接口和他自身实现的接口,并通过BFS查询其所实现的所有接口,之后与父类的接口合并求得结果。在查询类所具有的属性时,需考虑自身属性之后递归查询父类属性。

1.1.2类图

1.1.3存在的bug

在公测中未考虑接口的多继承,导致大面积出错。

1.2第十四次作业

1.2.1设计思路

在上次UML作业的基础上,本次加入了状态图和顺序图的解析以及检查规则。为了实现状态图的解析,将每个状态图看做一个实体,状态和转移看做图中的点和边,在查询后继状态时,只需要通过BFS即可得到结果。在顺序图中,LifeLine成为图中的点,消息的传递成为了边,统计一个LifeLine的incoming消息的数量,即是求解该点的入度值,在建图时即可完成。这两者都可以独立出来完成。在规则性检查上,对于规则一,针对模型中所有的类,查询其所有属性和关联对端的名称,如果有冲突则抛出异常。对于规则二,类和接口分别是两个图中的点,继承关系是图中的边,从每个点出发,通过DFS遍历查询是否可以回到出发点,即可判定该点是否在循环继承回路上,将所有的违规点放入集合中,然后抛出异常。对于规则三,从每个类或接口出发,求得其实现或继承的所有的接口,在查询过程中即可发现是否冲突。

1.2.2类图

1.2.3存在的bug

在本次公测中,未发现bug。

二、在四个单元中架构设计及OO方法理解的演进

在第一单元的作业中,代码缺乏可扩展性,每次的作业需要大面积重构,不仅浪费了很多时间,而且容易衍生出许多的问题。在整个架构的设计上,缺乏对继承和接口机制的灵活运用,导致代码可读性很差,冗余度很高,给优化造成了很大的不便。

在第二单元的作业中,三次作业具有明显的递进性质,在架构的设计过程中也开始考虑每次作业的可扩展性,在本单元重构较少。在多线程的设计中,notify和wait的配合使用变得尤为关键,利用这个机制可以实现进程间的通信。为了实现电梯的功能, 采用了调度器-输入器-电梯的设计模式,并借助进程间的通信实现需求的分配和处理。

在第三单元的作业中,根据给定的JML规格实现代码。与代码实现不同,JML规格描述了一个方法的行为结果,而不关心其具体实现,这就留下了许多可操作的空间。在这单元的作业中,缓存机制变得尤为重要,由于存在大量的重复查询,因此通过引入缓存机制可以有效减少查询的时间开销。在本单元的作业中,每次的作业都可以通过继承机制来进行扩展,每次只需要增加相应的功能即可。

第四单元的作业是UML分析,利用UML语言来描述类、属性、方法、接口的关系,并通过继承、实现等机制来描述彼此间的联系。由于本次的作业存在很多一对多的关系,因此树结构成为了很好的选择,为每个类创建一棵树,并在树上进行存储和查询,效率很高。之后状态图和顺序图的引入,更加丰富了UML的表达内容,使得对模型的描述更加具体,类的行为刻画也更加准确,有利于对模型功能的理解。

三、在四个单元中测试理解与实践的演进

在第一单元的测试中,着重测试了代码的正确性,其中主要针对边界条件进行测试,构造了大量的数据进行验证。由于数据的规模很小,没有对性能进行很好的测试。

第二单元是多线程的测试,由于多线程的特殊性,导致一些bug很难复现,不太容易找到程序中存在的bug,导致在面对一些特殊数据时,处理方法不够得当,出现了很多问题。

第三单元的JML实现中,虽然有自动测试的工具,但还是主要通过自己生成的数据进行测试。为了保证运行的正确性,针对每一条指令的每一个分支进行测试,尽量做到充分覆盖。而由于没有测试程序运行时间的措施,导致在第一次作业中对运行时间估计出错,大面积超时。

第四单元是UML的分析,测试主要通过自己构造UML模型来测试,针对于模型中的具体细节进行独立测试。在第二次作业状态图和顺序图的分析时,单独考虑两者的所有情况即可。而在三条规则性检查时,借助讨论区中的一些测试样例完成了测试。

四、课程收获

本次课程是我首次真正接触到面向对象编程和多线程编程,和面向过程编程不同,面向对象更看重的是对象本身及对象间的联系,每个对象都具有相应的功能并通过彼此间的协同来完成给定的任务。继承和接口实现机制保证了架构的可拓展性,可以非常方便的实现重构。在代码的测试上,也从最开始的盲目测试,转变为更加合理有针对性的测试,可以更好地实现功能的覆盖。

在每次作业中,除了需要考虑本次作业的完成之外,还需要为下次作业预留空间,提升代码的可扩展性,这就需要对每个对象的功能进行细化,将可能改动的代码局部化,在不影响其他功能的情况下进行修改。现有的一些设计模式可以帮助我们完成架构的设计,例如单例模式、工厂模式等,在保证正确性的同时也有利于提升代码的性能。

五、课程建议

5.1指导书及时更新

在第四次作业的指导书中,存在很多有歧义的地方,有些表述不够具体,有同学在讨论区询问得到答案后,是否可以在指导书中同步解释,这样可以第一时间得到信息,而不是在讨论区众多帖子中查询答案。

5.2测试时提供代码运行时间的方法

因为本地环境和测试机不同的原因,代码运行时间上存在差异,所以还是希望提供一种可以获得测试机运行性能的方法。

5.3实验课的安排

希望实验课结束后可以有进一步的补充说明,至少告诉我们正确的结果,便于我们进行改正和学习。

posted @ 2019-06-22 16:48  时过境迁~  阅读(143)  评论(0编辑  收藏  举报