面向对象第四单元总结

面向对象第四单元总结

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

Uml第一次作业

作业需求:本次作业实现对Uml类图的解析。给定starUml类图生成的UmlElement信息,合理组织数据结构,提供类图相关指令的查询。

架构设计:由于花费较多的时间理清各个元素及其之间的关系,在架构上没有考虑后续的需求,扩展性较差。我只用了一个类就实现了信息查询,读入数据时根据UmlElement类型的不同,将其放入对应的Map,之后再根据指令进行相应的查询。类图中比较难处理的关系是类继承类、类实现接口和接口继承接口,有些指令需要考虑继承和实现关系,可以根据Map进行逐级向上寻找父类并进行遍历。

类图

Uml第二次作业

作业需求:在第一次作业的基础之上,增加对顺序图和状态图的解析,还要求对类图模型进行有效性检查。如果类图有效性检查通过,可以继续提供查询功能,输出错误信息并结束程序。

架构设计:本次作业涉及三种Uml图,因此在读入UmlElement信息时,可以将其分为三类。这样每种Uml图只需提供其相应的功能即可。考虑到模型有效性检查只与Uml类图相关,可以在建立类图模型时进行有效性检查,这样实现更加节省时间和空间,但是耦合度较高。我的实现是单独建立一个类进行规则检查。因此本次作业大体上必须有类图查询类、顺序图查询类和状态图查询类。对于顺序图,可以建立一个MyUmlLifeline类,实现添加UmlMessege和查询IncomingCount的功能,一个顺序图是包含多个MyUmlLifeline对象。对于顺序图,建立一个MyUmlStateMachine类,实现添加UmlState、UmlTransition的功能和两者的计数功能。

类图

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

第一单元是多项式的求导,学习了类和对象、类的继承、多态和抽象,介绍了一些面向对象设计原则。本单元引入面向对象的概念,实现了从以往过程式编程到面向对象编程的过渡。该单元比较头疼的是表达式的合法性检查,最常用的方法是正则表达式校验,而如果直接用正则校验整个表达式会 爆栈,因此必须将表达式进行拆分,而这与表达式求导也是紧密联系的。表达式可以拆分成多项式,多项式由项构成,项是由因子构成。本单元作业正题思路就是在进行合法性检查时拆分多项式,再根据相应求导法则进行求导。本单元的难点就是把问题抽象成许多类,每个类完成其需要实现的功能,还有就是要降低类之间的耦合度以减少出错的风险和调试的代价。

第二单元是电梯调度模拟,学习了比较典型的生产者消费者模型,了解一些在开发过程中常用的设计模式——单例模式和工厂模式。本单元完成了傻瓜电梯、可捎带电梯和多部多线程智能电梯。本单元比较难的是调度策略的选择和多线程的同步、互斥访问。本单元的整体思路——请求输入是C/S中的生产者,电梯是消费者,调度类负责将请求分配给电梯。调度类需将请求不重不漏分配给电梯线程,对于需要换乘的乘客必须保证先后顺序。

第三单元是Jml规格,介绍契约式编程。Jml可以保证程序的准确性,但是在实际开发中应用的却很少。根据写好的Jml规格来实现代码不算太难,如果代码满足规格要求,能够保证程序的正确性。本单元涉及的难点是如何构建图结构,使其方便查询,同时在对图结构进行增删时代价较低。

第四单元是Uml类图解析。针对每种Uml图设计交互模型,处理各种元素的层次和关系,提供对外的查询功能。在设计中要注意单一职责原则,每个类只需关心自己的责任。一个类不能实现较多复杂的功能,其实现的功能最好是逻辑上有联系的。

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

第一单元的测试给定输入,可能存在不同的输出。对于非法表达式其输出是唯一的,但对于合法表达式其求导的结果不是唯一的。构造测试样例时尽量覆盖所有的情况,非法表法式根据不同的非法情况构造测试,合法表达式根据不同求导法则构造测试。第一单元主要采用的是手动测试,比较费时费力。

第二单元的测试比第一单元复杂的多。不同的输入时间,不同的调度策略都会使输出结果发生差别。而且每个测试样例的输出都是比较长的,手动测试显然不太可能。本单元重点测试线程安全,测试方法是用Python生成测试样例并判断输出结果的正确性。

第三单元介绍Junit单元测试。利用断言机制将程序预期的结果与程序运行的最终结果进行比对,确保对结果的可预知性。而且单元测试也能显示测试覆盖率,根据覆盖率完善测试样例,可以达到全覆盖。Junit每个单元测试用例相对独立,在添加,删除,屏蔽测试方法时,不影响其他的测试方法。

第四单元和第三单元类似,同样使用单元测试。保证每个函数模块的正确性就能保证程序整体的准确性。

四、课程收获

在经过15次作业之后和八次实验,收获很多。 在这个阶段的学习中, 我从认识到熟悉,而后到能够自主运用。通过对 Java 的了解,我发现它确实有很多方便之处,它集抽象性、封装性、继承性和多态性于一体,实现了代码重用和代码扩充, 提高了软件开发的效率。

我觉得本学期学到的不仅仅是面向对象编程思想, 更多的是面向对象的分析方法。

1.将分析过程为抽象的过程: 简言之:分成多个小问题,直到无法再细;
2.对每个对象(小问题)进行分析,抽象,提取处共同的内容(数据成员和操作方法)。
3.有相似的对象的, 构造基类; 再有基类派生出各个确定的对象(小问题);
4.解决问题的过程就是操作这些对象的过程。

面向对象包括两个思想:从大往小想,从小往大做;从难往易想,从易往难做。把问题从大到小都抽象成对象 ,在设计和编写程序的时候把你设计的对象合理的编排组合就是面向对象编程了。

该门课程对程序的正确性和效率都提出了要求,也考察了架构设计、数据结构和算法,强度非常大。特别是每个单元的最后一个Project,难度确实大,给我很大压力,但也收获很多。

五、改进建议

1.作业难度分配不是很合理。每个单元的第一次作业比较简单,最后一次作业非常难。作业之间的难度跨度比较大,这就导致在前面的作业花费较少的时间就能完成,在后面的作业花费的时间非常多。可以考虑合理增加前两次作业的难度或者提前预告下一次作业增加的功能,这样可以方便学生提前分配时间,提高完成作业的质量。

2.实验课程安排不太合理。上午3.4节上完课后,下午6.7节就要上机。虽说上机主要考察对课上内容的理解,但我觉得间隔的时间太短,没有足够的时间消化,这就导致课上实验时比较慌。而且课上实验的难度忽高忽低,有时候做不完,有时候很早就能完成。

3.作业分数占比不合理。作业分为中测和强测,而中测在作业中的占比非常低。如果在强测中翻车,就导致本次作业的得分非常低。完成中测就意味着本次作业的功能基本已经实现,建议适当提高中测分数占比。

posted on 2019-06-24 19:27  hcclll  阅读(150)  评论(0)    收藏  举报

导航