title: 2020 OO 第四单元总结 date: 2020-06-14 19:10:06 tags: OO categories: 学习

1. 本单元三次作业的架构设计

本单元的代码编写与第三单元有相似之处,课程组已经提供了相应的接口,我们只需要满足具体的实现。在架构设计上我选择了建立MyUmlClass等类,采用适配器模式以管理UML对象,并配置相应的方法的方式,更加符合面向对象的设计思维。

1.1 第一次作业

在第一次作业其实还没有考虑好迭代开发,在UML对象的存储方式上比较混乱,有的采用Arraylist、有的建立了从id到元素的映射map、有的建立了从name到元素的映射map,导致之后第三次作业处理异常输入时花了很多时间重构。做的还可以的是设置了类图单独的管理器,核心类直接调用管理器的相关方法,便于之后两次作业的迭代。

第一次作业没有遇到Bug,感动。

1.2 第二次作业

第二次作业增加了UML状态图和时序图,我分别建立了管理对应图像的管理器类,核心类调用管理器的相关方法。

第二次作业没有遇到Bug,很感动。

1.3 第三次作业

第三次作业增加了多种模型有效性检查,现在想来我对异常输入的处理还不到位,进行了很多重构。

第三次作业没有遇到Bug,感动到差点忍不住流泪。

第三次作业类图如下所示:

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

2.1 第一单元

在第一单元,我通过预习对于Java的基本语法和继承关系有了一定的了解,不过每次写代码时并没有考虑到下一次的迭代,算是次次重构。第三次作业设计的结构有着比较好的扩展性,将因子和因子运算方式抽象为对象,实现了求导接口。如果之后还要增加新需求,对于每一种新函数只要在内部配置求导方法,对于每一种新的运算方式只需要在内部配置运算规则,层次化的表达式存储方式可以通过统一的接口进行因子类型的转换。

在这一单元,我进一步实践了继承、接口等Java的特性,不过代码还是以面向过程为主。

2.2 第二单元

第二单元从第二次作业开始增加了多电梯和对多线程的考察。这一次一开始就希望能为后续的扩展留好迭代空间,电梯设计为有限状态机,三次作业都是采用生产者/消费者模式。其中“生产者”为输入线程,将读取到的请求放到“货架”上;“消费者”则是每个电梯线程,以一种类似观察者模式的方式追踪“货架”的变化。之所以说是类似,是因为我每次都是在电梯自身状态发生改变后获取当前的“货架”内容,而不是“货架”一有更新就通知电梯,我只有“货架”类的方法是上锁的,其他类调用时不需要考虑是否会引发线程不安全问题,写起来很方便。

这一单元的面向对象意识有所提升,不同类协同合作,实现高速载人。

2.3 第三单元

第三单元我觉得在架构设计上课程组给的规格已经给了很多提示,自己也没有太多发挥空间。主要的难点是几个算法的实现。实验课倒是学习了垃圾回收机制,结合讨论区查看了HashMap相关的底层实现,在作业中则表现为进而选择为其设置初始容量。

2.4 第四单元

建立MyUmlClass等类,采用适配器模式以管理UML对象,并配置相应的方法。

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

第一单元是随机数据+讨论区数据对拍,第二单元多线程耗时长,所以用了Pb的多线程评测机;第三单元发生失误,在第二次作业漏测了一条指令,结果正好出错,强测爆炸,之后第三次就老老实实Junit单元测试了;第四次作业以手动构造样例为主。

那么当我们在测试的时候,我们在做什么?最简单来说就是考虑所有输入的结果,并且保证每种都会有正确的交互,结果。但是在实际过程中要完全覆盖所有的可能性显然是做不到的,所以说在测试的时候我们应该尽可能地取出典型样例,而这就是两种方法——随机生成数据或者手动构造针对性数据。

而对于互测来说,要同时检查7个人的错误,单单靠在控制台输入输出显然是低效的,因此也需要结合脚本统一测试。在四次作业我都是使用手动构造数据+评测机对拍测试的方式(嫖来的东西真香),我自己也学习了Python语法,写了对拍程序,接下来打算学习下某位大佬的可视化评测机是咋写的。

4. 课程收获

  1. 一定一定要做好测试!写完代码不测试就像晚上开车不开灯

  2. 学习了Git的使用、Java/Python的基本语法、多线程、契约式编程、UML等知识

  3. 算法无论何时都非常关键,接下来可以继续加强这方面的练习

5. 改进建议

  1. 首先是关于实验课,和每次作业都会有非常快速且积极的反馈相比,实验课不公布成绩,只通过后一次课件的ppt展示整体的完成情况,让人不知道自己做的到底对不对,训练效果有所折扣。另外某几次实验课的难度确实有些大,虽然也让我对GC垃圾回收机制等有了一定了解,但那次找Bug真的是灾难……改进上我觉得可以降低实验课所占分数比(虽然我很希望被捞),增加讨论占比,每次结束后与作业一样公布结果。

  2. 然后是关于研讨课,看了我好几个同学的博客都在批评研讨课后期太水,我其实觉得R老师的研讨课还是安排得比较好的。其实我感觉按照当前研讨课报名方式,后期研讨课存在灌水现象是非常正常的。OO给我的感觉是一门下线很高,上限无穷无尽的课程,你永远不知道隔壁的大佬为了写评测机和优化算法都用了什么高深的技巧。然而大佬的数量是有极限的,按照两周一次每次3-4个人的频次,自然不可能所有人都拿出“干货”。这一点我觉得R老师后期研讨课会安排同学做作业总结就非常好,说的也是我们我觉得如果把这个当作每次研讨课的保留项目,让所有同学讨论不同架构和各自的优势,也比较方便大家优化自己的代码,避免大佬很快讲完无话可讲的情况。

  3. 最后关于作业,我觉得JML可以放在第一章(Pre之后),前两单元对JML工程体系的帮助可能并不大,短期内JML工具链应该还是不完备的,(当然不排除大佬暑假致力于为下一届带来船新的JML体验的可能),所以下一届应该也和我们的体验差不多,将JML可以放在第一章,可以一开始就给大家一个关于契约式编程的粗浅理解,更早地感受到规格化描述和迭代开发的重要性,在多项式和多线程电梯也能少吃一点苦头。

6. 线上学习OO课程的体会

与OS、航概等相比,我觉得本学期OO是收到疫情影响最小的一门课程,本身也没有考试(而是愉快的周周乐),期末受到的影响也不大。而且慕课可以随时回放,研讨课虽然有点冷清但线下也未必更好,所以线上学习OO我感觉很是很愉悦的一门课程。

记得在上OO这门课之前我还上X乎看了往届学长们对课程的评价,看到曾经的吐槽,看到X乎上学长关于OO课程改革的回答,这一学期我也亲身体验了OO,还是不知多少年一遇的线上特供版(笑哭),OO让我有了获得知识的充实感,一次次的训练作业也是循序渐进,助教也很认真负责。感谢orz

2020 OO 第四单元总结 UML的更多相关文章

  1. OO第四单元——基于UML的UML解析器总结&OO课程总结

    OO第四单元--基于UML的UML解析器总结&OO课程总结 前言:一学期愉快(痛苦)的OO课程学习结束了,OO几个单元作业都各有特色,实验也各有特色,仔细回味起来,不再是单纯的敲代码(但自己还 ...

  2. 2019年北航OO第四单元(UML任务)及学期总结

    第四单元两次作业总结 第十三次作业 需求分析 本次作业需要完成一个UML类图解析器,所需要解析的只有符合UML标准和能够在Java 8中复现的UML类图.查询指令存在两种:仅与所查对象有关的指令,以及 ...

  3. 2020北航OO第四单元总结

    2020北航OO第四单元总结 一.本单元架构设计 本单元作业是实现一个UML图解析器,其中实现接口及主要框架课程组已经提供,只需要我们完成特定功能. 在第一次作业时,感到十分迷茫,不知道如何下手,最后 ...

  4. OO第四单元(UML)单元总结

    OO第四单元(UML)单元总结 这是OO课程的第四个单元,也是最后一个单元.这个单元只有两次作业,相比前三个单元少一次作业.而且从内容上讲这个单元的作业目的以了解UML为主,所以相对前三个单元比较简单 ...

  5. 北航OO第四单元——UML图解析

    北航OO第四单元--UML图解析 作业要求简析 刚接触本次作业可能需要花上一会才能搞清楚到底是要我们写个啥,在这里简单说一下: UML图的保存格式.mdj文件是以json文件的形式存储的,将每一个Um ...

  6. OO第四单元UML作业总结暨OO课程总结

    目录 目录一.第四单元UML两次作业架构设计第一次作业第二次作业二.架构设计总结与OO方法理解演进三.测试理解与实践演进四.课程收获总结五.课程改进建议六.尾声 一.第四单元UML两次作业架构设计 第 ...

  7. OO 第四单元总结

    一.总结本单元两次作业的框架设计 1.1. 需求分析 通过分析mdj文件可知,两次作业如果对于时间复杂度没有要求,可以不涉及任何数据结构,直接根据读入的UML_ELEMENT逐个分析得到各个函数的结果 ...

  8. 【OO学习】OO第四单元作业总结及OO课程总结

    [OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...

  9. 返璞归真——OO第四单元总结暨学期总结

    本次作业是第四单元的最后一次作业,也是本学期面向对象的最后一次作业,在此我将分别对第四单元和整个学期进行总结. 一.本单元的两次作业 第四单元的作业是关于UML的一些处理.UML语言是一种区别于具体语 ...

随机推荐

  1. Mybatis-04 日志、分页

    Mybatis-04 日志.分页 日志 1.日志工厂 如果数据库操作出现异常,就需要打印日志来排错. 日志工厂会把日志工作委托实现: SLF4J Apache Commons Logging Log4 ...

  2. django学习-15.ORM查询方法汇总

    1.前言 django的ORM框架提供的查询数据库表数据的方法很多,不同的方法返回的结果也不太一样,不同方法都有各自对应的使用场景. 主要常用的查询方法个数是13个,按照特点分为这4类: 方法返回值是 ...

  3. mysql explain type详解

    本文转载自最官方的 mysql explain type 字段解读 读了很多别人的笔记都杂乱不堪,很少有实例,什么都不如原装的好,所以当你读到我的笔记的时候如果觉得说的不明白,最好参考官方的手册. 我 ...

  4. 学习String源码的部分方法

    先看构造器: private final char value[]; //char类型的数组 以下均会用到 private int hash; //缓存字符串的哈希值 //以下均会用到 public ...

  5. DatePicker日期选择器的使用

    效果展示: 代码如下: <el-date-picker v-model="listQuery.times" type="daterange" range- ...

  6. 如何用Eggjs从零开始开发一个项目(3)

    上一篇中我们编写了用户注册登录.登录的代码,学习了如何进行用户的认证(JWT),如何安全地存储用的密码(hash).这一篇我们有以下2个任务: 获取token中的数据: 通过model来同步数据库. ...

  7. 基于QT的全自动超声波焊接机上位机追溯系统(已经在设备上应用)

    应用说明: 本上位机程序是我在做锂电池产线项目的时候开发的,用于采集设备数据以及实现设备自动控制,下位机采用基恩士PLC,超声波机采用上海一家的超声波焊接机,实现电芯极耳的自动焊接,上位在设备焊接过程 ...

  8. 看完我的笔记不懂也会懂----Node.js

    Node.js 学习 - 命令行窗口 - 进程与线程 - ECMAScript的缺点 - Node模块化 - Node中的全局对象 - 包 package - NPM包管理器 (Node Packag ...

  9. Spring MVC 配置记录

    目录 1.从pom.xml配置Maven文件开始 2.web.xml 3.springmvc-config.xml 4.controller 使用 idea 编辑器 + Maven + spring ...

  10. powerdesigner 16.6破解版下载,支持hive,数据模型hql导出

    powerdesigner 16是一款业内领先的建模工具,是一款开发人员常用的数据库建模工具. 在大数据数据仓库建设过程中,离线数仓往往以hive为基础,但数仓建模过程中老版本不支持hive,这个模型 ...