oo第四单元及期末总结
一.第四单元作业架构总结
第一次UML作业:
在分析各指令所需要的信息后建立了类(class),操作(operation),属性(Attribute)这几个类用来存储分析后的结果,而接口在本次作业中与类相比只有多继承的差别,因此将接口和类看作是同一个类。在分析完之后所需的信息都储存在了我自建的类中,执行对应指令时很容易就能够得到结果。
bug分析:本次作业在对接口的遍历中漏写了遍历停止条件导致错误。
第二次UML作业:
本次作业中多了顺序图和状态图,因此建立了对应的类来储存相应的信息,对顺序图和状态图的处理与第一次作业的处理大同小异,分析出相应的信息存储到对应的类中,简单得出结果,而在检查部分,只需利用上次作业已经得到的结果进行一系列检查即可。本次作业对上次作业的扩展只是增加了相应的类,而对于上次作业的部分没有进行改变。
bug分析:本次作业在初始化过程中写错了对应的初始化条件导致有一个强侧点出现异常。
二.四个单元作业架构设计及对oo方法理解的演进
第一单元:
在第一单元作业时,只浅显地认识到需要将诸如多项式,因子,项这类元素分为不同的类进行代码的书写,但是做到的也仅仅停留在表面,每次作业都只针对了这次作业的需求去构建整个代码,而没有去考虑下次作业的可扩展性,带来的结果就是重构,每次作业都进行重构。现象就是每次作业看起来类的名字是一样的,但其实类的内容已经截然不同,并且类和类,方法和方法之间的耦合度很高,代码不堪入目。
第二单元:
第二单元的作业难度体现在多线程有关知识。首先在本单元的作业中,我的三次作业的架构都是类似的,输入,调度器和电梯三者没有进行变化,每次作业都只在上一次作业的基础上增添了一些功能,而没有大的结构上的变化,因此我认为在本单元的架构设计方面已经是初步达到了目标。然而虽然架构很清晰,但是在理解多线程相关知识时还是出现了问题,在一开始接触多线程时根本不理解怎么让它实现并发,怎么让它符合我想像的多线程运行方式,在经过一系列的思考后最终明白了如何达到我想要的效果。在理解之后本次作业就迎刃而解,没有造成太大的困扰。
第三单元:
第三单元是JML规格有关内容。JML规格是为了限制代码的一些方面,尽管它有一些不足,但是在代码的规范性方面还是起到了巨大的作用。JML与我们课程所说的架构设计也是有很大关联的。尽管在本单元的作业中,数据结构有关知识占比重更大,但事实上架构对于作业的帮助还是很大的。通过这单元的编写,我尝试了将算法和图有关内容封装到一个类中,方便使用。
第四单元:
如上所诉,在第四单元中我采用了将对应的信息解读到我所创建的类中,在执行对应指令时只需找到对应的对象直接读取信息即可,方便快捷,不会造成困扰,因此我认为最后一单元时已经能够正确运用面向对象的思想。
三.测试理解与实践的演进
从学习写代码到现在,测试都是一个必不可少的过程。充分的测试可以让我们发现代码中的错误,在静态检查代码时发现不了的错误通过数据测试可能很快就能发现,因此测试对于我们是至关重要的。而在学习oo课程之前,我测试的方法就只有简单的一种,自己想测试数据然后肉眼对比运行结果和预期结果。这种方法的弊端体现在两方面,第一,测试数据不够强,找不到代码中的bug。第二,对比很费力,尤其是在运行结果很长时,根本无法用肉眼来观察出之间的差异。大佬们提供了解决这两个问题的方法,一是利用数据生成器去随机生成一些数据,尽管可能无法遍历所有的情况,但大部分情况都能够处理到。二是利用对拍器去对比运行结果,可以轻松方便的知道自己的结果是否正确。我对这两种方式进行了简单地尝试,利用python编写了简单地对拍和生成器,效果显著,bug的数量明显下降。
四.课程收获
首先是整个课程一直在强调的架构设计能力,由于一直在强调这个点,因此即使是一开始不太明白,在查阅相关资料之后也对此有了相应的认识,虽然并不能说自己的架构设计能力达到一个什么样很高的水准,但至少是有了一定的理解,在以后的学习中会进行运用并且进行更深一步地学习。
其次是对代码的测试,从前虽然也对测试的重要性有着一定地了解但都没有很好的办法,在oo课程的学习中接触到了对拍器数据生成器等方法。还有Junit单元测试,为我们的测试提供了很多方法,也为代码正确性有了更多的保障。
还有对于代码的阅读能力,无论是每一次重构时对自己上一次代码的阅读还是在互测时对他人代码的阅读都让我对于代码的阅读和理解能力得到了很大的提高。
最后是编写长代码能力和抗压能力。oo课程每周一次作业的模式,难度还是有一些的,特别是在每一单元的第三次作业那一周,如果还有其他的事情,那简直就是噩梦一周,最后还是全部扛过来了,在这里回头去看自己写的代码,虽然很多瑕疵,很丑,但是还是有一定的成就感的,自己也能感觉到自己代码能力的提高。
五.改进建议
1.在指导书方面,尽管根据学长学姐所说,比起往年的指导书已经好了很多,但是在我们的指导书中还是会有一定的不清晰,在一些定义的书写方面可能助教认为说清楚,但是我们认为有歧义的,可以进行更细致的定义,给出一定的例子。
2.在每次作业结束后可以给出更多的优秀代码展示,如果能够参考更多优秀同学写的代码,可能我们会得到更多的提高。
3.oo实验课,似乎跟理论课和作业的联系都不是特别紧密,希望之后的实验课能够侧重对理论课知识的理解运用或者是侧重对作业有关内容的训练。
oo课程到此结束了,感谢老师与助教一学期的辛苦,也希望oo课程能够越来越好。