oo第四单元——UML图解析
本单元是在理解UML图的基础上实现对图的解析和检查。UML图是新接触的一种建模工具,一开始接触UML的时候觉得理解起来比较困难,并不能单纯从代码的角度按照类、方法这样来理解,这只是从类图的角度,还有从顺序图来理解类与类之间消息的交互,从状态图理解一个类内部的状态变化。基本上理解了UML图这个单元就成功了一大半了。
homework13
UML图
架构设计
这次作业仅仅是围绕类图,所以按照类图中的一些从属关系设计了在各类UMLElement的基础了设计了自己的类图中的元素,管理一些相关的数据,这样可以在以类为范围查询的时候比较方便。同时也设计了一些HashMap来放各类的元素,有的是以元素的id为HashMap的Key值,这样可以快速通过id信息找到元素,有的是以name的HashMap的Key值,因为查询操作都是以name的形式给出。
这次作业也涉及到了一些比较复杂的图的操作,特别是继承问题。对于UmlClass,因为规定了单继承,所以我不断循环找出父类,然后将父类的相关信息加入集合。对于UmlInterface,存在多继承的情况,所以我使用bfs来遍历父类。特别是getImplementInterfaceList()这个方法,既需要找类的父类,也要找接口的父类,需要将上面的两种方式结合。
homework14
UML图
架构设计:这次作业对类图的需求没有变化,新增了顺序图和状态图。架构设计与前一次作业类似,增加了相应的UmlElement的拓展元素。在状态图的getSubsequentStateCount方法中也是使用bfs来找到所有的后继状态。
为了解决MyUmlGeneralInteraction这个类内容过长的问题,将对三种类型的图的查询方法分别放入三个类中,MyClass,MySub,MyStateMachine,在MyUmlGeneralInteraction创建这三个类的对象来调用这些方法。
homework15
UML图
架构设计:这次作业加入了检查。对于R005,R006,R007这三个检查,我发现这三个检查都是对于元素自身性质的检查,即不需要知晓与别的元素之间的关系,所以我在一开始遍历处理输入的时候就对这些性质进行了判断。对于R002,R003,R004是借鉴了之前遍历父节点的思路。
架构设计及oo方法理解的演进
让我感触最深的是第一单元的作业。在第一单元没有考虑到后面拓展的问题,所以在第一次作业和第二次作业都是使用比较固定的格式,第一次作业的a*x**b和第二次作业的a*x**b*cos(x)**c*sin(x)**d的格式,这样写起来非常简单,求导也是只要解析出系数和指数就可以套公式得到答案。所以前面两次作业完成的很快也比较轻松。但是第三次作业这个方法就失灵了,因为表达式的形式太多种多样了,所以我不得不回归到最基础的求导方法,花费了很长时间重构,相当于直接完成了第三次作业。
通过这次惨痛的教训,我认识到代码设计的可扩展性的重要性。可能在一开始设计的时候可以发现一些需求上特殊的地方可以利用来化简,如果可以确定需求是固定的,那利用这些固然是好的,但是如果可能会不断改变需求,这种代码修改起来就会很麻烦。在以后的作业中我都注意了这一点,采用的架构设计都是比较常规的,根据一定的逻辑来组织架构,比如第二单元是根据电梯运行的行为逻辑来组织架构,第四单元是根据元素之间的关系逻辑来组织架构,所以重构的次数和幅度都减小了很多。
在课上讲的很模型架构都非常有用。第一单元的工厂模式,第二单元的生产者-消费者模型、观察者模型等,根据这些比较经典的架构设计,对我编写代码起到了较大的帮助作用,让代码结构更加清晰,代码的可扩展性也很好。
测试理解与实践演进
通过这个学期讨论区的分享和研讨课的讨论,我了解到了很多测试方法。有python库的应用,比如第一单元就可以用sympy库来对表达式求导。有脚本的编写,实现代码的自动运行。第三单元开始接触JUnit工具,可以自动生成全面的样例,还可以用来限制运行时间,对于第三单元对时间的要求很严来说很有用。
通过惨烈的强测和互测,我也知道了更多测试的角度。比如第二单元可能会存在电梯调度太弱导致超时、换乘、超载这样的问题,设计测试数据的时候可以针对这些设计,第三单元数据多的情况下对时间的限制。所以测试不仅仅是针对结果,还有时间等多方面的。我觉得手动测试+自动化测试这个模式很好,手动测试可以构造比较容易出错的样例,针对性强,效率高;自动化测试样例多,可以弥补手动测试的不足,但是编写程序比较困难。
课程收获
- 从原来的面向过程编程转变为面向对象编程。经历了这么多次“大”作业,我实实在在的感受到了面向对象编程的好处,对象把属性和方法封装起来,所以即使有很多的属性或方法,也可以按照一定的规则管理起来。如果是面向过程编程,最多只能用struct来管理数据,但是方法管理就很困难。还有继承和接口,都可以简化代码。所以对于工程量大的代码,面向对象编程就比面向过程编程。
- 掌握了JML语言和UML建模工具。虽然作业中只是解析UML图,但是我觉得以后遇到比较复杂的工程用UML图来建模,是比较形象直观的。
- 学会了自动化测试。在增强了java能力的同时也增加了python能力,学会了基本的脚本的编写。
- 对代码的可扩展性有了新的认识,在后面的作业中重构的幅度都逐渐减小。
改进建议
- JUnit还是挺重要、挺有帮助的,建议课堂上多强调一些,也可以作为第三单元作业的一部分。
- 第三单元的作业就仅仅是看JML写代码,而且后面两次作业的重心都放在图的算法和时间上,感觉对学习运用JML并不友好。
- 实验课的题目在结束后可以公布题目和答案,因为作业只能以java代码的形式进行,有很多的知识点都涉及不到,实验的形式比较灵活,所以实验可能会涉及在作业中涉及不到的知识点。这一点是值得肯定的。但是实验后不知道答案,不知道解题过程,收获不是那么大。
线上学习的体会
oo这门课程是比较注重实践的,所以我觉得线上学习和线上学习的效果差不多。线上学习不足是比较缺少同学之间的相互讨论,虽然设立了讨论区,但是讨论仍然比在学校的时候受限。学习氛围也比较缺失。在课堂教学上也有好的地方,课后的问卷可以督促我们认真听课、按时听课,巩固知识点。不知道在学校的时候有没有课堂讨论题,这也是一个不错的点。
oo第四单元——UML图解析的更多相关文章
- 北航OO第四单元——UML图解析
北航OO第四单元--UML图解析 作业要求简析 刚接触本次作业可能需要花上一会才能搞清楚到底是要我们写个啥,在这里简单说一下: UML图的保存格式.mdj文件是以json文件的形式存储的,将每一个Um ...
- OO第四单元(UML)单元总结
OO第四单元(UML)单元总结 这是OO课程的第四个单元,也是最后一个单元.这个单元只有两次作业,相比前三个单元少一次作业.而且从内容上讲这个单元的作业目的以了解UML为主,所以相对前三个单元比较简单 ...
- OO第四单元UML作业总结暨OO课程总结
目录 目录一.第四单元UML两次作业架构设计第一次作业第二次作业二.架构设计总结与OO方法理解演进三.测试理解与实践演进四.课程收获总结五.课程改进建议六.尾声 一.第四单元UML两次作业架构设计 第 ...
- OO第四单元单元总结
目录 1.本单元两次作业的架构设计 2.四个单元中架构设计及OO方法理解的演进 3.测试理解与实践的演进 4.课程收获 5.给课程的改进建议 1.本单元两次作业的架构设计 第四单元的两次作业,我的表现 ...
- OO第四单元——基于UML的UML解析器总结&OO课程总结
OO第四单元--基于UML的UML解析器总结&OO课程总结 前言:一学期愉快(痛苦)的OO课程学习结束了,OO几个单元作业都各有特色,实验也各有特色,仔细回味起来,不再是单纯的敲代码(但自己还 ...
- OO随笔之和蔼的第四单元——UML系列
本单元的OO作业相比以前的,实在可以以和蔼来形容.但是和蔼并不意味着什么都不做,这单元的两次作业,特点在于每种查询难度不大,但是有很多需要商榷的细节点和查询种类比较多.由于UML图和java8之间,存 ...
- 2020 OO 第四单元总结 UML
title: 2020 OO 第四单元总结 date: 2020-06-14 19:10:06 tags: OO categories: 学习 1. 本单元三次作业的架构设计 本单元的代码编写与第三单 ...
- OO第四单元总结及课程总结
OO第四单元总结及课程总结 一.前言 紧张刺激的OO“昆仑课程”接近尾声,经过一个学期的学习,我的收获和感触颇多,借此博客作业的机会,对自己OO这门课程做一个总结.本博客主要有以下五个方面,一是第UM ...
- OO第四单元总结及学期总结
目录 OO第四单元总结及学期总结 第四单元三次作业架构设计 第十三次作业 第十四次作业 第十五次作业 四个单元中架构设计及OO方法理解的演进 第一单元 第二单元 第三单元 第四单元 四个单元中测试理解 ...
随机推荐
- Android Studio 3.3.1 向avd模拟器发送本地文件
"工具栏/View/Tool Windows/Device File Pxplorer" 选择模拟器在找到对应的文件夹upload即可
- 「NGK每日快讯」2021.2.7日NGK公链第96期官方快讯!
- JIT原理
本文转载自JVM杂谈之JIT 导语 JIT技术是JVM中最重要的核心模块之一.我的课程里本来没有计划这一篇,但因为不断有朋友问起,Java到底是怎么运行的?既然Hotspot是C++写的,那Java是 ...
- 用友U8+V12.0安装教程(有需要软件和服务的可以联系我)
有需要用友U8+V12.0软件和服务的可以联系我 QQ:751824677 1.退出所有杀毒软件 2.先装服务器SQL2008 3.服务器(会计): 经典应用模式--全产品 (解压A盘-执行-Aut ...
- C++Template 模版的本质
我想知道上帝的構思,其他的都祇是細節. ...
- python进阶(9)多线程
什么是线程? 线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位.线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其 ...
- SpringBoot(一):使用IDEA快速搭建一个SpringBoot项目(详细)
环境: JDK1.8 Maven:3.5.4 1.打开IDEA,右上角选择File→New→Project 选择Spring Initializr(使用IDEA自带的插件创建需要电脑联网) 2.点 ...
- Markdown(1)介绍
一.简介 Markdown 是一种轻量级标记语言,通过简单的标记语法使纯文本内容具有一定格式,使用户可以用易读易写的纯文本格式编写文档. Markdown 语言在 2004 由约翰·格鲁伯(英 ...
- springboot的4种属性注入
1.Autowired注入 2.构造方法注入 3.@Bean方法形参注入 4.直接在@Bean方法上使用注解@ConfigurationProperties(prefix="jdbc&quo ...
- CSS相关知识(持续更新中)
1. 弹性布局 一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式.引入弹性布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列.对齐和分配空白空间. 2. ...