OO第四单元总结暨期末总结
OO第四单元总结暨期末总结
第四单元三次作业架构与迭代
整体感受
第四单元主要学习的是UML相关的知识,大体包括类图,顺序图与状态图。在理论课掌握了所有知识点的前提下,代码实践部分的难点则集中在初期阅读大量官方代码(yysy,第一次作业开始写代码前我至少花了3h+的时间理解到底要做什么,开局处于完全蒙蔽的状态,有OS那味儿了,中后期则主要在各种element之间的结构设计方面,只要搭好了整体的框架,剩下的就是简单而冗杂的填写代码了。用我在通宵肝完第二次作业后发的pyq做个总结,“写UML和建高楼一样,设计师先绞尽脑汁想出一个完美的架构,接着无数工人日以继夜的重复着机械性的工作,思考和建造都十分痛苦,等大楼建好,会有一瞬间的成就感。然而万幸又不幸的是,coder是设计师和工人的结合体。。。”
HW1
第一次作业主要任务为完成类图的识别处理。整体的element结构可以归为一个树形,顶层为UmlInteraction,用于储存多个class,第二层为class,储存了所有Operation和实现的Interface,剩下的Parameter则储存在Operation中。并且由于mdj文件格式读入顺序的原因,需要两次读入才能读取全部的element,因此我设计了两次Build类来进行读入刷新。
HW2
第二次作业相比第一次作业新引入了状态图与顺序图的解析,因此可以将三者的顶层父类设置为UmlGeneralInteraction,类比第一次的作业,在UmlCollaborationInteraction与UmlStateChartInteraction中分别实现顺序图与状态图,其中UmlStateChartInteraction -> UmlStateMachine -> UmlRegion。在代码实现部分,由于本身对运行时间的要求不高,大部分的容器选择HashMap,能有效的去重与快速查询。值得一提的而是,需要为每种查询方法的结构设置专门的容器并且设置标记,来节约时间。
HW3
第三次作业去前两次比在架构上没有过多的改动,只是加入了异常检测,因此只需将各个异常下发至UmlClassModeInteraction,UmlCollaborationInteraction与UmlStateChartInteraction三个大类中即可。最大的难点在于对图的优化,这里我学习了Floyd来检测循环图,还有便是由于要对重复输入的各种element进行反馈,则需要将前两次作业中“自动去重”Map换为Arraylist来获得全部的element。
下面是我最终作业的整体结构UML分析图:
四个单元架构设计与方法演进
Unit1
第一单元YYSY由于初次接触面向对象,我对单独一个问题的分析还主要停留在面向过程的思路。虽然能勉勉强强分出 输入字符串 -> 多项式 ->项 -> 因子 -> 求导结果 的链式结构,但在具体解析,异常判断,结算,输出等功能模块上架构一塌糊涂。全部塞到Main里,光荣的继承了一main到底的传统,也直接导致了我整个OO课程中唯一次通宵重构情况的出现QAQ。
Unit2
第二单元在整体架构上其实考察较少,主要难点在于对多线程的理解,测试,与电梯算法的实现。架构方面主要还是以生产-消费者模式为主,将输入的Passengers和电梯elevator分别当作生产者与消费者线程,等待缓冲区中的乘客作为共享资源,同时为调度器Controller专门开一个线程,以减少电梯线程和输入线程的交集,减少死锁发生的概率。剩下的便是电梯算法的选择,我使用了改良版的LOOK算法,最终性能测试效果很好。处理死锁则分为两个部分,在代码实现阶段通过synchronized同步锁保护共享资源,而第二部分则是在测试阶段通过构造的大量随机边界数据来试错。第三次新增的换乘则通过加入Changer换乘线程与之前的Passenger与elevator线程共享等待队列即可,具体实现则需加入各种标记来确定该Passenger所处的状态与目的。
Unit3
第三单元JML在架构设计上也较为简单,主体的代码结构已经给出,难点则在对图的理解与算法层面。架构中考察的核心也在于如何选择合适的容器类型来提高效率,我选择设置缓冲区,Map处理查询,List处理遍历,二者双剑合璧的设计思路。在算法层面,难点集中在双连通,最短路径,循环回路判断,需要阅读自学大量网上和同学提供的资料博客,恶补遗忘的离散。
Unit4
第四单元架构方面上文已经提到,可以说本Unit对架构的要求是所有作业中最高的,思考出一个好的架构能一劳永逸,让整个单元演变为简单平淡的代码填写任务(类似隔壁OS实验)。总体来讲我采用了树状的架构,保持子类与父类的通信,同时设计出明显的递进迭代关系,总体单元体验较佳。
四个单元测试理解与实践的演进
每个单元具体的测试方法在该单元总结中已经提到,总的来讲,第一单元主要通过手捏边界数据,用Python自带的库写评测机两个方法来实现,yysy感觉第一单元单纯在想要实现全部数据的覆盖方面,是在四个单元中难度排在较前的,主要在于很容易遗漏许多特殊情况,这时讨论区和朋友的重要性就体现出来了。第二单元由于多线程的原因,对测试的要求便是全面覆盖与大量数据试错,通过随机数据搭建评测机即可。第三四单元由于实现的功能较多,除去明确考察性能的点(例如双连通)需要手捏测试数据外(肖学姐的万恶菱形图历历在目),剩下的我均采用与同学对拍的方式进行,效果很好。
课程收获
可以说OO是目前为止来到北航后我上的最好,最接近实际应用的课程了。不仅学习到了实现各种测试方法工具与OO代码实现的知识,更重要的是结合理论课上老师讲述的知识,理解了从接手一个项目,到分析设计架构,选择合适的模型,再到实现这个整体的工作框架与面向对象的思考思路,我认为这个是我本学期最大的收获了,也对我以后的学习,实验乃至工作,都有很大作用。
课程建议
- 我一直认为第一单元作业的设计有可以改进的地方。综合来讲,我在第一单元花费的精力与掉的头发是最多的,当然有一定原因是第一次接触OO,但绝大功夫都花在思考读入多项式算法,正则的构造与拼凑各种古怪的测试数据我认为应该也不是个例,相信很多同学的第一次或者说唯一一次重构都交代在了第一单元,而重构的原因大多都是读入数据格式的变化与要求的变化。因此我认为在初入OO的第一单元作业,可以将考察重点放在架构的分析设计上,而不是形如程设DS的面向过程数据处理上。
- 希望能将实验每次的成绩透明话,yysy目前都不清楚自己实验的得分,感觉怪怪的,并且有几次的实验难度离奇的高,需要阅读理解的代码太多,很难get到考察的点。
- 希望对互测时提交的次数设置上限,或者对多次提交针对他人的同质问题设置一定的惩罚措施,有次一个bug被某个小朋友爆破了8次感觉着实不爽,虽然最后合并修复了,但也能猜到该同学抱着赌对面不修复的心理,来回提交类似的手捏数据,并不是评测机生成的随机数据,让整个互测的用意都变了味儿。。。
线上学习体会
感觉线上与线下的学习效果区别不大,除去无法见到可爱的老师与助教们外,剩下的遗憾就是缺少了研讨课听行业大牛谈心得的机会,希望以后能蹭课补上hh。
OO第四单元总结暨期末总结的更多相关文章
- OO第四单元总结暨OO课程总结
一.第四单元作业总结 本单元的主要任务是对 Uml 图元素进行管理和查询,测试一开始会输入一个静态图,之后会对图中相关内容进行查询. 第13,14次作业 第14次作业新增内容很少,故与第13次作业放在 ...
- 返璞归真——OO第四单元总结暨学期总结
本次作业是第四单元的最后一次作业,也是本学期面向对象的最后一次作业,在此我将分别对第四单元和整个学期进行总结. 一.本单元的两次作业 第四单元的作业是关于UML的一些处理.UML语言是一种区别于具体语 ...
- OO第四单元总结暨学期总结
一.第四单元作业架构设计 我们第四单元围绕UML图展开,在第四单元开始之前,本来以为我们的工作是学习如何使用UML工具,开始后才意识到我们要做的是解析UML类图.顺序图和状态图.当然,让我们解析的只是 ...
- oo第四单元作业总结暨课程总结
oo第四单元作业总结暨课程总结 一.本单元作业架构设计 本单元需要构建一个UML解析器,通过对输入的UML类图/顺序图/状态图的相关信息进行解析以供查询,其中课程组已提供输入整体架构及输入解析部分,仅 ...
- OO第四单元(UML)单元总结
OO第四单元(UML)单元总结 这是OO课程的第四个单元,也是最后一个单元.这个单元只有两次作业,相比前三个单元少一次作业.而且从内容上讲这个单元的作业目的以了解UML为主,所以相对前三个单元比较简单 ...
- 2020 OO 第四单元总结 UML
title: 2020 OO 第四单元总结 date: 2020-06-14 19:10:06 tags: OO categories: 学习 1. 本单元三次作业的架构设计 本单元的代码编写与第三单 ...
- 【OO学习】OO第四单元作业总结及OO课程总结
[OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...
- OO第四单元总结及课程总结
OO第四单元总结及课程总结 一.前言 紧张刺激的OO“昆仑课程”接近尾声,经过一个学期的学习,我的收获和感触颇多,借此博客作业的机会,对自己OO这门课程做一个总结.本博客主要有以下五个方面,一是第UM ...
- OO第四单元博客作业
OO第四单元博客作业 BUAA_1706_HugeGun 目录 第四单元作业架构设计 四个单元架构设计及OO方法理解 四个单元测试理解与实践演进 课程收获 一点建议 第四单元作业架构设计 ### 第十 ...
随机推荐
- Flutter 删除AppBar的返回icon
设置automaticallyImplyLeading: false即可,替换可以修改"leading"参数 ... appBar: AppBar( automaticallyIm ...
- Captain technology INC:全球新能源汽车格局突变
美国能源信息署EIA的统计数据显示,2020年上半年全美含纯电动和插电混动在内的新能源乘用车总销量仅为11.1万辆,同比缩水25%.虽然特斯拉在第三季度靠着13.93万辆的销量迎来了环比387%.同比 ...
- uni-app小白入门自学笔记(一)
码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14427845.html 目录 码文不易啊,转载请带上本文链接呀,感谢感谢 https ...
- JUnit5学习之三:Assertions类
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- SpringBoot2.x中的AOP机制总结(附带demo)
寄语:刚开始学aop的时候是大三吧,老师讲的不好,我也没学好,导致现在才有个较为清晰的认知,那个时候只知道有aop, 根部不明白aop的作用,时至今日,任然觉得aop难以咀嚼,奈何平时不用面试要用,特 ...
- Python 学习笔记(3)
Python 文件I/O 读取键盘输入: Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘: 1. raw_input #函数从标准输入读取一个行,并返回一个字符串(去掉结尾 ...
- 如何使用 HttpReports 监控 .NET Core 应用程序
简介 HttpReports 基于.NET Core 开发的APM监控系统,使用MIT开源协议,主要功能包括,统计, 分析, 可视化, 监控,追踪等,适合在中小项目中使用. github:https: ...
- mysql查询缓存简单使用
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBM ...
- Fedora/Centos使用dnf/yum为Firefox安装Flash,两行命令超简单
Fedora/Centos使用dnf/yum为Firefox安装Flash,两行命令超简单 Flash已死,我想这个方法应该已经失效了吧,毕竟是从adobe的官方下载的,应该是撤链接了,我也很久没安装 ...
- Boltdb学习笔记之〇--概述
更多精彩内容,请关注微信公众号:后端技术小屋 看了boltdb也有一阵子了,看完之后总想写点什么,因为感觉到这可能是个不小的坑,所以迟迟没有动笔(没错我的拖延症又犯了..).最近有一种流行的说法:如果 ...