2020 OO 第四单元总结 UML
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. 课程收获
一定一定要做好测试!写完代码不测试就像晚上开车不开灯
学习了Git的使用、Java/Python的基本语法、多线程、契约式编程、UML等知识
算法无论何时都非常关键,接下来可以继续加强这方面的练习
5. 改进建议
首先是关于实验课,和每次作业都会有非常快速且积极的反馈相比,实验课不公布成绩,只通过后一次课件的ppt展示整体的完成情况,让人不知道自己做的到底对不对,训练效果有所折扣。另外某几次实验课的难度确实有些大,虽然也让我对GC垃圾回收机制等有了一定了解,但那次找Bug真的是灾难……改进上我觉得可以降低实验课所占分数比(虽然我很希望被捞),增加讨论占比,每次结束后与作业一样公布结果。
然后是关于研讨课,看了我好几个同学的博客都在批评研讨课后期太水,我其实觉得R老师的研讨课还是安排得比较好的。其实我感觉按照当前研讨课报名方式,后期研讨课存在灌水现象是非常正常的。OO给我的感觉是一门下线很高,上限无穷无尽的课程,你永远不知道隔壁的大佬为了写评测机和优化算法都用了什么高深的技巧。然而大佬的数量是有极限的,按照两周一次每次3-4个人的频次,自然不可能所有人都拿出“干货”。这一点我觉得R老师后期研讨课会安排同学做作业总结就非常好,说的也是我们我觉得如果把这个当作每次研讨课的保留项目,让所有同学讨论不同架构和各自的优势,也比较方便大家优化自己的代码,避免大佬很快讲完无话可讲的情况。
最后关于作业,我觉得JML可以放在第一章(Pre之后),前两单元对JML工程体系的帮助可能并不大,短期内JML工具链应该还是不完备的,(当然不排除大佬暑假致力于为下一届带来船新的JML体验的可能),所以下一届应该也和我们的体验差不多,将JML可以放在第一章,可以一开始就给大家一个关于契约式编程的粗浅理解,更早地感受到规格化描述和迭代开发的重要性,在多项式和多线程电梯也能少吃一点苦头。
6. 线上学习OO课程的体会
与OS、航概等相比,我觉得本学期OO是收到疫情影响最小的一门课程,本身也没有考试(而是愉快的周周乐),期末受到的影响也不大。而且慕课可以随时回放,研讨课虽然有点冷清但线下也未必更好,所以线上学习OO我感觉很是很愉悦的一门课程。
记得在上OO这门课之前我还上X乎看了往届学长们对课程的评价,看到曾经的吐槽,看到X乎上学长关于OO课程改革的回答,这一学期我也亲身体验了OO,还是不知多少年一遇的线上特供版(笑哭),OO让我有了获得知识的充实感,一次次的训练作业也是循序渐进,助教也很认真负责。感谢orz
2020 OO 第四单元总结 UML的更多相关文章
- OO第四单元——基于UML的UML解析器总结&OO课程总结
OO第四单元--基于UML的UML解析器总结&OO课程总结 前言:一学期愉快(痛苦)的OO课程学习结束了,OO几个单元作业都各有特色,实验也各有特色,仔细回味起来,不再是单纯的敲代码(但自己还 ...
- 2019年北航OO第四单元(UML任务)及学期总结
第四单元两次作业总结 第十三次作业 需求分析 本次作业需要完成一个UML类图解析器,所需要解析的只有符合UML标准和能够在Java 8中复现的UML类图.查询指令存在两种:仅与所查对象有关的指令,以及 ...
- 2020北航OO第四单元总结
2020北航OO第四单元总结 一.本单元架构设计 本单元作业是实现一个UML图解析器,其中实现接口及主要框架课程组已经提供,只需要我们完成特定功能. 在第一次作业时,感到十分迷茫,不知道如何下手,最后 ...
- OO第四单元(UML)单元总结
OO第四单元(UML)单元总结 这是OO课程的第四个单元,也是最后一个单元.这个单元只有两次作业,相比前三个单元少一次作业.而且从内容上讲这个单元的作业目的以了解UML为主,所以相对前三个单元比较简单 ...
- 北航OO第四单元——UML图解析
北航OO第四单元--UML图解析 作业要求简析 刚接触本次作业可能需要花上一会才能搞清楚到底是要我们写个啥,在这里简单说一下: UML图的保存格式.mdj文件是以json文件的形式存储的,将每一个Um ...
- OO第四单元UML作业总结暨OO课程总结
目录 目录一.第四单元UML两次作业架构设计第一次作业第二次作业二.架构设计总结与OO方法理解演进三.测试理解与实践演进四.课程收获总结五.课程改进建议六.尾声 一.第四单元UML两次作业架构设计 第 ...
- OO 第四单元总结
一.总结本单元两次作业的框架设计 1.1. 需求分析 通过分析mdj文件可知,两次作业如果对于时间复杂度没有要求,可以不涉及任何数据结构,直接根据读入的UML_ELEMENT逐个分析得到各个函数的结果 ...
- 【OO学习】OO第四单元作业总结及OO课程总结
[OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...
- 返璞归真——OO第四单元总结暨学期总结
本次作业是第四单元的最后一次作业,也是本学期面向对象的最后一次作业,在此我将分别对第四单元和整个学期进行总结. 一.本单元的两次作业 第四单元的作业是关于UML的一些处理.UML语言是一种区别于具体语 ...
随机推荐
- SVG & getBBox
SVG & getBBox https://developer.mozilla.org/en-US/docs/Web/API/SVGGraphicsElement/getBBox const ...
- flutter 插件调用callback函数
dart plugin class TestLib { static MethodChannel _channel = const MethodChannel('test_lib') ..setMet ...
- macOS & Nginx
macOS & Nginx ngnix # 使用 brew 安装(如果没有 brew 命令,需要自行安装 brew) $ brew install nginx $ nginx -h # 查看 ...
- NGK内存爆发式增长,看Baccarat将怎样打造全新的全场景金融生态
从数字货币抵押借贷业务出发,DeFi已经形成了覆盖全场景的全新金融生态. 可以说,除了信贷等少数对现实世界信息存在较多依赖的实体业务,DeFi已经实现了传统金融业务的全面链上迁移.大多数传统金融行业存 ...
- Python_20行代码实现微信消息防撤回(简易版)
学习了一下如何用python实现微信消息的防撤回, 主要思路就是: 时时监控微信,将对方发送的消息缓存下来 如果对方撤回了消息,就将该缓存信息发送给文件传输助手 但其实这功能,基本上毫无意义,看到别人 ...
- linux查看目录文件以及子目录文件大小的命令
可以使用以下命令,不过如果文件比较多,因为是递归统计大小的的,所以结果出来的会比较慢,需要等待. du -h --max-depth=1 * 以下是命令的说明 du [-abcDhHklmsSx] [ ...
- Lambad表达式--Java8新特性
1.概述 Lambda是一个匿名函数,是java8的一个新特性.可以对接口进行非常简洁的实现.但它要求接口中只能有一个抽象方法,原因是lambda只能实现一个方法.另外,需要在接口上添加注解@Func ...
- 第50天学习打卡(JavaScript)
前端三要素 HTML(结构):超文本标记语言(Hyper Text Markup Language),决定网页的结构和内容. CSS(表现):层叠样式表(Cascading Style Sheets) ...
- R语言barplot ,掌握本篇的内容,基本的条形图都可以画了
本篇主要想复现文章中的一张图,原图来源(Antibiotic resistome and its association with bacterial communities during sewag ...
- Linux操作php.ini文件
有时你使用的是别人搭建好的环境,不知道php.ini在哪里,或者好久没有修改配置了,已经忘记了路径在哪,所以在操作文件之前,得先要找到.ini路径. 找php.ini 方式一 $ php -i | g ...