OO之旅到这里就暂时告一段落了,一学期以来有苦有甜有收获,用这篇博客给OO画一个句号:)

一、本单元两次作业的架构

  本单元第二次作业是在第一次架构的基础上进行扩展的。因为UML图太大,所以把第二次作业的文件树截取如下。主要思路是将UMLElement分类,设计了Builder(负责从输入中建立模型),ClassContainer(类容器,存储了类的属性、方法、接口等信息),InterfaceContainer(存储了接口的方法等),二者皆为AssociationMatter的子类(方便继承的管理),ParaContainer管理方法的参数,SequenceDiagram管理顺序图,StateMachine管理状态图。

  第一次作业强测没有出现问题,但是第二次作业wa了一个点,原因在于对Lifeline之间的Message交互没有理解透彻。在向SequenceDiagram里面添加Message的时候,我忽略了Message的target可以不指向任何Lifeline,所以导致程序运行时出现了异常。

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

  在第一堂课上,老师就为我们讲解了面向过程和面向对象思想的差别,当时虽然自己在脑海中对此是有概念的分别的,但在具体应用上还是容易走面向过程的老路,抽象程度不够,抽象层次较混乱等都是容易出现的问题。经历了一个学期的OO洗礼,我对OO面向对象的理解也在不断加深,工程和代码能力也有所提高,虽然自己的水平比上大佬还是有很大的差距,但是比起刚开始学习的自己,已经有了很大的成长和进步了。

第一单元:

  第一单元的主题是多项式求导,意在帮助我们初步理解面向对象的思想。寒假的时候,课程组给我们布置了四个小练习,帮助我们完成了java的入门。但是在第一单元进行多项式拆解的时候,我发现自己对正则表达式的理解还是十分薄弱。在第一次作业中,我直接使用正则表达式进行整个表达式的匹配,但在随后的测试中发现这样的做法会导致爆栈,所以之后采用局部格式判断的方法对多项式进行分割和捕捉。

  第三次作业比第1、2次作业的难度飞跃了许多,我才用了递归的方法。现在回去审视第一单元的代码,个人认为对于初入门的小白来说还是相当可以的(捂脸笑),但还是存在类之间耦合有些严重,部分方法复杂度过高的问题,不过因为完成代码后已经心力交瘁,所以放弃了算法和架构上面的优化。

第二单元:

  第二单元的主题是多线程电梯调度,这个单元也是我翻车最严重的一个单元。从第一次作业开始我都用wait和notify的方法进行线程进行调度,中间也出现过死锁的问题,不过在同学的帮助下也都很快地解决了。这个单元暴露出来的问题比较多,主要有以下几点:

  1. 测试不充分。第二次作业测试数据不充分,结果出现了电梯结束运行的条件判断错误,强测只通过了3个点,并未入围互测,后再修复bug时只加了一行,多么痛的领悟,也是OO课程中最大的遗憾。
  2. 代码实现能力太弱。第三次作业我用了将近一天的时间进行设计,但在后续代码实现的时候偏离了自己的预想(代码朝着不可控的方向发展了)。最后虽说代码能运行,强测和互测也没出现问题,但是代码结构混乱,代码可读性极差。

第三单元:

  第三单元的主题是JML规格练习,难度较小,这个单元数据结构的成分比较浓。总的来讲这个单元的难度并不大,即使是第三次作业代码量也不是很大。三次作业我都采用了Floyd算法,没有出现超时等情况。第三次作业可能相对复杂一点,在自己思考之后没有比较妥当的解决方法,之后参考了讨论区的做法,在同学的指点下也顺利完成了作业,强测和互测都顺利通关。这个单元虽然难度不大,但JML规格在工程开发中发挥着举足轻重的作用,对我们以后的项目至关重要。

第四单元:

  收尾单元,个人感觉架构设计和代码实现难度都不大,但UML类图中的很多细节需要注意,确实没想到最后一次作业又被绊了一跤:(

三、在四个单元中测试理解与实践的演进

  1. 构造数据。在第一次研讨课上就有同学分享了构造数据的方法,听了该同学的分享之后,我也会在写程序之前、进行架构设计的时候构造一些数据,效果还不错,不仅有利于代码实现,也方便检查架构的模块检查。不过在完成代码之后还是要检查数据,尽量避免数据不全面导致的悲剧。
  2. 评测机对拍黑盒测试。一学期来受到了同学的不少帮助,虽然随机测试定点爆破的可能性不大,不过基于大数据量,还是能帮助我们找到一些bug。
  3. “白盒测试”,基于Junit的测试。第三单元我才用了这种测试方法,自动化测试可以帮我们排查程序的基本功能,写测试的过程中也有助于我们降低程序的耦合度,有利于程序的进一步扩展。

四、课程收获

  1. 面向对象的思维:面向对象的出现是为了弥补面向过程的不足,这种思维方式更贴近生活实际,如果抽象层次得当、架构合理,就可以写出扩展性更强的程序。
  2. 各种工具的使用。starUML、jprofiler还有idea中的各种插件,都帮助我们活得更好的编程体验。
  3. 更好的编程习惯。OO课程不像之前的C语言和数据结构,每次project的代码量都不算很小,为了更好地完成作业,我们需要在每次动手写代码之前认真地读指导书,花很多时间进行架构设计,写完代码还需要用checkstyle进行风格检查。一学期下来,可以看到自己的代码确实有了很大的进步。

五、对课程的具体改进建议

  1. 每个单元的三次作业之间难度衔接不太合理,可进一步修改。
  2. 关于实验课的安排。上机实验的内容基本都是上午刚讲的新内容,对于刚学习的同学可能很难完成实验任务;实验课的内容最好给同学们一些反馈。
  3. 对于每次作业可以多给大家提供一些优秀作业或者标程,方便大家学习和反思。
  4. 如果指导书对其中一些规则难以用自然语言描述清楚,可以多给一些样例便于大家理解。
  5. 优化测试样例,减小出现中测过弱强测爆炸的情况。