第四单元博客总结——暨OO课程总结

第四单元架构设计

第一次UML作业

简单陈述

第一次作业较为简单,只需要实现查询功能,并在查询的同时考虑到性能问题,即我简单的将每一次查询的结果以及递归的上层结果都存储下来,使用一个Boolean型变量记录是否更新过该结果,即日后查询可以直接返回查询内容,而无需再次更新,也算是一种较为无脑的办法,根据后来的评测数据以及结果来看,性能、CPU运行时间并不是该次作业的重点,正确性才是关键之所在。需要同学们对于UML每一个元素有充分的理解,同时助教也在讨论区回答大家的问题,通过阅读讨论区也可以做到初步了解。

接口包中给出了各式UMLXXX类,即各种UML元素,但个人并不是很看得懂其中的一些Json部分代码,选择自己构建一个MyUMLXXX类,其中存储UMLXXX,以及各类查询方法还有属性,由于是自己写的类,用起来更加自如,也不用怕有什么坑存在。

在MyUmlInteraction类中,首先是对输入信息的分类处理,较为简单,只需要注意不同信息的处理顺序不同,这样就可以实现在新建数据之初,就实现例如属性和方法存入对应的类中等。个人认为本次作业中较难点为获取顶级父类,存在递归向上查找父类的问题,然后就是同样复杂的实现接口列表,在这里我都选择使用递归实现,而并没有用图的知识来结局,但事实证明早晚要用到图的。。。

类图

方法复杂度

类复杂度

同时我才用了一个以空间换时间的小技巧,也就是同时存了id2Class, name2Class, class2Id三个HashMap,以帮助我快速找到对应的class或id。

第二次UML作业

简单陈述

第二次作业在上次的基础上,增加了类图的检查,以及顺序图和状态图,个人认为难点主要在类图的三个Rule检查上,但万万没想到在顺序图的查询中,吃了读题不仔细的亏,并没有意识到message可以传递给endPoint,直接导致报错。。这是后话。

新增加的三个Rule分别是元素容器中不能有重名成员,不可以有循环继承以及任何一个接口不能重复继承另外一个接口。重名成员较容易判断,但需要注意的是重名对象不仅限于属性之间,关联对端之间,属性和关联对端之间也不可以有重名出现。而循环继承较为复杂,需要用到图的知识,我使用邻接矩阵来记录相互之间的继承关系,并通过tarjan的强连通分支算法,寻找循环继承。而第三条规则,重复继承,我也是建了一张图并通过BFS,寻找重复继承。

除了StandardPreCheck类以外的,顺序图和状态图查询,都与之前的类图查询差不多,甚至更加简单,在此就不多加阐述。

类图

方法复杂度

类复杂度

四个单元架构设计及OO方法理解的演进

  • 第一单元中,求导问题,虽然一开始就知道后期可能会出现更加复杂的求导问题,但个人的架构设计仍然存在缺陷,导致三次作业重构三次,并没有做到任何的代码复用性,但也开始尝试面向对象的编程理念,分成多个类,先考虑对象而非编程过程。

  • 第二单元中,老师讲授了一些设计模式,如读者-写者模式,工厂模式,生产者-消费者模式,电梯的代码开始出现复用,但由于功能较多,仍然存在部分代码重构的现象,对于每次提出的新要求,都需要大量代码的改进,开始尝试各种设计模式。

  • 第三单元中,学习了全新的JML,虽然个人感觉代码内容与JML关系不大,但也体会到了工程上如何对于功能提出要求,底层的程序员如何根据已设记好的架构,完成代码编写,JML只关心方法的pre-Condition以及输出,具体实现并不关心,学会了写JML,为日后在工作上的发展打下基础。

  • 第四单元,UML的出现,自己封装UMLXXX,统一继承UMLElement,并将功能分化到各个类来完成,而不是一个GeneralInteraction搞定所有功能。

四个单元中的测试及理解

  • 第一单元,那时的我并不懂得太多测试相关信息,互测阶段只能靠个人手动造数据,且通过一次打开八个Project的方法,手动输入数据,采用笨拙的方法进行比较,效果并不理想,也只能通过一些特殊情况来卡bug,而隐藏在代码深处的一些隐蔽bug无法检测出,

  • 第二单元,多线程电梯,导致检测更加困难,这时开始学会使用python自动化造数据,由于多线程,无法与他人匹配输出,也只能检测一些抛出异常或是直接crash的bug,正确性检测并不多,但也开始走向自动化检测。

  • 第三单元,已经开始尝试手写脚本,搭建弱版评测姬,也第一次体会到了出门去吃饭,让电脑在宿舍跑bug的快感,但突然发现时间不够啊,(造了10w组数据,跑不完了。。。

  • 第四单元,由于传入数据是mdj文件生成,并没有太好的自动生成方法,测试数据也只能靠手画,且没有互测也就只需要验证自己的正确性。

课程收获

个人较为喜欢OO这门课,但真的很遗憾没有获得任何奖项,甚至鼓励奖。。我也为这门课付出了许多汗水,大二下学期的生活格外充实,但烤漆也格外舒适。且万万没想到的是最后一次作业翻车,出现了读题失误。之前的单元作业,除了第一单元因为性能分无法拿到满分,以及第二单元电梯出现两次bug,其他作业都是满分,但强测测出bug真的很伤。。。也是第一次上这种工程性极强的课程,每一周都和打仗一样,完成一次大作业,但到后期也逐渐熟练了,甚至开始期待下一次的作业,会自己进行猜测,也十分喜欢每次完成代码后的优化过程,虽然有时候是反向优化,但个人代码能力确实有了极大提升,已经可以两天完成上千行的代码工程,并完成bug调试,测试代码的能力也实现了突破零的飞跃,之前从未接触过自动化测试,也被互测逼迫了去学习测试,学习自动生成测试数据,感觉OO真的給我带来了很多。

三个改进建议

  • 首先希望通知能够更加醒目一点,就比如间隔微信群啥的,个人感觉站内通知特别容易被忽略,可能是我个人问题。。。

  • 多线程单元的测试,希望能增加次数,或是开放评测姬来跑一些数据,感觉自己在评测姬上会出现一些不可复现的bug,甚至可能是只有在评测姬上才能跑出的bug。

  • 感觉研讨课的参与,讨论气氛不是很明显,但我也不太懂怎么提高,主要是大家还是较为害羞,比如我就害怕自己的一些想法或问题过于低级,但在网上也确实没有找到解决办法,还是不太放的开吧。

  • 感觉JML单元,可以更加偏重JML一点,我们同学间开玩笑,只有最后写但愿总结的时候,才开始真正的了解JML语言,真正的思考一些细致的问题,之前的时间都用在写程序,实现功能上了。

  • 希望OO的实验课程能够有所进步,感觉前几次的实验课程都很乱,且考察上午刚讲授的内容,基本是在机房现场学习ppt,现场尝试,现学现卖,个人认为调整到周一而不是刚上完课就上机会比较好。

第四单元博客总结——暨OO课程总结的更多相关文章

  1. 北航OO(2020)第四单元博客作业暨学期总结

    一.第四单元架构设计 1.第一次作业 我在本次作业中设置了多个储存结构:Directory,ElementsInName,ElementsInId,Cache. Directory: 顾名思义,这是个 ...

  2. OO第四单元UML作业总结暨OO课程总结

    目录 目录一.第四单元UML两次作业架构设计第一次作业第二次作业二.架构设计总结与OO方法理解演进三.测试理解与实践演进四.课程收获总结五.课程改进建议六.尾声 一.第四单元UML两次作业架构设计 第 ...

  3. OO第四单元博客

    第四单元博客 这个单元的作业,emmmm助教们做的工作还是一如既往的多,我们只负责添一添代码,最后一次作业了,感谢各位助教和老师,同时也希望我能顺利通过这最后一关. 架构设计 第一次作业架构展示 第一 ...

  4. OO第四单元博客作业

    OO第四单元博客作业 BUAA_1706_HugeGun 目录 第四单元作业架构设计 四个单元架构设计及OO方法理解 四个单元测试理解与实践演进 课程收获 一点建议 第四单元作业架构设计 ### 第十 ...

  5. oo第四次博客-UML暨学期总结

    一. 本单元两次作业架构设计 这两次作业实际上难度不大,不存在算法上的难题,大部分时间都是用在处理UML图中各个元素的关系上. 第一次UML主要处理UML类图.有UMLclass,UMLinterfa ...

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

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

  7. OO第四次博客作业!

    oo第四次博客作业 一.测试与正确性论证比较 测试只是单方面片面的证明对于当前的输入程序是正确的,测试只能证明程序有错误,不能说明程序是对的. 正确性论证是程序达到预期目的的一般性陈述,是通过规范化的 ...

  8. OOP第四章博客

    OOP第四章博客作业 (1)本单元作业架构设计 1)针对于第一次作业,我是将所给类进行了自己的封装,在MyUmlInteraction类里面进行关系的建立,这里把所给的UmlClass建立好,同时有i ...

  9. OO第四次博客作业(第四单元作业及期末总结)

    (注意:本文写作顺序与作业要求不完全一致,但涵盖了作业的所有要求) 一学期的BUAA特色OO课程结束了. PART 1  我想先写我这一学期的感想 从第一单元满怀期待地写完多项式求值到最后看着60分不 ...

随机推荐

  1. ICCV2021 | MicroNet:以极低的 FLOPs 改进图像识别

    ​前言:这篇论文旨在以极低的计算成本解决性能大幅下降的问题.提出了微分解卷积,将卷积矩阵分解为低秩矩阵,将稀疏连接整合到卷积中.提出了一个新的动态激活函数-- Dynamic Shift Max,通过 ...

  2. Vue状态管理Vuex简单使用

    状态管理保存在store\index.js中,简单说明如下 import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export def ...

  3. python模块--glob, fnmatch

    包/方法 返回值 参数 说明 glob     Unix shell样式的路径扩展 .glob() list 匹配满足规则的所有路径(默认以 . 开头的文件不会匹配到, 可以用 .* 来匹配) pat ...

  4. MySQL查询结果集字符串操作之多行合并与单行分割

    前言 我们在做项目写sql语句的时候,是否会遇到这样的场景,就是需要把查询出来的多列,按照字符串分割合并成一列显示,或者把存在数据库里面用逗号分隔的一列,查询分成多列呢,常见场景有,文章标签,需要吧查 ...

  5. 使用git克隆仓库到本地报错:SSL certificate problem: unable to get local issuer certificate

    第一次使用Git工具克隆仓库,使用的是HTTPS链接,失败了.发现是因为通过HTTPS访问时,如果服务器上的SSL证书未经过第三方机构认证,Git就会报错. 解决方法:通过命令关闭验证 git con ...

  6. 简单入门PHP中的多字节字符串操作

    什么是多字节的字符串操作呢?其实不少的同学可能都已经使用过了,但我们还是要从最基础的问题说起. 一个字符占几个字节并不是我们表面上看到的那样.正常情况下,一个数字或英文以及英文符号都是占用一个字节的. ...

  7. symfony生成路由

    控制器里生成地址 $this->generateUrl('course_manage_show_test', array('id' => 1)) twig前端文件生成地址: {{ path ...

  8. 解决百度ueditor插入动态地图空白 支持iframe方法

    说明:新版本ueditor要修改 xss过滤白名单 修改配置文件ueditor.config.js 搜索:  whitList 增加下面一行即可 ,whitList:{ iframe: ['frame ...

  9. EcShop调用显示指定分类下的子分类方法

    ECSHOP首页默认的只有全部分类,还有循环大类以及下面小类的代码,貌似没有可以调用显示指定大类下的子分类代码.于是就有这个文章的产生了,下面由夏日博客来总结下网站建设过程中ECSHOP此类问题的网络 ...

  10. three.js 模型常用操作

    场景: THREE.Scene();   场景辅助坐标模型: THREE.AxesHelper(20);   相机: THREE.PerspectiveCamera()// 透视相机 THREE.Or ...