【OO学习】OO第四单元作业总结及OO课程总结
第四单元作业架构设计
第十三次作业
第十四次作业
总结
这两次作业架构思路上是一样的。
- 通过将需要使用的UmlElement,封装成Element的子类。每个子类存储相应的UmlElement,以及需要保存的信息。比如,Class类里保存着这个类的属性、方法以及关系、父类、实现的接口等信息。
- Element抽象类有一个put方法,用来建立“关系”。比如,将属性、方法放到对应的Class里。
- 建立每个类的时候使用工厂模式,这样在做第十四次作业的时候只需要新建对应的Element和查询方法就行。
- 在第十四次作业里,由于有多个类来进行查询,所以我使用了一个单例模式的ElementContainer来存储Class、Interaction、StateMachine、Interface等,在查询的时候,只需要在ElementContainer中寻找相应的对象就行。
- 在MyUmlGeneralInteraction中,使用组合的方式,来实现多个查询的方法。然后具体的查询,实现在具体类中,这样可以保证行数会超限制。
第十四次作业中需要进行标准判断
- 对于Uml002,我的做法是对于每个类将类的对端名称和属性名称都取出来然后检查是否重名。
- 对于Uml008,使用Tarjan算法,将有向图中的环都找到,最后再检查一遍自环。
- 对于Uml009,枚举每个类和接口,如果有重复接口实现,则抛出异常DuplicateException。
OO课程中的架构设计与面向对象方法的演进
OO课程的有趣之处在于,每个单元最后一次代码都非常复杂,这样就需要更好的架构来进行组织代码。
- 第一单元中,我通过将每种Factor都继承同一父类,来进行存储,算是比较方便。但是没有考虑好接口共同的方法,导致多次强制转换。
- 第二单元中,我开始学习设计模式,我仔细阅读了多线程设计模式,使用了生产者-消费者模式、单例模式等,每个电梯都使用相同的代码来处理,代码复用性较高。但是由于没有考虑好类的功能关系,导致调度类的功能特别多,代码特长。
- 第三单元中,我开始将各个功能的代码封装起来,比如将对图的操作、查询封装起来,然后进行统一管理。
- 第四单元中,我自己封装了每个UmlElement,然后每个Element统一管理。使用工厂模式来进行对象创建。
OO课程中的测试方法的演进
在OO课程的学习中,我对测试的理解也更深入了。
在前两单元作业中,我主要是使用的黑箱随机测试,手动构造一些特殊的数据。
第三单元作业中,我第一次使用单元测试,由于JML的特性,单元测试非常好构造,而且对每个功能的覆盖性也很好。
在最后一单元中,由于我没有进行比较完备的测试,导致出现了第一次,以及唯一一次Bug。:( 因此,我在最后一次单元中,构造了许多数据,提高测试的覆盖率,并且检查了各种可能出现的情况,来保证程序的正确性。
OO课程收获
OO课程算是我接触到的第一个关于软件工程类的课程了吧。课程通过作业的形式来训练我们对于面向对象的理解。
每个单元有不同的侧重
- 第一单元,使用面向对象的封装、继承、多态来实现一个求导程序。
- 第二单元,使用多线程来实现多电梯和调度。
- 第三单元,使用JML来进行设计和实现一个地铁查询系统。
- 第四单元,学习UML模型以及实现了UML模型的解释查询系统。
每个单元都使用大量的代码来进行训练,平均每个单元一千行,最后一个单元的代码量达到了2000行。
我认为,OO课程最重要的不是怎么写出时间性能更好、空间性能更优的代码,而是面对一个问题的时候,怎么进行代码架构设计,使用更简单、更灵活、复用性更强、可拓展性更强的代码来实现一个系统。在最后一次作业中,我感觉自己充分做到了这一点,在做第十四次作业的时候,只是工作时间的问题,架构上已经非常好了。OO课程让我受益匪浅。
对OO课程的建议
OO课程今年确实有很大的改善,但是还是有一些问题:
- 在第二单元多线程作业中,互测中,虽然找到了Bug但是由于多线程的性质难以复现。因此我建议,互测的时候,可以通过提交说明来提交Bug,让助教进行检查(与Bug修复类似)。这样可以鼓励同学能通过阅读代码来找bug,而不是简单的通过“评测姬”进行黑箱测试来找bug。
- 最后一单元的指导书上有些地方写的不够清楚,尤其是第十四次作业的指导书,没有样例,解释模糊,概念矛盾。很多详细解释都需要在讨论区寻找,很不方便。希望之后每次作业的指导书能够更清楚一些吧。比如对于每种查询,都给出相应的例子,具体的例子,这样方便理解。
- 最后,关于一些作业上的内容,助教有时候只在6系水群中解答并没有在讨论区提出,这样可能会使部分同学错过去。希望来年助教能够注意一下这方面吧。