BUAA OO-Blogs Unit4

OO-Blogs Unit4

这篇博客对Unit4做简单的介绍,并回顾一学期的OO生涯。

单元简介

这一单元实现一个简单的UML解析器,并做一些有效性检查。

HW1

第一次作业是类图解析器,其中可能导致较高复杂度的方法是查找实现的接口,对每个接口和类预处理可以做到\(O(n^2)\)\(O(n)\)

这一单元数据生成比较麻烦,又赶上考期,故没有写自动评测机。但强测中也没有出现bug。

HW2

新增了对状态图和顺序图的解析查询。没什么可讲的,大概是OO整个课程里最简单的一次作业了吧。

强测中没有出现bug。

HW3

加入有效性检查。其中容易导致问题的一个方法可能就是循环继承了。事实上如果一个点在环内,那么等价于他存在于他的可达集中。因此暴力的对每个点dfs看看能不能找到他自己就行了,\(O(n^2)\),勉强够用。

有意思的是,开这次作业强测的那一晚刚发完强测分奖,就挂掉了,蛮戏剧性的。

bug出在没有考虑两个点之间有重边,原因是邻接表项用的是Set,改成List就好了。

课程回顾

架构及面向对象思想

第一单元求导,用继承关系构造出一个表达式树,体会到抽象的重要性。也初步体会到了Java中用继承关系解决问题的简洁和优雅,从PO过渡到OO。

第二单元电梯,对“每个类只管理自己的事情”有更深的理解。对类做责任划分,更多的体会到了架构设计的重要性。

第三单元JML,接触到了一个虽然对人工阅读略显复杂,但相当严谨的一个建模语言,度过了轻松且美好的一个月。

第四单元UML,接触到了一个相比JML更加直观的建模方式,用各种图进行建模,设计和分析过程中都有广泛的应用。

测试

除了第四单元都写了评测机,一三单元是基于对拍(sympy/同学),二单元是spj。

数据生成部分,全部采用了随机生成数据,这确实是一个简单但难称充分的生成手段。之所以选用随机数据,是在没有人工分析坑点的情况下,希望有更好的覆盖性。除此之外,一般每次会手动构造几个极端数据。

除此之外,我愈加感受到了静态检查的作用,这里的静态检查主要指读代码。

建议

  1. 第四单元游戏体验极差,指导书有太多谜语,规则繁杂而混乱,很多关键信息隐藏在讨论区里,显然不能指望同学们不停的轮询讨论贴。我出的这最后一个bug就是在结束后才看到一个帖子里有助教提示的。
  2. 进一步,即使第四单元的指导书修好,我也没有觉得这三次作业有多大的意义,我觉得甚至还不如训练和那两次上机的收获大。前边JML单元学了就用,可以有一些实际的体验。写解析器这种东西貌似有点脱离主题,到最后也没有对UML做什么实践,也就很难有深刻的体会。也许任务设置形式不一定要局限在写码+测试上?可以做更多的尝试。
  3. 我当然要感谢课程组为了后半学期给OS和复习留下充足时间而降低难度而做的努力,但前两单元和后两单元的差距不得不说有些大。前两个单元中即有性能分,又有自主设计架构的余地;后两个单元没有性能分,而且基本没有什么架构可言(没有体现出一个好架构的优势)。个人体验,为了性能,总会或多或少的失去一些架构的优雅。如果能有一个没有性能分而专注架构设计的单元,更能凸显OO思想对架构设计的指导作用,整体体验会更好。

收获

上面提了一些建议,但区别于传统课程,总体上不能否认课程团队采取了很多尝试并且取得了不错的效果,作为一门实践为主的专业课,专业性和娱乐性共存,很大程度上充实了我的这一学期。

个人收获上,前面已经说了一些。显然最重要的收获还是对面向对象思想的理解,这一点收获不仅来自理论课,作业,应该说很大一部分还来自阅读Java官方包的代码这一过程。很多情况下,用语言来描述面向对象思想不一定是最好的选择,去看一看别人写的OO可能更能领会其精髓。

更多注意到了架构设计的重要性,程序的代码复杂性、可读性、正确性很大程度上取决于架构。

丰富了正确性检验的手段。从大一程设ds的纯静态检查到自动评测机,覆盖性更强。同时注意到边界测试的重要性。

感受

总之,这一学期的OO就到此为止了。要说也有遗憾,比如由于评测机开发的滞后导致挂过一个强测,还摸了一次互测。整体工作量不算小,时间也相当紧凑,虽然最后还摸了个奖,但还是总有种劫后余生的感觉,可以说是相当刺激了。

工程问题是一回事,但面向对象思想并不是简单的工具。OO思想在软件设计中自然有很大的作用,但作为一个架构设计思想,软件设计可能只是其中一个领域。在很多涉及到管理的地方都可以见到面向对象思想的影子。从这个角度说,影响的广泛性能给一个思想的魅力加分不少。

posted @ 2021-06-26 14:37  HKvv  阅读(112)  评论(0)    收藏  举报