zoukankan      html  css  js  c++  java
  • 面向对象第四单元总结

     本单元架构设计

    本单元代码以查询对象结构为主,所以在代码中使用大量的 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 课程具有挑战性和竞争性,可以收获乐趣,但又避免了恶性竞争,是非常难得的。关于线上学习,对我来说和线下学习区别不大。

  • 相关阅读:
    java语法基础(总结)
    ZookeeperclientAPI之创建会话(六)
    对A轮的追逐变得越加狂热,当前距离互联网泡沫到底有多近?
    Java集合(一):Java集合概述
    深入了解Cookie(1)------selenium2进行Cookie操作的前奏
    Cocos2d-X开发中国象棋《九》走棋规则
    java中request,application,session三个域及参数简单示例
    在多浏览器使用JS复制内容到剪切板,无需插件
    初学structs2,结果类型简单示例
    使用servletAPI三种方式简单示例
  • 原文地址:https://www.cnblogs.com/t123yh/p/13160891.html
Copyright © 2011-2022 走看看