面向对象第四单元总结

面向对象第四单元总结

一、本单元作业的架构设计

  第四单元作业​的整体难度不大,和上一单元的图论课程相比更加的OO,我也运用了很多层次化设计的方法。不同于以往的作业,这次有大量的UML概念,官方接口有大量的源码要阅读。由于课程组在一定程度上进行了类图关系的化简,所以总体来说并没有很难的编程问题。但是还是存在着一些困难:在阅读程序源码时出现了很多处地方用法太高级,基本看不懂,虽然里面很多的方法只是用于读入,不需要我们理解,但还看不懂总是有些恼人的。在作业架构上我采用层次化架构,主干逻辑和各个底层类各自有自己的属性,自顶向下的实现各个方法。

作业的类图:

 

  这一单元的作业还涉及了UML状态图和时序图的分析,虽然和类图的分析大同小异,但还是有难度的。主要分析方法是找好了每一种元素各个参数的具体含义,再进行封装和计算。但架构基本上是一致的,都是分层实现功能,自顶向下实现方法。

  同时,这次作业涉及的内容比较复杂,所以构造测试用例也是一个难点。构造数据既要针对边界数据,比如自继承、接口的多继承等,同时也要考虑在各种元素的输入顺序并非正常顺序的时候,必须保证程序的鲁棒性,不能出错。

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

  架构是课程一直强调的部分,经过四个单元的学习,我对架构设计有了一些自己的理解,在一次次的作业中也使用了很多架构,了解到了它们的好处。

  首先是层次化思想的应用。例如在第一单元多项式求导的作业中,把一个长多项式分为短多项式,再进一步分成因子等不同层次。层次化设计的好处是各个层次各司其职,不会相互影响导致谜之bug。其次是对可扩展性的设计,在多项式求导的作业里,我的代码因为没有考虑可扩展性,大部分代码在下一次作业里都不得不重构。所以在后面几个单元的作业中,我规划了使用的数据结构,为后面作业的扩展留下了空间,避免了大幅度的重构,扩展性的问题得到了较好的解决。

  第一单元主要是接触面向对象,初学时不懂继承和接口等工具,导致作业就没有什么架构,作业完成的也比较吃力,但经过这一单元的作业,我相信大部分同学都掌握了JAVA程序的各种特点,以及明白了架构设计有多重要,为后面的作业做了铺垫。

  第二单元作业是多线程电梯。这一单元架构设计非常重要,我的电梯使用的架构就是生产者消费者模式,在设计过程中也注意着扩展性的要求,第二次更改调度算法的作业完全继承了第一次的架构,算是比较满意的。

  第三、四单元作业的主要架构很类似,都是需要实现数据的保存和分析。我在架构设计时都坚持着降低耦合度的原则,尽量做到数据分离,但是有几次作业还是写的很难看,测试中出现了一些问题。这两个单元作业都是管理-查询的套路,只要有一个良好的架构,就能比较清晰的完成作业。

  我在四个单元的学习中对于OO方法的理解也在不断的加深,从第一单元的一个类写到底到第四单元可以使用层次化方法抽象的构造架构,数据处理方法从混在一起进步到分布在各个类中,降低耦合度,代码可读性和可扩展性也在不断变好。在面向对象的学习过程中,理解模型化设计的思想,训练架构与设计的能力,这应该是最大的收获。

三、测试理解与实践的演进

  OO课程对于测试非常重视,本学期学习的测试方法有Junit单元测试和OpenJml规格测试。

  第一单元我对测试的重视程度还不够,导致强测和互测都出现了没有发现的bug。只靠自己构造的数据是不靠谱的,很容易在边界上出现问题。

  第二单元电梯的作业,测试主要通过手动构造不同的数据来检查电梯运行的正确性,尤其是第二、三次作业,为了保证换乘时不出现意外,需要针对不同的换乘情况分别构造测试样例,来检查电梯的运行逻辑。如果考虑性能,更是要仔细考虑边界条件,通过测试不断改进调度。

  第三单元的测试和以前的编程课程更相似,有了唯一的正确输出。这一单元已经由官方包已经实现了代码的架构,测试的重点是精确打击。在测试时主要针对各个指令进行精确覆盖的测试以及对整个程序的复杂度和鲁棒性进行压力测试。

  第四单元的测试比较特别,不能随机生成数据了。所以主要是通过构造UML图来测试程序,针对一些边界情况,画出各种坑人的UML图。UML图,尤其是JAVA8的限制给代码的测试带来了很大的方便,不用考虑太多的奇葩情况。其中比较难的是一些语法,平时没怎么用过,但确实是合法的。比如,第一次作业我是在最后一天才得知接口可以多继承,导致重构火葬场。

四、总结自己的课程收获

  首先是JAVA语言的掌握。在IDEA这个强大的平台上我从一个初学者逐渐掌握JAVA的各种用法。虽然JAVA语法不是课程重点,但优秀的oo程序确实离不开对JAVA的熟练运用。另外特别感想研讨课上同学们无私的分享,帮助我理解了课程里的各种概念,解决了很多问题。各个单元的收获主要有:

  JAVA基本语法、方法和属性的调用及访问、同步互斥机制、多线程开发、JML语言、UML基本知识、类图,顺序图,状态图等。

  课程组一直强调不要急于编码,先设计后实现细节,在经历了四个单元的作业后我大概理解了OO的思想,拿到问题不是直接写,而是有了先思考架构,分析需求,完成后还要测试,注意代码风格等等习惯。在学习过程中我们也接触到了uml、jml等辅助工具,提前接触了工程开发的各个步骤,整个课程也很像一个完整的开发过程,从设计到测试和分析。总之,OO课程带来了很多和其他的课程不同的体验和收获,这也离不开老师和助教们的辛苦工作。

五、提三个具体改进建议

1.互测人数的动态调整

  因为四个单元十几次作业的难度不同,互测时需要阅读的代码量也有多有少,有时候在互测环节只能仔细看部分人的代码,尤其是第二单元多线程的作业,每个人都有不同的实现方法,电梯运动路线又不是唯一的,这样就导致有时候靠运气找bug。建议根据作业的难度以及代码量动态调整一个互测屋里的人数,以达到更好的互测效果。

2.继承多态的应用

  封装继承多态是第一单元学习的内容,但表达式求导里的继承关系不太明确,像我这样前两次作业基本没有面向对象,导致第三次作业重构火葬场。建议以后更明显的引导同学们使用继承和多态思想,或者直接在指导书里进行提示就好了。

3.代码风格的检查

  今年课程加入了代码风格的检查,再也没有在一个main或者一个run里写了整个程序的了。但在代码风格检查里有一些规定过于严格,比如禁止使用import xxx.*,在第四单元必须每一种异常、每一种元素类一个个的import,类前面有一屏幕的导入有点让人头晕。我明白代码风格检查的好处,不过希望检查时能更便利一点,比如允许用星号导入最底层的一些东西。以及当前的风格检查还不能解决变量起名混乱的问题,希望明年风格检查会更好。

原文地址:https://www.cnblogs.com/chai-bo/p/11068457.html