第四单元作业总结

第四单元的作业主题是UML图的解析,通过对UML图代码的解析,我对UML图的结构以及各种元素之间的关系的理解更加深入了。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

第一次作业

第一次作业的主题是UML类图的解析,要求输入一个UML类图的代码,程序能通过代码解析出其大致结构,并提供一些关于类图的基本的查询功能。显然本次作业的重点是类,类的属性、方法、参数等都是存在一个类下面的,因此我自己创建了一个MyUmlClass类,用以记录类及属于该类的信息,还创建了一个MyUmlOperation类,用以记录方法的参数信息。在MyUmlInteraction中,我采用了两个HashMap来记录输入的类:一个id2myclass的HashMap,使用id索引其对应的myclass,这是为了在确定类的属性、方法等时通过其parentid找到属于的类;一个name2myclass的HashMap,使用类名索引该类,这是因为输入的查找信息都是以类名来查找的。

本次作业的类图如下:

第二次作业

第二次作业在第一次作业的UML类图基础上,增加了有关UML顺序图和状态图的查询指令,还增加了基于一些Uml规则的类图合法性检查。与第一次作业类似的,我为状态机和顺序图分别创建了两个HashMap,分别能通过id和name找到对应的状态机和顺序图。

本次作业的类图如下:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

OO课程整体总结

一学期的OO课程在不知不觉中已经接近了尾声,接下来我就总结一下我在本学年的OO课程中的收获。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

一、我在四个单元中架构设计及OO方法理解的演进

第一单元:第一单元的主题是多项式的求导。在第一单元,由于刚接触OO这门课,我对于java这门语言并不那么熟练,对“类”的思想也没有深入的理解。在我的架构中,前两次作业我的类分的还是比较清楚的:将多项式分为了一个个的项,项作为一个单独的类提取出来,这样对多项式求导的问题就变为了对每项求导,使得问题简化了很多。但第三次作业,由于加入了复杂的嵌套,我的类分的就相对混乱了,我实际上是从求导的角度出发,根据根据求导公式的不同,将多项式分为了基本项、嵌套项等几类,这样对于求导来说是简单了一些的,但是由于嵌套的存在,每个类里面还可能包含其他类,这给我在debug的时候带来了一些麻烦。在第一单元,我对OO的理解就是建立一些类,同一类里面的对象有着逻辑上相似的地方,这些类可以有自己的属性、自己的方法。

第二单元:第二单元的主题是模拟电梯调度。第二单元我认为是对我对OO的认识有了很大提高的一个单元。如果说第一单元的求导,不用OO而用面向过程的思想也能做出来的话,那么第二单元仅仅用面向过程是不太可能做出来的了。第二单元涉及到了多线程的知识,多线程就必然涉及到多个类之间的协作。在本单元的作业中,涉及到的主要是电梯和调度器之间的协作。我采用了电梯依照算法,从调度器中取请求的方式,这样将请求的分配分到每个电梯中进行,而调度器只是充当一个容器的作用,此外调度器还负责接收和给电梯发送停止信号,以确保三部电梯能正确地停止。本单元我对OO的理解更加深入了,每个对象的内部可以实现一些方法,这些方法对外部一般不可见,外部只需要传递一个信息给这个类,这个类就能返回正确的值,至于如何实现的,外部类是不关心也无法关心的。此外,我还学到了很多模型和设计模式,例如生产者-消费者的模型、单例模式、工厂模式、观察者模式等等,这些设计模式也是OO的重要组成部分。

第三单元:第三单元的主题是JML语言,作业是地铁线路图的相关处理和查询。在第三单元的架构中,考虑到图结构变更指令远少于查询类指令,我采用了很多冗余的数据记录,这些数据只在变更图结构的时候更新,以确保时间复杂度上不会超时。本单元的内容对我的启发主要是在测试方面的,这些内容会在下面谈到。

第四单元:第四单元的主题是UML语言,有关UML类图、顺序图和状态图的解析。架构方面在上文已经谈过,这里就不多赘述了。本单元结合UML类图,使我对OO在理论上有了更细节方面的认识,也让我简单了解了UML图的基本元素和逻辑,这些知识以后可能用得到。

二、我在四个单元中测试理解与实践的演进

第一单元:第一单元的测试实际上和我们大一写的程序在测试方面是差不多的。都是构造几组测试数据,利用脚本同时输入到测试屋内成员的程序中,然后手动检查输出是否正确。这个方法在前两次作业中用的还比较顺利,但第三次作业,由于可化简的部分很多,化简的方式也很多,导致肉眼难以快速判断结果是否正确,这也是这种方法的局限。

第二单元:第二单元的测试相比第一单元,困难了很多,因为多线程带来的很多不确定性导致以往的直接输入数据、观察输出的方式在组内对拍中并不能很好的达到要求,所以我就采用了对每个人的程序进行单独测试的方式。当然,构造测试数据时是需要注意一些策略的,尤其是第三次作业,在电梯停靠楼层不同的情况下,根据一些特殊楼层组合来构造测试数据,如果对一些算法不够严密的程序,可以很快找出bug。

第三单元:第三单元比较注重的是单元化测试,这也是JML语言的优势所在。在方法的JML语言是正确的的前提下,只需要根据JML语言的前置条件和后置条件,来构造测试数据,即可对每个方法进行有针对性的测试,这样可以帮助我们快速定位bug。但是,在第三次作业的最低票价、最少换乘、最小不满意度的这些算法上,JML语言是仍然无法准确描述的,因而对这些算法的正确性检测也只能依靠构造一些特定的测试数据来解决。

第四单元:第四单元的特殊性在于它的测试数据需要通过StarUML来构造,构造测试数据本身和以往并没有很大区别,但是通过使用StarUML构造测试数据,我对StarUML的使用更加熟练了、对类图、状态图、顺序图的理解也更加深入了。

三、我在本课程中的收获

这学期的OO课程可以说是非常充实了。从开学一直到考试周之前,基本上每一周都有OO代码的作业,而且写完作业以后还有紧接着互测环节和bug修复环节。首先,就像老师说过的那样,编程就是要多练,代码量上去了,编程水平自然就会上去。如此多的练习量让我的编程水平提高了很多,现在学期结束了再重新看我寒假预习OO时写的作业、甚至是第一单元写的作业,都会觉得当时的水平和现在查得很远,这就是一种提高吧。此外,我还了解了很多实用的设计模式,并且不仅仅是在理论层面的了解,更是在实践中应用了这些设计模式,比如电梯调度中的调度器使用单例模式、后面多电梯调度的时候使用观察者模式等等,这些设计模式都是前人们经过不断摸索而形成的,学习这些模式可以让我们在写代码时少走很多弯路。最后,OO的互测机制也让我对代码测试变得熟练了起来。我以前在写代码的时候,写完了自己都不怎么测试就交上去,因为评测机会给出实时的反馈,但在OO课程中,互测的机制鞭策我们在提交前给自己的程序找bug、在互测中给其他人找bug,找bug的过程其实就是不断构造测试数据测试的过程,而且在找到高质量测试数据(可以一刀刀中很多人的数据)的时候,我们的测试水平也得到了提升。总之,这一学期的OO课程对我来说是收获很大的。

四、对课程的改进建议

整体来说我对本学期的OO课程还是很满意的,但是这门课还是有一些可以提升的地方的,以下是我个人的一些建议:

1、关于实验课:实验课所做的内容有时候和课程不那么同步,又有时候太同步了导致同学们上午刚刚学完的知识,下午就要考,希望在实验课的时间安排上的能更合理一些。另外实验课的代码有时候会有问题(主要是JML那部分的代码),这些问题可能会影响同学们的实验,甚至产生误导效果,希望课程组在代码放出来之前再审核一次。

2、还是关于实验课:希望实验课每次的结果如何,能有一个反馈,虽然可能无法给出标准答案,但是可以给出一部分同学比较漂亮的解答,这样能让我们知道自己在哪些地方的理解还有问题。像现在这样一点反馈都没有的实验课我认为效率不是很高。

3、关于作业:希望在每一单元的作业结束之后,都能有一个标程来给我们参考,标程最好能体现从该单元的第一次作业到第三次作业的扩展性,这样更加有助于我们学习如何架构自己的程序、如何在保证程序正确性的前提下使程序有尽可能良好的扩展性。

五、结语

从本学期的OO课程中,我看到了课程组从老师到助教对于课程改革的决心和信心,不管是老师还是助教都为这门课尽心尽力、付出了大量的心血,作为课程的众多参与者之一,我也确实感受到了这门课在往好的方面发展,而不是像知乎上往届的学长学姐们说的那么魔鬼了。在此感谢所有OO课程组的老师和助教们的付出,并且真心的祝愿北航OO课程能变得更好!

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

BUAAOO,完结撒花~

2019OO第四单元作业总结&OO课程整体总结的更多相关文章

  1. oo第四单元作业总结暨课程总结

    oo第四单元作业总结暨课程总结 一.本单元作业架构设计 本单元需要构建一个UML解析器,通过对输入的UML类图/顺序图/状态图的相关信息进行解析以供查询,其中课程组已提供输入整体架构及输入解析部分,仅 ...

  2. OO第四单元作业总结以及课程总结

    第四单元总结--UML 第四单元作业架构分析 第一次作业其实是本单元三次作业中最难的一次.由于第一次是第一次作业,要考虑到搭建框架和设计架构,这次作业的思维性很强.在了解了各个类型元素(Element ...

  3. OO第四单元总结暨OO课程总结

    一.第四单元作业总结 本单元的主要任务是对 Uml 图元素进行管理和查询,测试一开始会输入一个静态图,之后会对图中相关内容进行查询. 第13,14次作业 第14次作业新增内容很少,故与第13次作业放在 ...

  4. OO第四单元作业总结及课程总结

    一.本单元作业架构设计 1.第一次作业 本单元首次接触到UML以及相关概念,在面对第一次作业时首先花了很大功夫去阅读官方接口中各种UmlElement的代码,才理解了输入的模型元素中各属性的含义.总的 ...

  5. 【OO学习】OO第四单元作业总结及OO课程总结

    [OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...

  6. BUAA OO 2019 第四单元作业总结

    目录 第四单元总结 总 UML UML 类图 UML 时序图 UML 状态图 架构设计 第十三次作业 第十四次作业 课程总结 历次作业总结 架构设计 面向对象方法理解 测试方法理解与实践 改进建议 尽 ...

  7. 北航OO第四单元作业总结(4.1~4.3)及课程总结

    前言 在学习过JML规格描述语言之后,本单元进行了UML(Unified Modeling Language)的学习.和JML单纯用语言描述的形式不同,UML通过可视化的图形形式,对一系列有关类的元素 ...

  8. UML结构与解析——BUAA OO第四单元作业总结

    UML与解析架构 UML是什么 统一建模语言(英语:Unified Modeling Language,缩写 UML)是非专利的第三代建模和规约语言.UML是一种开放的方法,用于说明.可视化.构建和编 ...

  9. OO第四单元作业小结

    一.本单元两次作业的架构设计 1.第一次作业 整体思路:以class为核心,建立MyInterface.MyAttribute.MyOperation.MyAssociation四个类分别储存每个类的 ...

随机推荐

  1. Junit5快速入门指南-3

    Fixtures 是测试中非常重要的一部分.他们的主要目的是建立一个固定/已知的环境状态以确保 测试可重复并且按照预期的方式运行.比如在app测试中 基类@BeforeClass 配置初始化,初始化d ...

  2. 【第十七篇】- Maven Web 应用之Spring Cloud直播商城 b2b2c电子商务技术总结

    Maven Web 应用 本章节我们将学习如何使用版本控制系统 Maven 来管理一个基于 web 的项目,如何创建.构建.部署已经运行一个 web 应用. 创建 Web 应用 我们可以使用 mave ...

  3. python多继承简单方法

    class people(object): #建创一个人类 def __init__(self,name,age): self.name = name self.age = age def eat(s ...

  4. 3.15学习总结(Python爬取网站数据并存入数据库)

    在官网上下载了Python和PyCharm,并在网上简单的学习了爬虫的相关知识. 结对开发的第一阶段要求: 网上爬取最新疫情数据,并存入到MySql数据库中 在可视化显示数据详细信息 项目代码: im ...

  5. Android View post 方法

    解析View.post方法.分析一下这个方法的流程. 说起post方法,我们很容易联想到Handler的post方法,都是接收一个Runnable对象.那么这两个方法有啥不同呢? Handler的po ...

  6. 网络协议之:WebSocket的消息格式

    目录 简介 WebSocket的握手流程 webSocket的消息格式 Extensions和Subprotocols 总结 简介 我们知道WebSocket是建立在TCP协议基础上的一种网络协议,用 ...

  7. Shell系列(25)- 条件判断之文件权限

    按照文件权限进行判断 读.写.执行等选项权限,只要有,就返回真 不会按照所属者,所属用户组,其他用户进行区分 先判断文件是否存在,再去判断选项权限 测试选项 作用(标红熟记) -r 文件 判断该文件是 ...

  8. JavaScript进阶面向对象ES6

    类和对象 对象:万物皆对象,对象是一个具体的事物,看得见摸得着的实物 对象是由属性和方法组成的: 属性:事物的特征,再对象中用属性来表示(常用名词) 方法:事物的行为,再对象中用方法来表示(常用动词) ...

  9. Linux档案权限篇(一)

    查看档案的属性"ls-al". 即列出所有的档案的详细权限与属性(包括隐藏文件) 权限 第一个字符代表档案的类型: d:代表是目录 -:代表是文件 l:代表是连接文件(相当于win ...

  10. 微信小程序 创建自己的第一个小程序

    * 成为微信公众平台的开发者 注册 https://mp.weixin.qq.com * 登录 https://open.weixin.qq.com/ * 开发者工具下载 https://develo ...