BUAA_OO 第四单元总结/期末总结
BUAA_OO 第四单元总结/期末总结
第四单元设计
第四单元要求我们实现一个UML图解析器,输入UML图中的元素和多条查询指令,输出结果。我们要对类图、顺序图、状态图进行处理和建模。
官方包给出的UML元素只是输入数据的原始属性,而且不分顺序。为了便于处理查询指令可以将这些 Uml*
类封装起来,就像下面这样:
My*
类中不仅存储了 Uml*
,还有另外一些信息比如UmlClass实现的接口、UmlClass的子类和父类等。
在读入数据的时候仅仅遍历一遍是不够的,因为可能先读到类的继承关系,再读到类,我们应该确保在读继承关系的时候所有的类和他们的id的关系都已经被储存下来,这样,就要求分多轮读取。这种限制关系其实可以抽象为一个有向图,而我们寻找读取顺序的过程就是一个类似于拓扑排序的过程。
以类图中的元素为例:
上图中箭头表示读入的先后关系,因此对于类图可以分为三轮读取
- UmlInterface,UMlClass,UmlAssociationEnd
- UmlGenerelication,..., UmlAssociation
- UmlParemeter
对于其他几种图处理方法类似。
架构设计思维及OO方法理解的演进
对OO的理解
我目前理解的面向对象就是把关联比较密切的方法和数据放在同一个类中,把散装的数据和函数都包装在一个个对象中,分类之后整个代码就看起来比较整齐,便于掌握和使用。其实就是把混杂在一块的东西分为一个一个对象,然后把一个大的任务分成一个一个小的任务交给这些对象去处理。
历次作业回顾
我觉得自己进步最大的时间段是前两个单元。
第一单元是表达式解析与处理。在第一次作业中我闭门造车,搞出来的设计非常糟糕(哦,没设计,直接上来就写的),既没有可拓展性、又没有鲜明的逻辑。第二次作业用了在研讨课上同学分享的架构,将表达式分层,这样方便化简和解析。第三次和第二次差不多。
第二个单元开始注重设计,在写代码之前明确的搞清楚有哪些类、分别是干什么的、以及哪些功能的主体应该放在哪些类里面。同时从第一次作业开始就比较注重可拓展性,第二单元没有重构。
第三单元比较简单,谈不上什么设计,就是把JML翻译成代码。初步了解了规格化设计。同时练习了一点相关的算法。
第四单元其实还挺难的((,写出来会有很多bug,主要是细节问题比较多,感觉架构也比较单一。
测试理解与实践的演进
测试是一件很难的事情,虽然我没有自己写出来评测机,但是在使用别人评测机的过程中也发现过不少由于写评测机的人考虑不周引起的大的漏洞,经常导致生成的数据没有覆盖一种很简单的情况。大量随机数据是一种非常有效的测试正确性的手段,能够发现比较常见的bug,一般的数据生成器都采用这种办法。让测试数据满足指导书的限制同时尽可能覆盖掉指导书允许范围的所有情况,这个是构造数据的最大难点。
除了构造数据之外,还有正确性判别,有这么几种思路:对于输出固定的程序可以几个人对拍,比如后两个单元;像第一单元表达式化简可以采用代值求表达式的数值,再进行对比;电梯单元的正确性判定是相对来说最复杂的,需要保证一个电梯同一时刻乘客数量不能超过限制、电梯运行速度有限、乘客必须在电梯开门的状态进入电梯等等。看了别人的评测机,可以对于输出进行多次遍历判断,第一次遍历判断是否满足电梯速度限制、第二次遍历判断别的条件......,这样判断正确性就比较容易了。
这个学期的遗憾之一是没有自己参与评测机的构建,只有第一单元的时候用别人的数据生成器写了个脚本由于对拍,后面基本上没什么时间用于评测了,很佩服那些每次作业写评测机的人,感谢!
课程收获
- 加深了对于面向对象思想的理解
- 写代码越发熟练了
- 在写代码之前会进行设计,而不是上来就写
建议
- 课上测试的时候建议适当缩短提交冷却时间,经常会遇到在最后15分钟卡着点不敢交的情况(因为交了之后一旦发现错误就没得改了)
- 第四单元指导书歧义比较多,经常需要翻微信群和讨论区,这方面应该还可以改善
- 前两个单元难度太大,过渡不是很平滑,可以适当增加pre的难度和时间,也可以在pre中涉及一些前两个单元需要用到的东西(比如多线程)
感谢老师和助教的付出!