2020北航面向对象第四单元总结

2020北航面向对象第四单元总结

第四单元架构设计

上图是第四单元第一次作业的架构,在要完成的主类当中管理着类与接口的管理元素,提供了需要完成的查询方法,其余的方法均为构造方法的附加方法,分别添加类之间的关系、实现、继承,为类添加属性,将参数和操作组合加入。我在第一次作业当中分别定义了ClassManager,InterfaceManager,OperationManager三类,分别对应管理类数据、接口数据和操作数据。ClassManager包含他管理的类,他关联的类,类内的属性、操作,实现的接口以及其父类。InterfaceManager包含他管理的接口以及他的父类。OperationManager包含他管理的操作以及他的参数。在查询时能够分层地进入并查询数据,对数据进行统一的管理。由于在查询时使用的是name查询,而每个元素对应的是一个id,因此在TheUmlInteraction中定义了一个HashMap<String,ArrayList>用来管理name到id的映射,之后的name到id的映射都是如此完成。

上图是第三次作业的架构,第二次作业的架构完全包含在上图之中,第三次作业并未改变架构只是在对应的类添加了相应的check方法用来在生成完毕后进行错误检查。第三次在第二次的基础上将主类分成了ClassPart,StatePart和InteractionPart三部分,三部分分别对应类图,状态图,顺序图的生成管理和查询操作。下设了众多manager,在此不做叙述,在图中可以看出他们的调用关系,manager的组成和功能与第一次作业相同,对其所包含的数据类进行统一的管理,在查询时能够进入相应的manager逐层进行查询。第二次作业应该是三次作业当中最简单的一次,对于第一次的架构没有任何改动,在时序图以及状态图的构建上也与类图的构建类似,值得关注的是我在状态图中保存了初始状态、结束状态以及普通状态,然后他们的转移路径我用HashMap<String,ArrayList>的形式存下,Key是状态的id,动态数组中存放可达状态的id,实现了对状态图的记录,还有一点特殊的地方是,因为查询时使用StateMachine的name,region属于StateMachine且一一对应,其余的元素属于region,因此我在管理region时将其和StateMachine使用HashMap进行一一对应,类似翻译的形式。而时序图更简单,记录所有元素,然后在生成时记录每个lifeline收到的消息数。

第三次作业在第二次作业的基础上没有更改架构,只是向部分manager中添加了本次额外需要记录的数据。在ClassManager中额外记录其关联的associationEnd信息便于查询R001,在interface加入其应当管理的属性和操作(第一次就应该加入,但鉴于第一次并未使用未加入,是错误的行为)。本次的实现方式在修改完架构之后就非常轻松了,R001遍历类的内部管理查询是否有name对应多个attribute或end;R002对interface和class管理的父类进行深搜观察能否回到原点;R003对接口进行深搜,观察记录点是否有再次到达的现象来判断类是否重复继承,R004在R003的基础上先对class深搜再对interface深搜观察记录点是否重复到达;R005-R008遍历查询即可相比前四个简单,完全依赖于架构。难点仅仅在于梳理清楚自己生成类之间的依赖和组合关系。

架构设计及OO方法演进

回顾自己在第一单元所写的作业,确实是惨不忍睹,第一次的作业直接在main当中进行构造,对于写出的两个类更多的是当作数据结构在使用,拆分保存一一求导,实际上更像是一次用java写完的数据结构作业。第二次我新建了更多的类,希望能够让自己的程序更加的面向对象,然而现在来看仍然是不伦不类的存在,我将整个程序拆分,并不是依照他们的功能进行的拆分,而是把整个程序的运作流程拆分开来,将每一步放入了不同的类,类的职责混杂,将三种类型的幂函数在一个类内存储并用int来表示他们的类别,回顾看来可以说是非常差了。第三次作业的结构经过老师的指导好了很多,但是在命名、逻辑以及程序的书写方面还是很差导致现在甚至已经无法看懂每一步在做什么了,并且三次作业几乎次次重构可以看出十分不面向对象。我的第一单元整体还是像在熟悉java,对面向对象更多的是熟悉类的划分。

第二单元的电梯整体看来效果较好,算是较为符合面向对象思想的程序了,三次作业全部在迭代情况下完成,整体的架构几乎没有变化,只有对电梯种类以及运行策略的修改,算是自己第一次比较真切地感受到面向对象程序是什么样子的并且体会到了它的好处,对于类职责很明确,对于他要进行的不同动作采用不同的方法进行管理,内部属性仅包含必须的属性,关联的类内部则管理其他类。并且在这个单元还学习了多线程,按照线程进行划分,对于面向对象的体会更深了一层。

第三单元的jml说是写规格,实际上我认为考点更多地在于算法考察,依照jml写出来的代码可以说是非常的面向对象了,但是由于结构本身是由老师以及助教通过jml的形式梳理后交给我们的,我们只需要理解和实现即可,因此这单元的作业虽然非常符合面向对象的思路,但是实际上并不是我自己的功劳。尽管如此,这单元还是让我更加深入地体会到了面向对象的代码应该是什么样子的并且同时还熟悉了jml。

第四单元是UML,让我从图形化的角度更加直观的感受面向对象的思想,根据UML图的划分很轻易地就能够完成分层,在已有的类上完成数据的管理,尽管这次的管理有冗余也有缺少,但是较为符合面向对象的标准吧,对于每个查询方法或者检查方法都能够层层深入在需要完成的类内部 直接添加相应的方法而完全不影响其他类,这也是我在15次作业课下发现了较多bug,但是每次都能够很快改出来并且只需要修改小部分地方的原因吧。我认为在层次化、模块化方面做的较为不错,但可扩展性还是稍微差了一些,在第三次第二次中都多多少少对之前的架构进行了微调为了能够适应。

整体而言,经过一学期的训练,对于类和方法的构造能力提升了很多,但是在有逻辑有条理的书写程序这方面还需要大量的练习来改进。

测试的理解与实践的演进

比较遗憾的是在整个OO的学习过程中我在测试当中唯一的进步可能就是会采用junit对方法进行功能上的测试,剩余地更多还是人工构造样例,构造一些一般数据测试基本功能,构造极端数据诸如null等等进行测试,没有对自动化测试是本学期学习当中的一个败笔。在互测方面,只有一二单元我浏览了同学的代码,但我的纠错能力并不是很强,通常在阅读的过程中被带入这个同学的想法当中而难以找出错误,很多时候提交的数据也都是自己认为容易出错的数据或者是自己在测试中产生问题的程序,针对性并不是很强,结合OS的情况来看,我阅读代码的能力非常的弱,需要练习来提升。

总体而言,只有第四单元我进行了较为充分并且满意的测试,对于不同的功能进行了不同可能的测试,并采用debug的方式查看运行过程是否出现了与预期不一致的情况。测试程序对于最后的结果还是起到了很大的帮助的,一个好的程序员一定兼备写代码和写测试的能力,只有更多更强的测试才能有更稳定性能更好的代码 。

课程收获

在本课程中首先是对于java有了一定的了解,包括基本的语法,多线程,jml以及uml都有了不同程度的提升。第一次体验互测,感受了一次检查别人程序的过程,看到了很多好的模范代码,同时也发现了一些自己可能犯的问题。对于设计模式进行了学习和使用,感觉功能性和实用性都很强。在完成作业的一步一步中对于面向对象的了解更加深入了,并且自己也能够写出像模像样的代码了,感觉这种思想自己也能够应用到之后的课程以及学习当中去。

课程建议

  • 实验课能够进行一些反馈,实验课完成的任务都很具有参考价值,但是既没有答案也没有分数,后续甚至不能看到实验内容,感觉本来能提供的很好的学习效果白白丧失掉。
  • 在pre阶段能够提供给一些java基础方法学习的途径,在开始的时候只有作业,很多基础的内容我都是询问同学才得知,虽然这门课程是面向对象,但也希望课程组能够考虑到有同学第一次接触java,能够分一部分时间进行java语法的学习,在后面的课程中才不会走弯路。
  • 互测房间人数可以减少一些,8个人的房间让每个人去读完7个人代码,量实在太大,如果不读代码只采用盲目提交数据或者自动化测试我想又丧失了互测希望提高同学hack能力的本来目的,因此我认为可以适当减少房间内人员的数量,应该还是以阅读代码为主,而不是像这学期的OO课程中多数人只是为了多得分而多hack甚至多次hack同质数据。

线上课程体会

说实话我认为课程没有受到影响,反而我能够反复观看课程的内容,对其中的思考题进行暂停然后作答,提升了学习的质量,认为美中不足的地方就是说思考题有的时候难度较大,无法线下和同学们交流导致得出的答案完成度会比较低,并且讨论课在线上进行虽然该分享的东西都分享到了,但感觉没有了线下交流的气氛了,大家提问也都不是特别积极感觉是一个遗憾的地方,但总而言之线上课程并没有影响到对知识的学习,我认为OO课程还是让我收获了很多。

posted @ 2020-06-14 23:08  18373102  阅读(204)  评论(1编辑  收藏  举报