BUAA-OO-Unit4 总结

BUAA-OO-Unit4 总结

本单元作业的架构设计

第十三次作业

按照 UML 图建立类和关系即可,需要注意的是输入的顺序不定,采用每次只读取一种 UmlElement 的方法,多次读取

我几乎为每一个在指导书中出现的UML元素都自行建立了一个包装类,事实证明这其实是没有必要的,而且自行建立的包装类信息大都有缺失,因此在第十五次作业中,我又给每一个类添加原始类作为补充

类图大致上与UML图中元素关系相似,很有层次感(这一点类似于第一单元)

(类图摸了)

image

功能上把所有指令的处理塞到了MyImplementation类中,同时存储所有class等的信息

第十四次作业

这次作业的难度是很大的提升,直接要求添加了另外两种UML图,因此类图变得非常庞大,下面是总览(我又为每一种UML元素建立一个包装类,所以类非常多,事实上可以用官方包提供的类直接代替的)

image

下面是状态机部分的类图,关键在于我写了一个公共父类GeneralState去让MyFinalStateMyPseudostateMyState三个类去继承,这样在实现指令的时候可以稍微方便一些

image

时序图部分,我又建立了一个独立于类图中的MyAttribute类去储存在时序图中出现的Attribute,这个在第十五次作业检查正确性时很有用,其它的大都是类图结构的层次

image

关于指令的实现,我单独写了一个MyImplementation类去继承UserApi,然后大部分指令的实现都放在了MySequenceDiagramMyStatusDiagramMyClassDiagram三个类中,MyImplementation可以直接调用对应图的相应指令即可

第十五次作业

本次作业的类图结构与第十四次作业基本类似,这次作业主要加入了错误 UML 的判断,我主要采用了先解析再检查的方式,首先对输入进行解析,然后再验证图中的元素是否符合要求

在检查的实现上,我直接把检查的函数写到了MySequenceDiagramMyStatusDiagramMyClassDiagram三个类中,又考虑到MyClassDiagram超出了代码行数限制,类图的检查单独设了一个单例模式的MyChecker

另外值得一提的是对于循环继承的检查,经过与同学的充分讨论,决定使用的是Tarjan算法找环;对于重复继承的检查,直接暴力DFS即可,事实上即使DFS找环,看起来在强测中也不会超时

架构设计思维及OO方法理解的演进

第一单元

主要介绍的是分层次的数据收集和表示方式,主要是把一个层次化的结构(表达式)用类的层次结构(继承关系)表现出来

  • 在这个单元设计架构时,设计架构的层次是自然的,只需要定义“表达式”/“项”等类即可,在指导书中也都有提示
  • 这一单元的抽象程度还不是很强,整体设计符合直觉

第二单元

这一单元的主题是多线程,也是相比之下最为困难的一个单元

  • 引入了设计模式的概念,单纯用到的就有单例模式、生产者消费者模式、观察者模式等等,设计模式是对解决实际问题的方法的提炼,合理使用可以减轻编码难度和思考难度,但是不能盲目套用
  • 引入了非常抽象的线程执行流的概念,线程之间的执行顺序是不定的,因此需要考虑各种情况使得线程同步,避免死锁,这既需要思考全面,又需要对实际问题做合理的抽象
  • 整体代码量偏大,细节要求多,要求仔细细心
  • 我在设计的时候,抓住了对生产者-消费者模式理解这一主线,然后在架构中多次使用生产者-消费者模式

第三单元

这一单元主题是规格化,是相对轻松的单元

  • 了解JML语言描述、能根据JML写代码是最基本的要求,从这一单元开始理论课与作业的联系愈发紧密
  • 本单元的另一个主题是算法选择与优化,我经常使用的技巧是cache缓存,更加感受到了计组中引入cache的重要性()
  • 规格化表述更便于传递需求信息,也更方便测试,这是这一单元给我的体会

第四单元

第四单元以 UML 为基础,编写UML解析器

  • 体验不算很好,指导书不是很明确,需要结合讨论区食用,但是测试数据还是较为友好的
  • 设计中还是使用了第一单元的层次化的方式,毕竟UML图本身就分为各种层次,整体设计自由性还是有的(但是我的设计还是走了一些弯路)
  • 前两次作业并未交代第三次作业需要什么,导致前面的设计类中包含了冗余信息或者缺失关键信息,需要后续修改,甚至重新设计

OO方法的理解

OO课前:OO的核心就是类和继承关系

OO课后:OO的核心是一种设计的思想,通过把设计对象进行层次化分解,可以把一个大型工程分成若干个小的模块然后组合,这样易于编码,易于调试,更易于分工合作

可以看出OO课前,虽然对面向对象有所接触了解,但是了解的仅仅局限在表象上的类等概念,OO课后经过编程训练,更加深入的体会到了OO的作用和思想内涵

测试理解与实践的演进

  • 在第一单元中使用了 Python + sympy 作为数据生成和测试手段
  • 在第二单元中用Python写了一个简单的输出结果检查器,检查结果正确性,因此测试时主要是手动测试构造边界数据 + 大量随机请求,然后检查输出是否正确
  • 在第三单元中规格已经给出,而且输出形式固定,采用静态阅读代码查错 + 大量随机数据多人对拍测试
  • 在第四单元中,前两次作业仍是大量随机数据多人对拍测试,最后一次作业评测机摸了,采用手动构造边界数据测试

综上所述,测试实质上是检验结果是否与预期相符,测试的形式可以是对拍,也可以是模拟验证,关键在于随机构造数据 + 合理的结果评判标准,实践上通常用对拍解决,毕竟人多力量大

课程收获

  • 第一单元:层次化数据类设计、各种容器的使用、面向对象基本知识(封装、继承等等)、代码圈复杂度等评价标准
  • 第二单元:多线程程序设计基本知识(synchronize、各种锁)、各种设计模式、多线程调试工具和调试方法
  • 第三单元:lamda表达式、容器的stream流、cache的优化思想、JML语言描述、各种图论算法
  • 第四单元:UML图的概念、画法、表达的内容解析

改进建议

  • 实验课后建议增加习题讲解环节,目前会在实验课后放出答案,但是有时可能需要有相应讲解,这一点是否可以参照OS课上录制讲解视频的方式给出实验题讲解
  • UML语言单元的指导书可能仍需要改进,目前仍存在表述不清的情况需要结合讨论区理解,今后这一单元可以定期更新FAQ整合帖,更方便我们知道同学们的问题和回答
  • JUnit一直在推荐我们使用,但是并没有相应讲解,或许今后的测试样例可以以JUnit测试文件的方式下发,可以让同学们都体验一下JUnit单元测试
  • 寒假预习的时候可以加入可选的对于多线程的简单介绍和相关实验,这样第二单元一开始上手的时候不至于会手足无措
  • 每一单元结束后可以评选出优秀设计,公布出来并展示,让同学们观摩学习
posted @ 2022-06-29 00:49  FlyingAns  阅读(34)  评论(0编辑  收藏  举报