OO第四单元总结&学期总结

OO第四单元总结&学期总结

第四单元架构设计

UML类图

由于三次作业迭代式开发,我们只取最后一次作业的架构作类图如下:

image

hw13

这次作业中由于只涉及到类图及几条有关的查询指令,实现较为简单。具体通过为每种元素构建一个类,并采取哈希表等数据结构作为容器存储各种元素,在构造方法中多轮遍历传入的元素,做预处理后提供查询方法。实现(理解上)较为困难的指令有两条,均为耦合度的计算方面。此外继承深度和类实现的接口方面我采用了dfs+标记的形式进行优化。总的来说,难点在对UML图和官方包代码的理解上。

hw14

这次作业主要加入了顺序图和状态图相关的查询指令,从这次作业开始需要注意代码风格的限制。尤其是一个类不超500行的限制,于是我选择将顺序图和状态图抽出,同时由于状态图需要的遍历层数较多,选择将构造方法单独抽象为一个build类并提供相应接口。这样子下来可以将顶层的两个类都压在200不到300行上,避免最后一次作业大规模的重构。新增指令中,需要注意的主要为关键节点判断指令,难点在对概念的理解和具体实现上,由于复杂度要求很低,直接采取dfs+标记的形式即可。

hw15

最后一次作业加入了有效性检验对此我只在上一次的构造方法中做了实现,并提供顶层接口。部分底层存储逻辑为了支持有效性检验做了微调。其中,在遍历传入元素预处理部分直接检验的有效性有R001、R005、R008、R009;剩余检验需要书写专门的函数。其中难点主要在R002以及R009上,同样最大的难点在于对于概念的理解。另外,循环和重复继承同样可以使用带标记的dfs直接解决。这里需要注意的是由于类图是单继承,所以不会出现R004的重复继承情况,无需做判断。

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

Unit1

本单元接触了java语言及面向对象的最基本思想,从hw1的杂乱无章到hw3的最初成型,也算是看到了层次化设计的一点门道。同时,这也是第一次接触了递归下降的算法以及相关分层思想。总之,如何将一个复杂任务解耦,分拆为不同的独立性较强的模块是我们需要考虑的首要任务,例如考虑好底层模块后,进行自底向上设计。说起来容易,做起来难,具体的实现总是没那么简单。例如写到一半发现少考虑了一个接口,下一次作业为了上一次作业又需要新增一个补丁。缝缝补补,总算在hw3完成了一个初步的框架。

Unit2

本单元主要是电梯调度的多线程编程。如何采取合理的设计模式,并在保证线程安全的前提下尽量最大化电梯的效率是这个单元首要的目标。具体的编程实践中,我主要对生产者-消费者模式和单例模式这两种最基本的模式做了一定的尝试,并对流水线模式等有了初步的了解。本单元中如何封装电梯类等也是一个首要的问题,这要求我们继续扩展自己的面向对象思想。总之,这单元的线程安全问题是最基本的,只有保证不死锁,不轮询,才能进一步考虑之后的问题。而性能上,我也对一些调度策略有了了解,并尝试分析了各种优化的可能。

Unit3

本单元主要是JML规格理解即契约式编程,以及附带了一些基本的图算法实践。这单元的主要任务是读懂JML语言,并且严格把控图算法的复杂度。具体到实现上,还要尽量避免直接按照JML规格书写,因为容易出现\(O(n^2)\)的算法被卡超时。同时,合理学习利用最短路、最小生成树算法及其最基本的优化策略(堆优化、并查集优化等)。

Unit4

本单元主要是UML图的学习与编程模拟,这单元的任务逻辑清晰但细节上有更多雷点。虽然层次分明即输入层,信息存储层和查询层,但鉴于查询指令多,UML图元素理解问题等,需要我们不大意,才能更好地完成任务。除了编程训练外,本单元的意义还在于对状态图、顺序图和类图加深自己的认识,便于以后使用。

测试理解与实践的演进

自我测试有三种大体思路以及两种正确性检验策略:

  • 手工构造边界数据压力测试
  • 自动化测试,随机轰炸以及全覆盖性检验
  • 代码静态检查,通过阅读代码寻找潜在的特殊bug,尤其适用于多线程编程
  • 其它辅助工具:轮询检测、print大法检验程序逻辑正确性等

策略:

  • 程序输出正确性检验:即编写代码或手工等方式检验程序输出的正确性,适用于编写逻辑较简单的情况
  • 对拍检验:两人或多人jar包输出进行对比,适用于输出唯一的情况

在三次评测机编写中,我采取了py程序生成数据并进行对拍的方式对第三单元的程序进行正确性检验;采取半随机方式,构建不同测试点对程序进行测试。同时前三单元每一次的作业,都会针对互测限制手工构造可能的边界压力数据。遗憾由于平常太懒或时间紧张,并没有写过太多的次评测机,也在这里感谢每次写评测机的臻哥。

课程收获

  • 首先是抗压能力,几乎每周的OO作业都是在周四及之后才开始写的,如何在短时间内看懂大篇幅的指导书并写出符合要求的程序充满了挑战,几乎每周都是一个坎,在这个过程中首先锻炼了自己的心态。

  • 最基础的是,java语言的语法,复(预)习了许多数据结构的算法,接触了博客并尝试自己进行周期性总结等等。

  • 最重要的是,面向对象的思维,如何将复杂的请求分拆并逐步实现的能力,以及挑战这些任务的信心。从一单元的表达式解析到四单元的UML解析器,看起来极其复杂的任务也终于在一点点的努力下被拆分成易于实现的部分。代码能力相较于开学有了不小的提升。

  • 其它许许多多:代码风格、设计模式、多线程、递归下降、JML及UML知识等等。

改进建议

  • 可以提早pre发布时间,或可以采取周期性更新pre的方式早点引导大家学习。假期末尾有事或其他安排往往导致预习不及时。
  • 可以改进下实验课的教学模式,例如公布答案等,同时在理论课或通过其它渠道给予一定的反馈。
  • 可以在设计时使得各次作业的难度更加平稳,例如hw1到2、hw2到3之间不平稳;以及每单元第一次作业可以在博客周提前发布指导书等避免大家上手难。
posted @ 2022-06-29 14:22  Nickwz  阅读(38)  评论(0编辑  收藏  举报