BUAA_OO_Unit4 总结及课程总结

OO_Unit4总结及课程总结

Unit4总结

架构设计

UML图、

第一次作业使用PreCount类进行元素的预处理,将处理结果储存起来,并实现元素信息查询与Implementation之间的接口工作。

第二次与第三次作业将PreCount拓展为ClassPreCount, ColPreCount和StatePreCount,分别承担三种图的预处理工作。

总体而言,本单元作业的架构较简单,关键是如何实现查询指令的逻辑,中本单元的难点有:

  • 去重:查询实现接口等时需要使用HashSet去重。

  • 关键状态判断和循环继承判断:使用深度优先搜索。

  • 理解UML图中元素的关系。

学习收获

  • 异常的处理与处理逻辑

    了解了try/catch与throw的不同,区别是是否在这一层抛出;深刻地体会到如果要按异常的优先级来抛出,需要将检测到的低优先级的异常先储存起来。

  • '?'关键字的使用

    官方包中的<? extend xxxClass>就是?关键字的一种用法,用来指代某个类的子类或者它本身。

课程总结

架构与OO的演进

第0阶段 生搬硬套

​ 在OO预习作业中,我按照指导书的指导对类进行继承、关联等操作,但完全不知道这样大费周章与面向过程编程相比有何优势。

第1阶段 依样画葫芦

​ 在第一单元作业中,我按照课上实验的递归思路,将类分成了解析器、递归单元、运算类和数据类型类。当时我并不理解这样分类的作用,因为这对于阅读代码非常繁琐。在随后的几次作业,我才渐渐地感受到这样架构的拓展性非常好,基本上只需要根据题目调整对应的类。经历了第一单元的学习后,我才开始体会到面向对象的方便之处。而此时在学期末,或许是看的代码多了,也可能是踩的坑多了,觉得理所应当了,再看这种架构, 只觉得是非常理所应当的事。

第2阶段 加点高端的

​ 虽说在第一单元就有同学分享了各种设计模式,课程指导书也有所提及,但那时我只能懂个大概,不懂得为何要那样设计。但在第三单元我很自然地可以将调度器的实现与单例模式联系起来,将不同类型的电梯对象的创建与工厂模式联系起来。除此之外,我还尝试将同学分享的代码架构原则,如单一职责原则等加入自己的代码中,对代码进行约束,从而使自己的代码更加优雅,档次上了一个维度。

第3阶段 面向接口进行架构

​ 在第三第四单元中,官方包将人际网络和UML解析器的大部分功能都实现了,我们只需实现核心内容并与官方包进行对接。方法是官方包提供了一些类的接口,我们只需实现这样一个类即可。在这两个单元里,需要自己架构的部分并不多,但第四单元如果不谨慎架构,还是有可能掉入坑里,比如有的同学在MyImplementation运行前就将Elements处理好,导致第三次作业需要重构。我在这两个单元中的架构都比较流畅,不需要重构,其中的原因之一就是对接口的要求进行全面剖析,从而找到设计类的最佳方法。

测试的演进

自己构造针对特定问题的数据

​ 在一二单元中,我主要是靠自己手动构造数据来测试自己和别人的代码,构造思路是:主要针对针对作业迭代的后的新增内容进行编写,而且尽量编写得复杂一些。比如第一单元使用尽可能多的嵌套层数和符号、运算组合,第二单元综合多种情况构造请求等。这种方法构造的数据大概率可以发现并back bug,但覆盖率非常低,仅靠这种办法很多bug都发现不了。

评测机与随机生成数据

​ 第三单元时我开始自己写评测机,思路主要是通过几种指令的组合生成随机数据。数据的测试重点与测试能力可以通过调节指令的比例,指令中数值大小与指令数量来实现调整。将这些功能进行模块化,就可以保证在各次作业进行迭代时评测机也能很好地保留以前的部分。

Junit单元测试

​ 第三第四单元在IDEA中使用Junit工具可以对代码实现近乎100%的测试。但这个方法付我只是尝试过,并未真正地对作业进行测试。

总体而言,我对黑盒白盒两种测试都有了更深的理解,但对测试的依赖程度哦也有所提高。

课程收获

  • 知识点:

    详见每一单元的博客。

  • 代码风格:

    在迭代中除了行数等需要记数才能发现的风格问题,其它问题基本在书写时基本不会出现(不依靠工具)。

  • 架构思路:

    逐渐可以快速切入问题,找到使得代码高聚类低耦合的划分类和方法的方式。

  • 测试方法:

    详见上一节。

改进意见

  • 助教分享数据构造思路

    助教构造数据的思路可能是针对某些同学很可能犯的错误而进行构造的,如果助教能将这些思路分享出来,可能可以引导同学发现其他没被测出来的bug,或者提高修复已有bug的效率,并预防同类bug的再次出现。

  • 每次作业后可以增加一些小知识

    比如java8的一些特性像lambda表达式,或者是官方包里用到的其他编程技巧。这些都有助于提高同学的编程能力。

  • 更生动的例子

    在理论课程的讲授中,即使如吴际老师那般抑扬顿挫,课件上生硬的文字描述依然让人难以快速理解。如果能将这些理论知识套进比如游戏内容的例子,那么理解起来应该会快很多。

posted @ 2022-06-28 18:02  Disorientation  阅读(29)  评论(1编辑  收藏  举报