北航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.本单元两次作业的架构设计 第四单元的两次作业,我的表现 ...
随机推荐
- Spring:Spring-IOC简介
想要了解控制反转( Inversion of Control ), 我觉得有必要先了解软件设计的一个重要思想:依赖倒置原则(Dependency Inversion Principle ). 什么是依 ...
- 使用Hugo框架搭建博客的过程 - 前期准备
前言 这篇教程介绍了如何搭建这样效果的博客. 所需步骤 可以从这样的角度出发: 注册域名. 使用CDN加快网站访问速度. 网站内容需要部署在服务器或对象存储平台上. 重要的是放什么内容.博客需要选择框 ...
- sqlplus 删除^H处理
1.在oracle用户下更改 2.在".profile"或者"~/.bash_profile"添加 stty erase ^H 3.wq,保存退出 stty时一 ...
- ffiddler抓取手机(app)https包
很多同学有看过原文,但是按照原文还是没有设置成功(我就是其中一个)然后查了网上资料,在某些选项上进行增加,填写,配置通过.(和原文略有不同) 安装Fiddler,我们正常的流程在feiddler中设置 ...
- NOIP 模拟赛 day5 T2 水 故事题解
题目描述 有一块矩形土地被划分成 \(\small n×m\) 个正方形小块.这些小块高低不平,每一小块都有自己的高度.水流可以由任意一块地流向周围四个方向的四块地中,但是不能直接流入对角相连的小块中 ...
- Qt Model/view 小实例 文件目录浏览器
1. 文件目录浏览器 直接在main.cpp文件中添加下列代码 #include "mainwindow.h" #include <QApplication> #inc ...
- python之数据驱动ddt操作(方法四)
from ddt import ddt,data,unpackfrom selenium import webdriverfrom selenium.webdriver.common.by impor ...
- 三分钟入门 InnoDB 存储引擎中的表锁和行锁
各位对 "锁" 这个概念应该都不是很陌生吧,Java 语言中就提供了两种锁:内置的 synchronized 锁和 Lock 接口,使用锁的目的就是管理对共享资源的并发访问,保证数 ...
- SDN与OpenFlow架构--初识
一,为什么需要SDN 1,传统网络的缺点: a,传统网络及其设备的只可配置,不可编程,只能按照已定义好的协议处理或转发数据,不能适应需求新变化,不能自主开发新功能. 如购买一个电饭煲,可以煮饭,煲汤. ...
- jenkins资源下载地址(软件、插件等)
jenkins资源下载地址(软件.插件等) 1. 镜像1:清华镜像 2 .镜像2:http://mirrors.jenkins-ci.org/ 3. 官方下载地址:https://jenkins.io ...