北航OO第四单元——UML图解析
北航OO第四单元——UML图解析
作业要求简析
- 刚接触本次作业可能需要花上一会才能搞清楚到底是要我们写个啥,在这里简单说一下:
- UML图的保存格式
.mdj文件是以json文件的形式存储的,将每一个UmlElement作为其parent的属性挂载到其中。可以自己随便用starUML画一个,然后看看源文件内容 - 课程组将这一个个
UmlElement单独拿出来逐条输入,以此在我们的程序中建立起UML类图 - 然后输入查询指令,查询有关于UML图的各种信息并输出
作业思路及架构
由于许多大作业、考试全部堆在这几个周,所以没有对本单元作业进行良好的架构设计,整体的思路仍然停留在第一单元水平,十分惭愧
MUmlGeneralInteraction- 此类是与官方包进行交互的类
- 内部属性主要是几个管理器和一个合法性检查器
MChecker:- 类图管理器:
MClassManager - 顺序图管理器:
MCollaboration - 一组状态机管理器:
MStateMachine
- 类图管理器:
- 构造函数遍历所有要传入的
UmlElement,根据其类的类型调用不同的add****函数,讲不同类型的UmlElement传给相应的管理器 - 询问时则调用相应的管理器的相关方法
- 当官方包调用检查方法时,调用
MChecker中的响应方法 - 注:
- 管理器的查询方法、合法性检查器的检查方法的返回值最好有一定的普适性,从普适性的返回值到官方包要求的特定返回值的过程在
MUmlGeneralInteraction中进行,这样可以提高代码可拓展性 - 然而由于时间关系我并没有这么做 (0ω0)
- 管理器的查询方法、合法性检查器的检查方法的返回值最好有一定的普适性,从普适性的返回值到官方包要求的特定返回值的过程在
建模思路
- 对类图、顺序图和状态机都是采用树去建模的,尽可能地将子元素挂载到父元素节点下,从而将各个层次的方法分开
- 比如
MClass和MInterface继承自抽象类MClassOrInterface,其中包含了MOperation、MAssociation、UmlAttribute等,MOperation内再保存了UmlParameter。 - 这样可以将各个层次的功能区分开,下级看不到上级,也不应该考虑上级
类图管理器
MClassManager- 类图管理器保存了一组
MClass和MInterface - 考虑到
UmlAssociation的双向性,不方便同时挂载到两个类或接口中,因此将Association在树中的层次提高一层,保存到MClassManager中,需要的时候查询即可- 缺点:类或接口不知道自己有什么
Association,设计较不合理(但是为了赶时间所以就 (0ω0))
- 缺点:类或接口不知道自己有什么
- 类图管理器保存了一组
其他:
- 顺序图和状态机也是差不多的道理,不再赘述
- 第四次作业总体比较简单,但是十分复杂,代码量比较大,写代码时要一再检查好要求
OO方法的演进过程(实际是吐槽)
第一单元的方程求导应该是OO思想提高最快的一个单元。由于上学期上过Java课,一些基础的面向对象变成思想提前已有接触,但第一单元各个环节巧妙地设计还是让我很不好受。前一次作业的设计如果不能做大极大的可拓展性,大概率会被下一次作业逼着重构
很遗憾的是,从第二单元作业开始我觉得我编写面向对象程序的能力已经没有很多提升了。第二单元主要训练了多线程,巩固了第一单元的思想;第三、第四单元的代码练习过于简单,算法的重要性超过了设计,因此并没有把精力投入到架构设计的训练中了。
我认为第一第二单元的设计是最好的(虽然课程设计的时候可能十分困难),就是需要保证自己程序有足够的可拓展性,后两单元的作业在这方面做的过于简单了,因此就让人忽视了对架构的设计
另外,虽然学习了许多设计模式,但是除了几种简单的比如单例模式、工厂模式等,很难应用到自己的代码中
测试方法的学习历程
- 这学期的一大收获就是学会了如何编写测评机
- 第一单元由于有python现成的库计算正确结果,也可以根据正则表达式自动生成测试数据,非常方便编写自己的测评机,独立实现代码测评。
- 但是当不知道如何编写标准程序,就陷入了不会写测评机的困境。一直到第四单元我才知道一种东西叫做对拍机。他的思路非常简单,将三个人及以上的代码放到一起跑,比较结果的差异即可。这样,我们就只需要负责编写自动生成测试数据的程序即可
- 另外,我还学习到了JUnit的使用方法,对自己的每一个方法单独测评,可以“每一个方法体会一遍AC的快感”,体验也是相当棒的
课程收获:
- 建立了面向对象编程的思想,在编写代码时首先想到的是低耦合性、功能分层、可拓展性等,现在看到不符合面向对象编程的代码甚至会恶心(x)
- 学习了各种测试方法
- 数量掌握了Java的使用方法
- 编写之前先设计,设计包括功能设计、权限设计、接口设计、交互设计等等。设计做好后编写代码是水到渠成的事情。我认为这也是一条极大的收获
改进建议
- 加大第三单元和第四单元难度,最好像第一单元那样保证“前一次作业不好好设计,后一次作业大概率要重构”。逼迫同学们思考更优化的设计
- 减少算法在作业中的占比,比如第三第四单元海量的图算法(虽然大部分都是简单的遍历),取消一切考验算法效率的测试点。后两次作业完全被写成了Java语言算法编写,而不是面向对象程序设计
- 一单元作业结束后,可以讲解一下标程的设计思想,这样可以让同学们学习到足够优秀的样例,我认为仅靠讨论课是不够的,就我们班来看,同学们的表达能力不足以清晰的解释自己的算法。
- 讲解一下最后一次作业的官方包的设计,我认为这是很好的学习样例
- 理论课的重复内容有些多,就是感觉同一个单元的三次理论课基本讲的都是相同的东西
北航OO第四单元——UML图解析的更多相关文章
- oo第四单元——UML图解析
本单元是在理解UML图的基础上实现对图的解析和检查.UML图是新接触的一种建模工具,一开始接触UML的时候觉得理解起来比较困难,并不能单纯从代码的角度按照类.方法这样来理解,这只是从类图的角度,还有从 ...
- 2020北航OO第四单元总结
2020北航OO第四单元总结 一.本单元架构设计 本单元作业是实现一个UML图解析器,其中实现接口及主要框架课程组已经提供,只需要我们完成特定功能. 在第一次作业时,感到十分迷茫,不知道如何下手,最后 ...
- OO第四单元(UML)单元总结
OO第四单元(UML)单元总结 这是OO课程的第四个单元,也是最后一个单元.这个单元只有两次作业,相比前三个单元少一次作业.而且从内容上讲这个单元的作业目的以了解UML为主,所以相对前三个单元比较简单 ...
- OO第四单元UML作业总结暨OO课程总结
目录 目录一.第四单元UML两次作业架构设计第一次作业第二次作业二.架构设计总结与OO方法理解演进三.测试理解与实践演进四.课程收获总结五.课程改进建议六.尾声 一.第四单元UML两次作业架构设计 第 ...
- 2019年北航OO第四单元(UML任务)及学期总结
第四单元两次作业总结 第十三次作业 需求分析 本次作业需要完成一个UML类图解析器,所需要解析的只有符合UML标准和能够在Java 8中复现的UML类图.查询指令存在两种:仅与所查对象有关的指令,以及 ...
- 2019年北航OO第4单元(UML)总结
1 架构设计 经过了接近一学期的程序设计训练,在这一单元的第一次作业中我就非常注重架构的设计,竭力避免像之前一样陷入"第一次作业凑合,第二次作业重构"的不健康的迭代模式.整体上来说 ...
- 北航OO第四单元作业总结(4.1~4.3)及课程总结
前言 在学习过JML规格描述语言之后,本单元进行了UML(Unified Modeling Language)的学习.和JML单纯用语言描述的形式不同,UML通过可视化的图形形式,对一系列有关类的元素 ...
- 北航OO第四单元总结
OO最后一次博客作业--好聚好散 一.单元总结 作业一: 第一次是对类图进行解析,没有太大难度,只要根据讨论区提供的建议,新建两个类来存储相关数据即可实现. 作业二: 第二次作业的难度只有量的提升,然 ...
- OO第四单元单元总结
目录 1.本单元两次作业的架构设计 2.四个单元中架构设计及OO方法理解的演进 3.测试理解与实践的演进 4.课程收获 5.给课程的改进建议 1.本单元两次作业的架构设计 第四单元的两次作业,我的表现 ...
随机推荐
- linux学习之路第六天(文件目录类第二部分)
文件目录类 1.cat指令 作用:查看文件内容,是以只读的方式打开. 基本语法 cat [选项] 要查看的文件 常用选项 -n; 使用细节: cat只能浏览文件,而不能修改文件,通常会和more一起使 ...
- Robotframework学习笔记之一Common Resource导入的Library库显示红色(导入失败)
第一次使用Robotframework,所以也遇到了很多的坑,导入项目后 ,一些自带的库显示红色,导入失败!(ps:自带的库也显示红色) Ride日志如下(Tools--view ride log): ...
- 一文读懂 .NET 中的高性能队列 Channel
介绍 System.Threading.Channels 是.NET Core 3.0 后推出的新的集合类型, 具有异步API,高性能,线程安全等特点,它可以用来做消息队列,进行数据的生产和消费, 公 ...
- FTP传输
FTP传输 一.FTP服务–用来传输文件的协议 二.设置匿名用户访问的FTP服务(最大权限) ...
- C语言:char总结
char字符型数据1.用单引号限制的1字节的字符称为字符型数据,字符型常量2.字符型常量实质保存的是对应字符的ASCII码值,是一个整数3.字符型常量表示范围:0-2554.声明字符型变量 char ...
- 记录APP 启动ACTIVITITY
a.启动待测apkb.开启日志输出:adb logcat>D:/log.txt c.关闭日志输出:ctrl+cd.查看日志找寻: Displayed com.mm.android.hsy/.ui ...
- 论文阅读:Visual-Inertial Localization With Prior LiDAR Map Constraints
介绍 提出了一个低代价双目视觉惯导定位系统,实现了基于多状态约束下的卡尔曼滤波器(MSCKF)VIO,采用了先验雷达地图.除了稀疏的视觉特征,雷达地图与半稠密的点云也通过紧耦合的MSCKF进行更新,进 ...
- 前端小技巧:css sprite----V客学院技术分享
前端小技巧:css sprite 因为英文名叫sprite,翻译过来是精灵,而雪碧饮料也叫sprite,所以叫精灵兔或者雪碧图. 它有什么作用呢? 当用户在浏览器里输入一个URL地址的时候,你会感觉无 ...
- 第八篇--编写Windows服务
编写service服务参考网址:https://blog.csdn.net/nodeathphoenix/article/details/24181509 vc获得显示器状态(捕获息屏.亮屏网址):h ...
- 最短路径问题 Dijkstra ——Python实现
# 最短路径算法 Dijkstra # 输入:含权有向图 G=(V,E),V={1,2,3...n} # 输出:G中顶点 1 到各个顶点地最短距离 Dijkstra算法各点权值变化情况: 1 ...