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第四单元总结暨期末总结的更多相关文章

  1. OO第四单元总结暨OO课程总结

    一.第四单元作业总结 本单元的主要任务是对 Uml 图元素进行管理和查询,测试一开始会输入一个静态图,之后会对图中相关内容进行查询. 第13,14次作业 第14次作业新增内容很少,故与第13次作业放在 ...

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

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

  3. OO第四单元总结暨学期总结

    一.第四单元作业架构设计 我们第四单元围绕UML图展开,在第四单元开始之前,本来以为我们的工作是学习如何使用UML工具,开始后才意识到我们要做的是解析UML类图.顺序图和状态图.当然,让我们解析的只是 ...

  4. oo第四单元作业总结暨课程总结

    oo第四单元作业总结暨课程总结 一.本单元作业架构设计 本单元需要构建一个UML解析器,通过对输入的UML类图/顺序图/状态图的相关信息进行解析以供查询,其中课程组已提供输入整体架构及输入解析部分,仅 ...

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

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

  6. 2020 OO 第四单元总结 UML

    title: 2020 OO 第四单元总结 date: 2020-06-14 19:10:06 tags: OO categories: 学习 1. 本单元三次作业的架构设计 本单元的代码编写与第三单 ...

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

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

  8. OO第四单元总结及课程总结

    OO第四单元总结及课程总结 一.前言 紧张刺激的OO“昆仑课程”接近尾声,经过一个学期的学习,我的收获和感触颇多,借此博客作业的机会,对自己OO这门课程做一个总结.本博客主要有以下五个方面,一是第UM ...

  9. OO第四单元博客作业

    OO第四单元博客作业 BUAA_1706_HugeGun 目录 第四单元作业架构设计 四个单元架构设计及OO方法理解 四个单元测试理解与实践演进 课程收获 一点建议 第四单元作业架构设计 ### 第十 ...

随机推荐

  1. mysql一张表到底能存多少数据?

    前言 程序员平时和mysql打交道一定不少,可以说每天都有接触到,但是mysql一张表到底能存多少数据呢?计算根据是什么呢?接下来咱们逐一探讨 知识准备 数据页 在操作系统中,我们知道为了跟磁盘交互, ...

  2. 从零开始搞后台管理系统(1)——shin-admin

      shin 的读音是[ʃɪn],谐音就是行,寓意可行的后台管理系统,shin-admin 的特点是: 站在巨人的肩膀上,依托Umi 2.Dva 2.Ant Design 3和React 16.8搭建 ...

  3. TERSUS无代码开发(笔记08)-简单实例电脑端后台逻辑开发

    主管审批功能逻辑开发 1.查询逻辑开发(查询待审批记录) 2.批准处理(将选中的一条记录进行批准处理)  =============================================== ...

  4. Vue学习笔记-vue调试工具vue-devtools安装及使用

    一  使用环境: windows 7 64位操作系统 二  vue调试工具vue-devtools安装及使用 1.下载: 百度中查找  "vue-devtools下载"  找到最新 ...

  5. 后端程序员之路 42、Semaphore

    前面学习了Pthreads,了解了线程和线程同步,而同步这个东西,与信号量是密不可分的.下面讨论的主要是Pthreads里的semaphore.h,而不是sys/sem.h [Linux]线程同步之信 ...

  6. 后端程序员之路 29、Thrift

    Apache Thrift是Facebook实现的一个高效的.支持多种编程语言的远程服务调用(RPC)框架. Apache Thrift - Homehttp://thrift.apache.org/ ...

  7. 【知识点】 gcc和g++的联系和区别

    目前(2020-09)GCC 编译器已经更新至 10.2版本,其功能也由最初仅能编译 C 语言,扩增至可以编译多种编程语言,其中就包括 C++ . 除此之外,当下的 GCC 编译器还支持编译 Go.O ...

  8. 最简单的,在win,linux中,用powershell,自动获取Let's Encrypt证书方法

    powershell传教士原创 2020-04-12 Let's Encrypt证书有效期3个月,支持泛域名[*.你的网站.net].支持n天内(一般10天内就够用了),用脚本自动续期. 简介: 这个 ...

  9. HDOJ-3416(最大流+最短路+ISAP算法+向前星dijikstra算法+如何判断一条边是否在最短路中)

    Marriage Match IV HDOJ-3416 这题的题意就是要找两点之间最短路的路径个数,而且边不能重复. 最大流和最短路的结合.首先正向和反向建图,再跑两遍dijikstra.到这里就求出 ...

  10. c++:一个辅助类让内存泄漏现原形!

    前言 对于c++而言,如何查找内存泄漏是程序员亘古不变的话题:解决之道可谓花样繁多.因为最近要用到QT写程序,摆在我面前的第一个重要问题是内存防泄漏.如果能找到一个简单而行之有效的方法,对后续开发大有 ...