OO第四次博客作业

经过一个漫长的学期,我们终于迎来了OO的最后一次博客作业,回顾熬夜debug,连续12小时爆肝写代码的OO时光,我付出了许多努力,也收到了相应的回报。看着我四个单元的代码,我感触良多。

(1) 第四单元架构设计总结

第一次作业主要处理的是类图,因为Uml类和Uml接口的行为和属性类似,我把它们整合到同一个容器中;另外,我新建了一个关于操作方法的内部类,以储存方法中出现的变量。比较耗时的方法例如寻找父类,继承,关联的方法,我统一在构造方法的结尾对元素进行遍历查询并储存,其余的例如查找属性等方法,我就在查询指令到达的时候再开始计算。

复杂度分析:第一次作业基本复杂度比较高,而构造方法和对方法属性计数的方法三种复杂度均比较高,分析原因是在构造方法中耦合了大量处理不同数据的方法,体量非常大;而关于操作方法的内部类完全没有处理数据的能力,我几乎是一个方法完成了寻找方法——遍历属性——计数中的所有操作,非常臃肿。

第二次作业总体难度不大,只要理解了各个元素之间的层次关系就可以比较容易地写出代码。我为新加的顺序图和状态图各新建了一个类以处理它们,原有的代码基本没有变化。但是这次作业出现了一个非常实际的问题:由于功能的增加和导入规则的限制(不能使用*形式的导入,只能一个一个地导入),非常容易出现超出500行限制的文件,除了使用面向对象的思想去内聚方法的方式外,还可以采用继承的方式,把两次作业的代码拆分成两个类。

复杂度方面,除了第一次作业带来的问题外,没有出现其他恶化架构的问题。

第二次作业的UML图:

可以看到,架构的层次还是比较简单的。不同的元素由不同容器负责,互不干扰。

反思:写完第一次作业后,在修改代码风格的时候,我发现容器中有不少属性是无用的,另外,我在储存UMl元素的时候,浪费了许多空间:例如,我不需要把Umlclass元素直接存入容器中,只需要把其id存入,通过id检索元素即可。

在面向对象的思想方面,我也有不足之处:首先,对于“类或接口”这一对象,我没有为其构造相应处理的方法,内聚的程度比较低,对容器的处理几乎都是在容器的外部实现,容器本身几乎没有处理数据的能力,经常出现调出一个容器——修改容器内某个元素的内容——重新储存容器的过程,导致代码十分臃肿,也不便于debug(实际上,这两次作业,我都出现了因为代码可读性太差,遗漏了某些条件或直接写错了引用的错误)。

(2) 总结自己在四个单元中架构设计及OO方法理解的演进  

经过四个单元的学习,我对架构设计有了一些自己的理解,在一次又一次作业中不断进步。

首先是层次化的思想应用,例如在多项式求导中,把多项式分为多项式,因子等不同层次;在Uml解析中,有继承,实现等;

另外是对可扩展性的要求,在多项式求导和电梯作业中,我的代码因为架构问题,可扩展性非常低,大部分代码在迭代时都不得不重构;而在后两个单元的作业中,这个问题得到了较好地解决。我较好地组织了数据结构,避免了大幅度的重构。

对于OO方法的理解,我在四个单元的学习中也在不断进步,从第一单元的一个类莽到底到第四单元使用继承等方法分层次地对架构分类,尝试把处理数据的方法内聚在各个类中,降低耦合度。代码可读性和可扩展性也在不断变好。我感觉在面向对象的学习中,自己的收获非常大。

(3) 总结自己在四个单元中测试理解与实践的演进

第一个单元的测试更多地处于一个相对较低的层面,因为处于刚开始学习的状态,我们基本上就是在不停地找格式上的错误;我只是用指导书规定的格式错误构造不同的样例测试。

第二个单元开始,构造测试样例的难度就开始直线上升,尤其在规定了输入输出后,错误更多地出现在架构本身的不足上,可能是算法效率太低,导致超时或爆栈等不可预知的问题,也可能是算法上的失误,忽略了某些特定条件。这些问题很难提前预知,想找到它们,性价比最高的方法就是构造对拍器等工具构造大量样例。

在我的理解中,测试只能证明自己的程序暂时没有错,而不能保证程序面对任何输入都能得到正确的结果。尤其在程序代码量越来越大,架构越来越复杂的情况下,想要自己的程序可以在绝大多数情况下正常工作,必须进行大量而充分的测试。

总结

首先,最开始的收获当然是java语言的学习。在OO课程之前,我没有接触过java编程,在完成面向对象学习的过程中,我对java,尤其是其中的多线程机制等有了更深的认识。多线程是我们之前完全没有接触的概念,涉及了线程之间的同步和互斥。在电梯程序的编写中,我深刻地感受到了多线程处理并行的优越性,并对其有了更深的了解。

其次,是面向对象的思想,在学习OO课程之前甚至在课程的前几次作业中,我一直使用的是面向过程的思想,直到最后一次多项式求导作业,我才真正用上了面向对象的思想。把多项式分成了因子,项等层次不同的元素,极大地提高了编程的效率和代码的可读性。在后来的作业中,我越来越多地运用了面向对象的思想,代码的架构越来越清晰。

再次,是各种不同工具的使用,junit,JML规格,StarUml,各种命令行工具的使用为我们的面向对象学习提供了不少助力。

改进建议

第一,希望OO实验课可以有课后反思和讨论的环节,可以提供标答或者标准程序。每次实验课后,我不知道自己的水平到达了何种程度,理解是否正确,如果有课后的解答会很有帮助。

第二,希望实验课和理论课的时间可以稍微错开,避免上午刚讲完课,没有时间去复习理解,下午就急急忙忙地进行实验课。

第三,希望课下作业可以有更多时间,目前的四天时间看似很多,但包括了上课的时间(还有OS上机的时间),我每一次写OO的时间经常少于两天,当作业难度较高时,感觉时间严重不足。

posted on 2019-06-22 17:39  yezefeng12138  阅读(106)  评论(0)    收藏  举报

导航