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):基本复杂度,用来衡量程序非结构化 ...
随机推荐
- Linux:使用systemd管理进程
Blog:博客园 个人 概述 systemd是目前Linux系统上主要的系统守护进程管理工具,由于init一方面对于进程的管理是串行化的,容易出现阻塞情况,另一方面init也仅仅是执行启动脚本,并不能 ...
- JAVA多线程与锁机制
JAVA多线程与锁机制 1 关于Synchronized和lock synchronized是Java的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码 ...
- Elasticsearch核心技术(一):Elasticsearch环境搭建
磨刀不误砍柴工,要学习Elasticsearch,首先要搭建起来一套学习环境,本文为手把手教你在MacOS上面搭建Elasticsearch学习环境. 1.1 Elasticsearch安装 Elas ...
- go中waitGroup源码解读
waitGroup源码刨铣 前言 WaitGroup实现 noCopy state1 Add Wait 总结 参考 waitGroup源码刨铣 前言 学习下waitGroup的实现 本文是在go ve ...
- .NET 5下的Blazor是否可以大规模正式使用?
今天在微信群讨论了很多Blazor是否可以正常用的问题.大家争的面红耳赤的. 于是趁着无聊,就水了这么一篇文. 还记得Blazor还在预览版的时候,我就开始关注Blazor了. 那会儿调试Blazor ...
- WPF 基础 - ControlTemplate
常用 ControlTemplate 的地方:Control 的 Template 属性 运用效果举例:穿着 CheckBox 外衣的 ToggleButton,披着温度计的 ProgressBar. ...
- 使用代码生成工具快速开发ABP框架项目
在一般系统开发中,我们一般要借助于高度定制化的代码生成工具,用于统一代码风,节省开发时间,提高开发效率.不同的项目,它的项目不同分层的基类定义不同,我们需要在框架基类的基础上扩展我们的业务类代码,尽量 ...
- linux下 > /dev/null 2 > &1 的意思和如何在后台启动进程
一.几个基本符号及其含义 之前看到别人写的一个shell脚本,有一个命令是:rm -f ${src_tmp_file} > /dev/null 2>&1 现在大概明白是什么意思了 ...
- Dotnet洋葱架构实践
一个很清晰的架构实践,同时刨刨MySQL的坑. 一.洋葱架构简介 洋葱架构出来的其实有一点年头了.大约在2017年下半年,就有相关的说法了.不过,大量的文章在于理论性的讨论,而我们今天会用一个项目 ...
- L3-021 神坛 (叉积排序+向量积求面积)
题目链接 https://pintia.cn/problem-sets/994805046380707840/problems/994805046577840128 题意:给定n个点求三角形最小面积: ...