北航OO第四单元及课程总结

北航OO第四单元及课程总结

一、第四单元架构设计

在第一次作业中,因为只有类的查询,故只有MyClass,MyInterface,MyOperation三个主要的类,将这三个类根据UML_INTERFACE_REALIZATION,ParentId,封装在一起,注意到数据限制类只能单继承,接口可以多继承,于是我们的MyClass父类只有一个,MyInterface的父类就用list去存。

在之后的开发中,考虑到UML图的多样性,可以实现一个通用的查询接口,在起内部对每一种类型(类图、时序图、状态图 ...)分别构建查询器(xxxQueryTool)。通用查询接口中不保存实际的建模信息,这样实现了通用性,新加类型的时候可以不删除代码,只进行添加即可完成功能的新增。

对于建模过程,由于给定模型符合java8标准,也就意味着可以用相似的结构来将元素转换成各个类之间的组合关联等关系。于是可以构建自己的各种模型类,将官方的各种Uml元素封装起来,如封装出MyStateMachine,MyInteraction等。

建模过程是对于各个查询器来说独立的。实际实现的时候,通过多次遍历所给的UmlElement,将各种元素按照相互的依赖关系,理清所处的层次(类似于在json树结构中的深度),先建第一层,在建第二层、第三层......

对于具体的查询指令,这里想说一下有关于递归查询的部分。由于接口是可以多继承的,那么在考虑父类的情况下,时间复杂度就不是线性增长的了。这时要用到记忆化。由于这类查询指令具有无后效性(应该可以这么理解),那么就可以在搜索的过程中,将中间过程答案存储下来,减少杜绝重复计算。

二、架构设计思维/OO方法理解演进

第一单元

第一单元的设计是第一次进行如此大代码量的开发,而通过学习第一次上机的代码也让我对层次化的设计有了初步的认识。最终我基于表达式、项、因子的三个层次的结构,对表达式解析程序进行扩展,完成了第一单元的作业。

第一单元让我理解了好的架构在迭代开发中的优势,并且在其中我也通过字符解析器的复用,对面向对象编程中类模式的优点有了更好的感悟。

第二单元

第二单元是面向多线程的编程,一开始对多线程的理解不到位。对同步块的设计和notifyAll的设计一度影响了面向对象的架构,并且在第五次作业的强测中尝到了苦头。后来我采用了精细化管理的思想,按照请求电梯种类、请求电梯轨道、请求纵/横向电梯具体楼层/座、请求运行方向四个层次,对乘梯请求进行了精细化的索引管理,重构实现了横向电梯及换乘。

第三单元

主要内容是对JML规格化语言的理解。本单元的作业已经给了我们整体的架构,因此我们只需要阅读JML语言并进行“完形填空”即可。几乎没有什么构架设计,就是按接口写函数。由于构建命令和查询命令的缘故,以部分数据结构的空间换时间,达到降低复杂度的效果。

第四单元

第四单元和第三单元类似,UML图也给了我们很明确的结构,我们要做的就是重新建立起UML图中各的元素及其结构关系,从而实现对UML图的解析。而在经过前三个单元的磨炼之后,我已经能熟练的运用面向对象的思路,对UML图中各元素分别作为类来实现,并设置合适的抽象接口重新将UML图的结构在java中还原,取所需而用,设计上更加自然了些,也用包来视觉优化了代码结构。这便是UML自动解析转换的目的所在吧。

三、测试理解与实践演进

  本学期的四个单元的测试我都是通过手动构造和自动测评的方式来实现的。在完成代码后先构造测评机,通过大量的数据测评来验证我程序的正确性。然后通过手动构造比较极端的的数据,来检测程序的性能。   测试在我看来主要是为了检测程序的正确性和性能问题而进行的。一个合理的测试能够保证程序的有效性。在数据构造时,通过确定的规格、利用随机的方式将所有可能的输入进行组合,可以对于各种情形进行验证。虽然这样对于特定的情况可能会出现纰漏,并且需要很长的时间进行验证,但是总体上来看仍有较强的实用性,同时构造方式简单。除此之外,也可以进行相应的特定组合进行验证,辅助随机测试。例如将生成每一种情形下确定的异常输入,进行错误判断等。   总而言之,通过不同方法组合来构造测试,可以较好的验证程序的正确性。

四、课程收获

养成了好的编程习惯。感受到了开始写代码前设计架构的重要性,动手前尽量完善的思考可以避免许多bug,甚至是重构。

形成了面向对象的思维模式,也掌握了Java这门语言。虽然从开学第一周就感受到了这门课程带来的压力,但是也能感受到自己迅速的变化,同时收获满满的成就感。

了解了关于多线程、JML规格、UML图、Dijkstra算法等的许多知识,并且在此基础上有一些实践。虽然是在学习面向对象的思维方式,但是也接触到了很多不同方面的知识,也感受到了OO这门课设计的用心。

面向对象的实验内容包罗万象,四个单元各自囊括了不同的内容,也在和同学们的交流当中发现了其实每个单元的内容仍可以深挖,每个知识点的背后都有好几本著作可以深入学习,面向对象这门课程是我们通向更多编程思想的引路人。通过这门课我体会到了面向对象层层调用的高明之处,将任务从大到小分为几个层次的思想,不仅对任务实现的严谨性有帮助。写代码的过程中,有些有一定复杂度的程序,在编码时也可以拆解成大任务与细分任务,编码过程如果很懵逼,也可以先在容器类中写“伪代码”,然后再在各个类当中编写各自的实现方法。

五、课程改进建议

  • 为了让指导书的实现重点和细节更突出,可以将重点部分与其他部分分隔开。并发放PDF版本的指导书。

  • 实验课可以公布结果,不然无法确定正确性,削弱实验课对同学们的提升效果。

  • 增加预习时间的同时,增加关于如何编写测评机或如何学习编写测评机的教程内容。每个单元的总结都有测试方法的分析,但是对于从没接触过测评机的人来说,在学期内学习编写测评机还是很需要时间和精力的。

posted @ 2022-06-29 14:05  Charlie_Cosmos  阅读(27)  评论(0编辑  收藏  举报