面向对象第四单元总结

 本单元架构设计

本单元代码以查询对象结构为主,所以在代码中使用大量的 Java 8 Stream 特性,简化了查询代码编写。

UmlInteraction 中,有一个 UmlDataRepository 类,提供方法来完成查询任务。UmlDataRepository 类接收 UmlElement 数组作为参数,在构造函数中对其进行预处理,按一些属性(自己的 ID,父级节点 ID,种类等)分类后存放于 HashMap 中。分类代码也使用 stream 编写,简洁明了:

同时,UmlDataRepository 类中还有各种查询函数,其他类在查询 UML 类图时全部调用相应的查询函数。查询函数有:

这些查询函数大都使用 Java stream 特性,极大简化了查询工作。以 getInteraction 方法为例,该方法根据指定名称来找到相应的 UmlInteraction,部分代码如下:

这段代码从 elementsByName(一个根据元素名称分类的 HashSet)中找出对应的元素,然后 filter 出所有 Interaction 类型,然后 map 中转换为对应类型,最后使用 collect 将其转化为 List。整个过程一气呵成,行云流水,具有函数式编程的美感。

第三次作业的 UML 检查部分,建立了一个独立的类来进行检查工作。其中,Uml002 错误使用了 Tarjan 算法来检查继承关系上是否有环;Uml003 和 Uml004 使用了记忆化搜索来判定某个类是否存在问题。这些算法都不是特别复杂,在此不赘述。

本次代码因为用了 stream,所以从复杂度分析上来看是特别优秀的,具体如下:

除了两个方法之外,其余方法的复杂度都很低。

四个单元中架构设计及OO方法理解的演进

OO 四个单元给我的经验是,如果能够提前知道需求,就可以更合理地设计架构,简化不必要的设计,使开发过程更加快捷高效。在架构设计方面,我在学习本课程之前就有了相当的经验,所以没有踩什么坑;但是在需求分析上,的确学到了不少经验。比如第一单元的表达式求导,提前猜出接下来的需求,就可节省不少精力。

架构设计方面,要注意合理划分功能模块,每个类负责的事项不能太多。同时,编写代码时,要注意 DRY 原则,重复的代码要有恰当的抽象,否则代码维护的时候会有相当多的不便。

四个单元中测试理解与实践演进

一、二、四单元中,都使用了随机测试的策略。随机测试只要测试流程正确、数据覆盖完善,发现问题的概率就比较高。OO课程所有作业的强测中,我仅有一个测试点未能通过,别的 bug 都在测试阶段就发现了问题,说明随机测试的覆盖率还是不错的。

关于单元测试,我认为虽然实际工程开发时单元测试会很实用,但也替代不了随机测试。毕竟单元测试的数量是有限的,覆盖到边界情况的概率较小,而随机测试只要时间长度足够,就可以认为其有较高的概率测试到边缘情况(猴子打字机理论)。这一点在计组课程中也体会颇深。

课程收获

本学期 OO 课程中,最重要的收获是养成了写代码之前先思考的习惯,如果随便乱写,出 bug 的概率很高。这学期的训练让我能够写出 bug 很少的代码。同时,通过课程,也对 Java 和一些常用工具(例如 Regex、synchronized 块)的特性更加熟悉,在进程同步方面也积累了原来没有的经验。

具体改进建议

  1. 本学期课程文档中存在一些问题(尤其是实验题)。错误、不准确、不完整的描述可能会对同学们带来困扰甚至误导。我在本学期指导书或实验说明中见到的问题有录入错误(例如打错大小写、拼写错误或英语语法错误)、混淆概念(例如混淆成员与属性)、描述缺乏(例如第四单元 R003 和 R004 错误,没有描述清楚)等。这些错误轻则影响同学完成题目,重则会给同学们留下错误的印象。希望以后能加强对题目的审核。
  2. 希望实验后给出反馈。目前完成的实验没有任何反馈,没有反馈就没有改进,就无法更好地完成实验。反馈不一定要以分数的形式给出,单纯地给出是否正确,或者助教对每个人写出改进意见,我觉得都是可取的方式。
  3. 希望对课程平台做出一些优化。目前最大的问题就是没有滚动条,浏览内容非常不方便(其实将下图的两个 css 属性去掉就可以,为什么不搞一下呢?);其次是希望能看到上一次提交的 commit hash,方便知道自己是否提交了最新的代码;然后希望每单元作业开一个 git repo(而不是像现在这样每次作业一个),这样更符合逻辑也更方便;希望提交后的评测界面能给 WAITING 状态的提交显示一个转圈的图表(而非和 WRONG ANSWER 一样的图标);最后, hack 页面下载代码时,文件名能够保存为人名称(而不是无意义的 hash)。这些改进相信能提升课程平台的使用体验,节省同学们的时间。

线上学习课程的体会

OO 课程具有挑战性和竞争性,可以收获乐趣,但又避免了恶性竞争,是非常难得的。关于线上学习,对我来说和线下学习区别不大。

原文地址:https://www.cnblogs.com/t123yh/p/13160891.html