「BUAA OO」第四单元总结
「BUAA OO」第四单元总结
一、第四单元架构设计
1、任务目标
本单元的任务要求是实现一个 UML 解析器,以支持对 UML 类图、状态图和顺序图的分析
2、整体架构设计
以最后一次作业为例:
题目本身只要求 MyImplementation 类实现 UserApi 接口,即实现接口中的各种查询、检查方法即可(即上图中的左半部分);但实际上直接实现起来既不方便,也不符合OO的设计思想,因此我新增了一些类(如上图右侧所示):
- 类图相关(上图右侧上部):首先新增了 MyClass、MyInterface、MyOperation 类,将属于他们的Attribute、Operation等信息存入其中;然后用 MyClassOrInterface 将 Class 与 Interface 统一,提供统一的访问接口
- 顺序图相关(上图右侧中部):新增了 MyInteraction 类
- 状态图相关(上图右侧下部):新增了 StateChart、MyStatemachine 类,其中 StateChart 运用了单例模式,将状态图中所有相关元素从 MyImplementation 中全部抽离了出来
如上所述,我只将状态图相关的部分运用单例模式进行了抽离,类图与顺序图整体还是在 MyImplementation 中。所以 MyImplementation 中还包含了:由继承关系产生的父子节点组(son2fathers)、遍历父子节点组的 dfs/bfs 方法等
3、小结
本单元作业中,涉及到的组成元素较多,在准确理解题意的基础上再展开设计是很重要的
二、四个单元中架构设计思维及OO方法理解的演进
第一单元
架构:堆栈解析+数据结构,前者面向过程,后者面向对象
主要用到了OO三大特征中的封装
第二单元
架构:以调度器为牵引,组织起了支持多线程的各个电梯、策略类
整体来看,主要体现的还是封装。将对象视为一个个彼此之间相互相对独立的个体,然后由调度器进行了整体的协调控制
在具体架构上,主要采用的是生产者-消费者模型来进行多线程程序的编写
第三单元
架构:人+群组+网络+消息
第三单元主要是在 JML 规格之上来进行契约式编程,所以架构上面没有什么特别的设计
与第二单元相比,第三单元中对象彼此间的协作性更加明显
第四单元
架构:见上文
阅读第四单元的源码,可以明显感受到以OO方法来组织大规模文件时的设计思想。这样的大规模文件的组织方式明显与OS中多文件面向过程的组织方式有着显著的区别
小结
其实四个单元里面,OO三大特征里面最主要体现的都是封装,继承与多态体现得都不算太多
设计模式上,主要是在第二单元里接触并运用了单例模式、流水线模式、策略模式等
设计原则上,即就SOLID而言,单一职责原则、开闭原则、依赖倒置原则、迪米特法则都有较好的体现
三、四个单元中测试理解与实践的演进
第一单元
测试采用单元测试+手搓简单数据
就我的架构设计而言,模块化明显,单元间实质性的耦合比较少,便于单元测试;因此我认为可以先去确保每个单元的正确性,然后再去验证整体的正确性
我也手搓了一些数据进行了整体的测试作为验证/查验性能
第二单元
测试采用手搓简单数据
第二单元其实很应该上自动随机评测的,奈何我时间有点紧(懒),就仅仅简单搓了点数据来排查轮询、死锁、性能等内容
结果最后强测有一个点WA了,寄的原因确实有些出乎我意料。事实证明,随机数据的验证还是比较必要的,可能能帮助我们测出一些意想不到的错误
第三单元
测试采用随机测试+手搓数据
就输入数据而言,第一第二单元在情况上的限制其实挺少的,输入都相对自由,一条输入与另一条输入彼此之间的联系相对较少;而第三单元中,输入之间彼此之间互相影响的程度较大
随机测试虽说是随机的,但并非纯随机的,因此需要在建立测试集时对数据之间的联系有所思考,并做一些维护、调配等操作,否则太过自由的话可能难以到达预期的目的
第四单元
测试以手搓数据为主
当数据限制过多、整体测试框架较难搭建且时间有限的情况下,自己人工构造数据来进行测试永远是可行性良好的方法
小结
- 测试方法应与任务相匹配、具有针对性。针对不同任务、不同的架构设计选择不同的的测试方法
- 完成任务、实现程序是面向输出的,将输入转化为输出;而测试面向的是输入,需要先对输入数据有更深入的理解,然后进行测试数据的构造
- 测试不仅仅是对于结果的测试,其能对测试者带来包括输入、过程、输出等内容的整体的提升。在搭建测试数据时,势必会进一步去理解输入数据的构造逻辑,然后很自然地也会带动对于中间过程的设计,促进拨冗去杂——正如我们在本学期的《马克思主义基本原理》中所学,认识的过程需要:实践→认识→实践
四、课程收获
1、熟悉了java语法
2、理解了面向对象的三大特征、设计模式、设计原则
3、认识到了架构设计的重要性,并进行了充分的实践
4、掌握了多种测试方法,对于测试数据的构造有了更深刻的认识
5、组织稍大规模代码的能力有所提高
6、初次接触了 gitlab 平台;熟悉了对 IDEA 的使用
五、对课程的建议
1、将 pre 的时间整体前移
2、调低 Unit1 预解析模式的结算分数折合比例,尤其是第一次作业
3、Unit3 中对于 JML 的书写确实很难落实。建议依次实现以下三点:
- 上机实验要求书写 JML 后,课下应当把参考书写方式给出来
- 在单元总结博客(或者直接加个小作业)中要求同学们对比自己的实现(以实验时限内最后一次提交为准,后续不得再有变动)与参考实现,自行谈谈差异与优劣
- 根据撰写分析的情况进行适当的加分或扣分