BUAA-OO-Unit4 总结
BUAA-OO-Unit4 总结
本单元作业的架构设计
第十三次作业
按照 UML 图建立类和关系即可,需要注意的是输入的顺序不定,采用每次只读取一种 UmlElement
的方法,多次读取
我几乎为每一个在指导书中出现的UML元素都自行建立了一个包装类,事实证明这其实是没有必要的,而且自行建立的包装类信息大都有缺失,因此在第十五次作业中,我又给每一个类添加原始类作为补充
类图大致上与UML图中元素关系相似,很有层次感(这一点类似于第一单元)
(类图摸了)
功能上把所有指令的处理塞到了MyImplementation
类中,同时存储所有class等的信息
第十四次作业
这次作业的难度是很大的提升,直接要求添加了另外两种UML图,因此类图变得非常庞大,下面是总览(我又为每一种UML元素建立一个包装类,所以类非常多,事实上可以用官方包提供的类直接代替的)
下面是状态机部分的类图,关键在于我写了一个公共父类GeneralState
去让MyFinalState
,MyPseudostate
,MyState
三个类去继承,这样在实现指令的时候可以稍微方便一些
时序图部分,我又建立了一个独立于类图中的MyAttribute
类去储存在时序图中出现的Attribute,这个在第十五次作业检查正确性时很有用,其它的大都是类图结构的层次
关于指令的实现,我单独写了一个MyImplementation
类去继承UserAp
i,然后大部分指令的实现都放在了MySequenceDiagram
,MyStatusDiagram
和MyClassDiagram
三个类中,MyImplementation
可以直接调用对应图的相应指令即可
第十五次作业
本次作业的类图结构与第十四次作业基本类似,这次作业主要加入了错误 UML 的判断,我主要采用了先解析再检查的方式,首先对输入进行解析,然后再验证图中的元素是否符合要求
在检查的实现上,我直接把检查的函数写到了MySequenceDiagram
,MyStatusDiagram
和MyClassDiagram
三个类中,又考虑到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单元测试
- 寒假预习的时候可以加入可选的对于多线程的简单介绍和相关实验,这样第二单元一开始上手的时候不至于会手足无措
- 每一单元结束后可以评选出优秀设计,公布出来并展示,让同学们观摩学习