「BUAA OO」第四单元总结

「BUAA OO」第四单元总结

一、第四单元架构设计

1、任务目标

本单元的任务要求是实现一个 UML 解析器,以支持对 UML 类图状态图顺序图的分析

2、整体架构设计

以最后一次作业为例:

image

题目本身只要求 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 后,课下应当把参考书写方式给出来
  • 在单元总结博客(或者直接加个小作业)中要求同学们对比自己的实现(以实验时限内最后一次提交为准,后续不得再有变动)与参考实现,自行谈谈差异与优劣
  • 根据撰写分析的情况进行适当的加分或扣分
posted @ 2022-06-28 10:28  郑星宇  阅读(48)  评论(1编辑  收藏  举报