面向对象设计与构造2019 第四单元总结博客作业
一、本单元两次作业的架构设计
Homework13:
本次作业的架构较为简单,除了Main类和官方要求的接口实现类MyUmlInteraction类以外,我还自己创建了三个类:MyClass、MyInterface、MyOperation,这三个类分别包含着UMLClass、UMLInterface、UMLOperation这三个类,类似于继承的思想(没有直接使用继承是因为不方便调用构造器)。之所以选择这三个类,是因为这三个类内要么包含着需要查询的直接下属,要么类的对象之间存在关联/继承关系,便于构建链表图。具体类图如下所示。
Homework14:
这次作业写了1500+行代码,架构较为复杂,基本沿用上次的思想,将存在关联关系或者需要直接查询下属的类进行包装,便于构建适合自己的数据结构。基本是上次作业的扩展版,没有增加难度。类图如下所示。
二、架构设计和OO方法理解的改进
在这四个单元的学习中,我真切的了解了面向对象思维,并渐渐的学会将自己的程序从面向过程式的程序向面向对象转化。
在第一单元的作业中,面临第三次作业的大型挑战,我的程序设计极度面向过程和线性,类图也是“长条”状的。并且,程序内耦合程度极高,为了修复一个功能的bug,我需要修改多个类以及他们之间的代码,代码“低内聚高耦合”,给我写程序和debug带来了不小的麻烦。5行代码的限制根本无法修复一个bug,因为我需要修改多个类。
第二单元的作业中,由于提供了官方输入包,我所需要的类更少了。关于电梯的整体运行,我很难将其拆分为多个对象,只能让一个Elevator作为一个类来执行。每个电梯之间确实可以相互独立,但是电梯内部的代码过多,导致也不算是很好的面向对象的程序。
第三、四单元的作业相对轻松,类之间的耦合程度也变低了。而且,由于提供了官方的开源包,我们得以阅读助教的优秀代码,可以以更高的标准去学习和要求自己,架构的设计也越来越合理。
三、对测试理解与实践的改进
(常凯申将军说得好)
测试是OO课程中重要的一环。善于发现自己和别人的bug,会很大程度上影响到OO的分数。在第一单元之前,我是从来没有用过对拍器、数据生成器一类的东西,也从来没有接触过python语言,命令行脚本。但是,OO的强测和互测那高额的bug成本,逼迫我们不得不学会去测试。
测试方法其一是JUnit。JUnit的优点是方便、细致,可以以便捷的方式细致到对单个方法进行测试。但是,JUnit毕竟是白箱测试,对于构造大量的数据和随机的数据存在难度。我也只在第三单元需要对图结构的时间进行统计的时候使用了JUnit,其他时候基本没有使用。
测试方法其二是借助python语言搭建简易评测机,模块包括测试数据生成、执行java程序,输出结果判断正确性等。我从第一单元第三次作业开始初次接触python语言,如今的对拍器已成体系,基本每次作业都可以做一些或简单或复杂的对拍。得益于此,我的OO作业也在第一次作业之后,在强测和互测中没有出现过任何bug,这是对拍器的功劳。
当然,我相信老师更倡导多样化的测试方式,对对拍器的过度依赖会导致对程序细节的理解不够到位,总是以整体的输入输出角度去评判程序的正误,而没有在细节上检测是否没一个步骤都完美无缺,是否有错错得对的成分。在以后的编程过程中,OO课程的经历一定会给我重要的帮助。
四、总结自己的课程收获
1.学到了OOP的思维模式,对我踏入现代大型程序的编程帮助极大。
2.(半强迫的)自学会了Python和对拍器的写法,能帮助我de出许多bug。
3.因为有作业这个共同的“敌人”,我通过OO结识了许多大佬。
4.学到了CodeStyle、JML、UML等规范程序、代码的标准规范,让我对程序的理解更深一步。
五、为课程提三个具体改进建议
- 实验课希望恢复到双周一节,一节时长为一个下午,和OS实验课类似。在实验课上,希望既不是写一些无关痛痒的填空和一些不知对错的奇怪现象,也不是写一个根本写不完的程序,而是能够立足于课上讲的内容和作业中存在的问题,编写一个小体量或者中体量的程序。比如有一次实验课编写含接口和继承的公司人员程序就很好,但是时间过短,很多人没有写完。这种程序放到一个下午去写,应当是非常好的OO学习资料。
- OO作业的难度最好是整体循序渐进,而不是以单元为分界线难度渐进。在写OO第三次作业的时候,大部分人还不具有轻松驾驭超过500行代码的能力,导致很多人在写第三次作业的时候过的十分难受,甚至成了OO的“劝退作业”。而UML部分作业又显得过于简单,虽然有考虑到考期的成分,但是也不能够差距如此之大。希望难度能有一个适当的调整,可以是单调递增的难度,也可以是单峰式的难度,但是最好不要以单元为单位调整难度。
- 关于互测机制,希望能够减少互测屋内的人数,7~8人实在太多,根本不可能去仔细阅读大家的代码,尤其是代码量过500行之后,阅读起来是很痛苦的事情。有些人选择使用对拍器整体评测,有些人选择直接佛系互测。虽然本学期的互测机制相比于往年有很大的改进,但是互测机制依然还有改进的空间。