首页 > 技术文章 > OO第四单元总结暨期末总结

Ethanscript 2020-06-16 05:15 原文

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。

推荐阅读