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. js 使用socket-io发送文件

    更多 前端 import { Component, OnInit, ViewChild, ElementRef } from '@angular/core'; import { MediaDevice ...

  2. Flutter: 判断是Android还是Ios

    /// 在ui中使用下面的这个判断 Theme.of(context).platform == TargetPlatform.android /// 而不是 import 'dart:io' Plat ...

  3. 别再人云亦云了!!!你真的搞懂了RDD、DF、DS的区别吗?

    几年前,包括最近,我看了各种书籍.教程.官网.但是真正能够把RDD.DataFrame.DataSet解释得清楚一点的.论据多一点少之又少,甚至有的人号称Spark专家,但在这一块根本说不清楚.还有国 ...

  4. @RestController和@Controller

    1.使用@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面 若返回json等内容到页面,则需要加@ResponseBody注解 2 ...

  5. Deep Unfolding Network for Image Super-Resolution 论文解读

    Introduction 超分是一个在 low level CV 领域中经典的病态问题,比如增强图像视觉质量.改善其他 high level 视觉任务的表现.Zhang Kai 老师这篇文章在我看到的 ...

  6. Docker镜像构建原理解析(不装docker也能构建镜像)

    在devops流程里面 构建镜像是一个非常重要的过程,一般构建镜像是写dockerfile文件然后通过docker client来构建的image. docker client 会先检查本地有没有im ...

  7. Flask:数据库管理

    为什么不使用SQL语句,而使用ORM框架管理数据库?首先,在python程序中嵌入原生SQL语句,不方便维护,ORM框架使用面向对象思想,使用较方便:第二,如果更换底层数据库引擎,ORM框架不需要修改 ...

  8. jmeter数据库链接配置

    通常使用数据库有3个要求,性能好.数据一致性有保障.数据安全可靠:数据库优化的前提也是这三个要求.有句玩笑话叫少做少犯错,不做不犯错.DB优化的思路就是少做,减少请求次数,减少数据传输量,减少运算量. ...

  9. AQS源码解读(ReentrankLock的公平锁和非公平锁)

    构建Debug代码: 1 package com.hl.interview.lock; 2 3 import java.util.Scanner; 4 import java.util.concurr ...

  10. python学习之常用数据结构

    前言:数据结构不管在哪门编程语言之中都是非常重要的,因为学校的课程学习到了python,所以今天来聊聊关于python的数据结构使用. 一.列表 list 1.列表基本介绍 列表中的每个元素都可变的, ...