2020北航OO第四单元总结
2020北航OO第四单元总结
一、本单元架构设计
本单元作业是实现一个UML图解析器,其中实现接口及主要框架课程组已经提供,只需要我们完成特定功能。
在第一次作业时,感到十分迷茫,不知道如何下手,最后在重新学习了类图的mdj文件的各项含义及内在关系后,我选择设置一个umlTree类进行UML的解析,然后存入自己写的MyUmlClass和MyUmlInterface中,使其根据原有的UmlClass和UmlInterface构造,在其中实现operations、attributes、associations、parent等属性,自己写MyUmlOperation,实现attributes、parameters属性,这样存储完整个类图,再进行各项的查询时,实现起来还是比较简单的。
在第二次作业时,增加了状态图和顺序图两种,吸取上一个单元的教训,我并没有在原有类上进行添加,而是选择创建新的类MyUmlGeneralInteraction,使其继承自原有的MyUmlClassModelInteraction,并且构建新的解析类UmlTree2,在里面进行状态图和顺序图涉及到的元素的解析,同样地,存入自己写的MyUmlInteration和MyUmlStateMachine中,在顺序图类中实现lifelines、messages等,在状态图类中实现pseudostate、finalState、transitions等。虽然顺序图和状态图本身元素之间的关系十分复杂,但本次作业只涉及到一些十分简单的查询,所以我也只解析了本次作业用到的元素及其关系,有了第一次的基础,可以说是比较简单的。
在第三次作业时,增加了一个总的检查功能,涉及到了三种图,所以我在继承了第二次作业的MyUmlStateAndCollaboration(给第二次作业的查询类改了名字)后,在其中继承了umlTree1和umlTree2两个属性,利用这两个存储解析单元进行规格查询。在本次作业的实现过程中,出现了许多问题,比如R002和R003,一个是循环继承,一个是重复继承,前者找到环即可退出,后者找到重复才能退出,这样我就不得不实现多个查询继承类/接口的方法,但这些方法又有大量重复部分,略显冗余感,我觉得这是一个可以改进的地方。总之,这次作业较前两次作业耗时较多(一部分是由于没有很好理解题意),过程也略显复杂,并没有像我想的利用已知方法和属性即可完成。
在本单元三次作业过程中,我想达到一种类与类之间耦合性较低的效果,所以将大多查询操作放在元素类里面实现,这样,在实现一个查询操作时,往往需要从MyUmlGeneralInteraction转到UmlTree再转到具体的类去实现,过程有些长,但类与类间耦合度确实变低了,这种实现方法让我感觉不是很舒服,觉得这是一个可以优化的地方。另外,由于本单元的实现并没有重构过程,而是类的增加,所以仅贴上最后一次UML图。

二、单元架构设计及OO方法理解演进
第一个单元是多项式求导,需要将解析、多项式存储及求导、输出分化成不同的类去实现,将不同类的因子抽象成不同的类,利用因子→项→多项式的继承关系,采用先分后合的思想,先分别处理各个因子,将其求导,最后再合在一起,利用同类项合并、公式等方法进行优化,这一单元,将我们一main到底的思想彻底改成了面向对象。
第二单元是多线程电梯,类似于生产者消费者模式,生产者是需求产生类,消费者是电梯,需要一个调度器类在中间充当托盘的作用, 将需求分配给电梯。调度器为单例类,电梯和需求类都以调度器类为锁,实现并发性。最后的优化也主要几种在调度策略中。
第三单元是根据JML规格实现图操作,在这一单元,我没有很好地理解课程组的意图,一直在一个类上进行方法的实现,没有将图更进一步抽象出来,最后,这一单元的收获是一系列的图算法。
第四单元是解析UML图并进行查询,主要是需要自己构建类进行UML图的存储,主要分成类图类、顺序图类及状态图类,对不同的图中的元素分别进行解析处理,在作业迭代过程中,实现查询类的继承。
三、单元测试理解与实践演进
在第一单元多项式求导中,我采用了先自己构造数据然后自动化测试的方式,由于bug都是出现在类似于(x*x)这种很奇怪的地方,导致自动化测试效果不是很好,没有测出来什么bug。
在第二单元多线程电梯中,我自己写了一些测试用例进行测试,最后设计上没有出现大问题,但有一些死锁的问题,主要原因在于我对加锁理解有些偏差,最后也成功改正过来了。
在第三单元JML中,我没有进行很好的测试,导致存在致命性bug,给了我一个很大教训。
在第四单元UML中,我通过starUML自动构建测试数据,主要对循环继承和重复继承进行测试,效果还可以,最后只死在了一个TLE上,是三单元中出现过的问题,这次没有注意。。
总之,感觉在测试过程中,只要自己先进行一定的合理性测试,就不会出现大bug,至于那些边缘化的特殊情况,自动化测试也很难检测到,但只要进行足够长时间的自动化测试,那么找到bug的概率会大大增加,其实,还是自己有技巧性地构造效果更好一些。
四、课程收获
上学期虽然上过Java课,但收获其实并不大,只是掌握了一些基本的java语言技巧,了解了继承、实现等,但在oo课伊始,仍给了我很大帮助。第一次作业虽然设置了Poly类,但后面仍然重构了,因为当时对OO课程设置不是很了解,扩展性思维不足,不过在第二次作业重构了之后,后面就没重构过了,我觉得我可扩展性设计的能力得到了很大提升。
关于面向对象的思维,虽然在前几次作业我已了解了一定的面向对象思维,知道将各个元素对象化,设置不同的类去处理他们,但在第二单元作业过程中,通过对Person的处理,我才更深一步理解了面向对象的好处,因为我一开始是用Hashmap嵌套的方式存储的乘客需求,这种隐式存储的方式可读性不高,而且不易扩展,最终在第三次作业时我被逼改成了用Person类存储,立刻感觉代码可读性提高了很多,而且操作更加便捷,至此,我才更加理解将一些元素封装成为对象的好处。
在第二单元中,通过一次又一次死锁,我对多线程、并发的编程技巧理解得更为透彻。
在二、三、四单元的迭代过程中,从一开始的不断地往一个类中增加东西,到通过继承的方法扩展类,我在开放封闭原则方面也获得了很大进步。
三到四单元,从给了我们架构让我们实现图的各种操作,到完全自己去建一个图去存储UML图,我学会了怎样合理方便地以面向对象的思维去解析并存储一个图,并且熟悉了图的一系列查询操作。
五、课程改进建议
希望JML单元中测能增加难度
希望实验课可以公布答案和成绩
希望理论课可以增加一些趣味性,很多时候感觉课程枯燥无味,让人抓不住重点,好多作业需要用的东西反而需要自学
六、线上学习体会
总的来说,这一学期的oo课程还是使我收获颇丰的,从面向对象设计→多线程→规格化设计→UML理解,我的能力有了很大提升,其实对于这门课程来说,线上还是线下区别不是很大(除了少了和老师面对面的互动,上课效率有所降低),周周的中测+强测+互测+bug修复,确实展现了它身为核心专业课的地位,但觉得互测环节没能做到很好,经常由于时间不够而未能对其他同学的代码进行深入分析,这一点可能还是我自身的问题,但后几周事情渐渐变多,确实难以面面俱到。本学期课程已然结束,很开心这一学期的学习,满满的收获,我也终于跨过了OO这一座大山。
2020北航OO第四单元总结的更多相关文章
- 2020北航OO第三单元总结
2020北航OO第三单元总结 本单元要求是根据JML规格完善代码,初看是一个简单的代码照搬实现的东西,但最后才发现由于CPU时间的限制,还考察了大量优化策略及数据结构中关于图的知识,是一次非常注重细节 ...
- 北航OO第四单元——UML图解析
北航OO第四单元--UML图解析 作业要求简析 刚接触本次作业可能需要花上一会才能搞清楚到底是要我们写个啥,在这里简单说一下: UML图的保存格式.mdj文件是以json文件的形式存储的,将每一个Um ...
- 2019年北航OO第四单元(UML任务)及学期总结
第四单元两次作业总结 第十三次作业 需求分析 本次作业需要完成一个UML类图解析器,所需要解析的只有符合UML标准和能够在Java 8中复现的UML类图.查询指令存在两种:仅与所查对象有关的指令,以及 ...
- 北航OO第四单元作业总结(4.1~4.3)及课程总结
前言 在学习过JML规格描述语言之后,本单元进行了UML(Unified Modeling Language)的学习.和JML单纯用语言描述的形式不同,UML通过可视化的图形形式,对一系列有关类的元素 ...
- 北航OO第四单元总结
OO最后一次博客作业--好聚好散 一.单元总结 作业一: 第一次是对类图进行解析,没有太大难度,只要根据讨论区提供的建议,新建两个类来存储相关数据即可实现. 作业二: 第二次作业的难度只有量的提升,然 ...
- 2020北航OO第二单元总结
2020北航OO第二单元总结 前言 本单元考察基于多线程的电梯调度问题,成功让我从一个多线程小白到了基本掌握了使用锁来控制线程安全的能力,收获颇多(充分体验了迷茫地de一个又一个死锁bug的痛苦). ...
- 2020 OO 第四单元总结 UML
title: 2020 OO 第四单元总结 date: 2020-06-14 19:10:06 tags: OO categories: 学习 1. 本单元三次作业的架构设计 本单元的代码编写与第三单 ...
- OO第四单元总结暨期末总结
OO第四单元总结暨期末总结 目录 OO第四单元总结暨期末总结 第四单元三次作业架构与迭代 整体感受 HW1 HW2 HW3 四个单元架构设计与方法演进 Unit1 Unit2 Unit3 Unit4 ...
- 2019年北航OO第1单元(表达式求导)总结
2019年北航OO第1单元(表达式求导)总结 1 基于度量的程序结构分析 量化指标及分析 以下是三次作业的量化指标统计: 关于图中指标在这里简要介绍一下: ev(G):基本复杂度,用来衡量程序非结构化 ...
随机推荐
- 盘点Excel中的那些有趣的“bug”
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. Excel 1.0早在1985年正式进入市场,距今已经有36年了,虽然在推出 ...
- 使用HTML、jquery、DOM创建文本
<html> <head> <meta charset="utf-8"> <meta charset="utf-8"& ...
- CSS垂直布局
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- SparkSQL中产生笛卡尔积的几种典型场景以及处理策略
[前言:如果你经常使用Spark SQL进行数据的处理分析,那么对笛卡尔积的危害性一定不陌生,比如大量占用集群资源导致其他任务无法正常执行,甚至导致节点宕机.那么都有哪些情况会产生笛卡尔积,以及如何事 ...
- DNA序列(JAVA语言)
package 第三章习题; /* * 输入m个长度均为n的DNA序列,求一个DNA序列,到所有序列的总Hamming距离尽量小. * 两个等长字符串的Hamming距离等于字符不同的位置个数, ...
- c++ 反汇编 堆变量
malloc _malloc 0037E8C0 8B FF mov edi,edi 0037E8C2 55 push ebp 0037E8C3 8B EC mov ebp,esp 0037E8C5 6 ...
- java中的String,StringBuffer与StringBuilder
String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁. StringBuffer对象则代表一个字符序列可变的字符串,当一个Stri ...
- 【odoo14】第二十三章、管理邮件
邮件集成是odoo最重要的特性.我们可以通过odoo收发邮件.我们甚至可以管理业务文档上的电子邮件,如潜在客户.销售订单和项目.本章,我们将探讨在odoo中处理邮件的方式. 配置邮件服务器 管理文档中 ...
- RabbitMQ 入门 (Go) - 4. 使用 Fanout Exchange 做服务发现(上)
到目前为止,我们项目的结果大致如下: 传感器生成的模拟数据(包含传感器名称.数据.时间戳)是通过传感器在运行时动态创建的 Queue 来发送的.这些 Queue 很难直接被发现. 为了解决这个问题,我 ...
- 极简实用的Asp.NetCore模块化框架决定免费开源了
背景 在开发这个框架之前,前前后后看过好几款模块化的框架,最后在一段时间内对ABP VNext痛下狠心,研究一段时间后,不得不说 ABP VNext的代码层面很规范,也都是一些最佳实践,开发出一个模块 ...