面向对象设计与构造第四单元&课程总结

第四单元作业分析

题目简述

在官方包提取元素的基础上实现一个 UML 解析器,能回答对 UML 类图、状态图和顺序图的一些性质的询问,以及规范性验证。

架构设计

注意到元素和指令数量并不多,我选择大力遍历的方法,没有做任何的层次化设计。

也就是当程序中需要某类元素的时候遍历一遍所有元素来查找。因此我只预处理记录了 ID 到 UmlElement 的映射和每个 UmlElement 的所有儿子。

这种方法的优点是不需要进行冗长的层次化处理,也不用担心哪里处理出错,在没有行数限制的情况下甚至可以一个类搞定。缺点是每次遍历还要判断是否是要找的那类元素,多一个 if。

这样做还是超过了 500 行,于是我对类图、状态图、顺序图和规范性验证分别建立一个类来处理。算上 Main 共 6 个类,架构十分清晰(其实是没啥架构)。所以这部分也没什么好分析的。

由于这单元的特性,三次作业的迭代也完全是增量开发,没有什么需要重构的因素。

在结束之后仔细想想,在当前架构下其实可以把三种图的元素分来存放并处理,会更加简单。

课程总结

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

作为一个程序设计竞赛选手,我以前写代码很少注重架构,通常都是怎么方便怎么写,只要能通过就行。而在 OO 课的学习中,我发现必须要注重架构的设计,因为代码很长并且需要迭代开发,不注重架构会导致大量重构。

  • 第一单元:
    主要是两部分,解析表达式和简化表达式。前者借鉴了训练中提到的递归下降的方法,这个方法非常高妙。后者我使用多项式类来计算和储存结果。其实从采用递归下降开始就定下了架构的基础,自己设计的地方比较少。
    这是我在面向对象程序设计方面的第一次尝试,尽管程序的很多地方看起来还是面向过程的,但我学到了很多面向对象的思想。

  • 第二单元:
    我的架构主要基于生产者——消费者模式,使用一个调度器来分发请求,有两个层次:输入线程——调度器和调度器——电梯。主要问题是多线程交互,需要保证线程安全。为此我也构思了很久,仔细分析了不同线程的作用和需要进行交互的地方,思考完整了之后实现还是比较顺畅的。
    这一单元我学会了一些多线程编程方面的知识,包括线程安全和加锁方式等。给我的一个感受就是多线程和面向对象是密不可分的。

  • 第三单元:
    架构上只需要根据题目把图建出来,并没有太大的要求。
    主要是学习了 JML 规格相关的知识,规格化设计能够提高思维的严谨性、降低出错的概率。

  • 第四单元
    架构前面已经介绍过了。大道至简,在最后一个单元的要求之下反而没必要搞那么复杂的架构。这也让我认识到,面对不同问题合理采用不同架构,可大可小,这才是架构设计的学问。
    这一单元我学习了 UML 的结构,UML 是用来描述面向对象程序的架构的,而它本身就是一个纯面向对象的语言。图中的每个元素都是一个对象,UML 模型实际上就是实例化的结果。通过对 UML 的分析,我也能够学习到面向对象的思想。

测试理解与实践的演进

  • 第一单元:写评测机,C++ 递归生成数据,Python 使用 sympy 库来验证。还需要判断输出格式是否合法,比如某些地方不能加负号。

  • 第二单元:写评测机,C++ 生成数据,Python 对输出结果模拟验证是否符合要求。对于多线程的测试,我先测单线程确认无误后再测多线程。还有利用工具测试是否出现轮询等问题。

  • 第三单元:写评测机,C++ 生成数据,Python 用于对拍。需要生成所有情况的数据,包括各种异常。主要问题是对 JML 细节的理解,比如群组人数 1111 的上限。还有性能问题,手动针对性构造一些数据,比如造链,完全图,菊花图……

  • 第四单元:摸了。

课程收获

首先,我学会了 JAVA 的使用,了解了面向对象的基本思想,也在不同单元中学习了多线程、设计模式等知识,收获很大。

其次,通过每周作业和上机,我锻炼了敲代码、架构设计、debug 的能力,在互测中也锻炼了阅读别人代码和找错的能力,在写评测机的过程中锻炼了使用 C++、Python 的能力。

总的来说,我觉得 OO 这门课还是比较有意思的,乐趣和挑战并存,在理论和实践上都能够学到很多。

改进建议

  • 加强中测!尤其是第二单元,多线程的 bug 本地不容易发现,而且条件多了之后容易忽视细节。我只有第二单元挂了一次强测,是因为题目理解有偏差,本地进行了大量测试也没用。虽然说中测弱是 6 系祖传,但还是希望能够良心一点吧QAQ。

  • 指导书过长,索引不够清晰。建议增加目录等辅助阅读。讨论区的提问贴也有点混乱,问答混杂在一起。建议回答能够做成楼中楼或者超链接的形式,或者用其他方式改进一下界面。

  • 前两个单元性能分机制的的设置不够完善。性能分占比不高,想要提高又很麻烦还容易出 bug,属于是食之无味弃之可惜。我只做了简单的几个优化,强测总分仍然能维持在95以上,但是再做别的优化就很困难。我的想法是可以取一个比较优秀的作为基准,比它差的记性能分,比它好的性能满分且适当加分(但不允许超出当次作业总分太多)。这样可能会提高一点大家的积极性。

posted @ 2022-06-25 11:18  Oshwiciqwq  阅读(79)  评论(1编辑  收藏  举报