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

第四单元博客总结——暨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,现场尝试,现学现卖,个人认为调整到周一而不是刚上完课就上机会比较好。 

转载于:https://www.cnblogs.com/JordenQiao/p/11079538.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP从零开始--数据库

文章目录一、 数据库简介1.1概念1.2命令行操作1.3连接数据库1.4配置环境变量二、 数据库的相关操作2.1显示所有仓库2.2创建仓库2.3删除仓库2.4切换仓库三、 数据表的相关操作3.1概念3.2显示所有的数据表3.3创建数据表3.2修改字段名3.3查看表结构3.4添加字段3.5删除字段3.6更改数…

如何下载js类库

https://bower.io/ 这个已经淘汰 https://learn.jquery.com/jquery-ui/environments/bower/ Web sites are made of lots of things — frameworks, libraries, assets, and utilities. Bower manages all these things for you. Keeping track of all these packages and mak…

PHP从零开始--字段修饰符数据操作SQL语言

文章目录一、 字段修饰符1.1主键1.2自动增长1.3非空1.4默认值1.5外键二、 对数据的操作2.1增加数据2.2删除数据2.3更新数据2.4查询数据2.4.1查询所有的数据2.4.2查询指定字段2.4.3去除重复字段2.4.4where表达式详解2.4.5分组查询2.4.6排序三、 SQL语言3.1DML3.2DDL3.3DCL一、 字…

scrapy爬虫框架windows下的安装问题

windows操作系统python版本是3.6.0通过Anaconda命令conda install scrapy安装scrapy,安装过程中没有问题。然后在命令行输入命令准备新建项目时,输入 scrapy startproject firstscrapy时出现了from cryptography.hazmat.bindings._openssl import ffi, libImportErr…

charles使用说明(基于mac)

1. Charles简介 1.1 Charles 需要java的运行环境支持,支持Windows、Mac;Fiddler不支持Mac。故Charles是在Mac下常用的网络封包截取工具。 1.2 Charles原理:通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过…

看完就懂的连表查询

文章目录一、表与表之间的关系1.1一对一1.2一对多1.3多对多二、 连表查询2.1概念2.2笛卡尔积2.3内连接2.4外连接2.4.1左外连接2.4.2右外连接2.4.3全连接2.4.4navicat导入导成sql语句2.4.5练习三、 子查询3.1概念3.2练习3.2.1查询工资最高的员工所有信息3.2.2查询工资比7654工资…

三分钟掌握PHP操作数据库

这里写自定义目录标题一、 操作数据库(mysql)的工具1.1命令行工具1.2navicat界面化工具1.3phpAdmin界面化工具二、 表单传值2.1文本框和文本域传值2.2单选框传值2.4下拉菜单传值三、 php连接数据库3.1连接方式介绍3.2mysqli基础步骤3.2.1创建连接3.2.2选…

看完就会的文件编程

文章目录文件编程1.1文件操作函数1.1.1file()函数1.1.2fopen fgets fclose1.2.1读取模式1.2.2写入内容(开头)1.2.3写入内容(追加)1.1.3file_get_contents1.1.4文件路径相关函数1.1.5file_exists1.1.6feof1.1.7copy()1.1.8set_incl…

一文吃透PHP和HTML的嵌套写法

1.1全部php生成结构 1.2html中嵌套php 总结如下&#xff1a; html和php混写规则&#xff1a; php代码必须包在<?php ?>html中写php也是同理&#xff0c;但是有值输出必须加上echo 1.3博客项目 1.3.1前后台 前台主要是做数据展示的&#xff0c;所有的用户通过访问域…

一文看懂 GD2库

文章目录一、 GD2简介1、 验证码&#xff08;实际上是一个img&#xff09;二、 GD2库使用步骤2.1添加扩展2.2修改php配置文件2.3重启服务三、 GD2里面的常用方法3.1 imagecreate3.2 imagecolorallocate3.3 imagefill3.4 输出图像资源3.5创建真彩画布3.6在图像中写文字3.6.1imag…

算法实践--最小生成树(Kruskal算法)

什么是最小生成树(Minimum Spanning Tree) 每两个端点之间的边都有一个权重值&#xff0c;最小生成树是这些边的一个子集。这些边可以将所有端点连到一起&#xff0c;且总的权重最小 下图所示的例子&#xff0c;最小生成树是{cf, fa, ab} 3条边 Kruskal算法 用到上一篇中介绍的…

洽谈 “会话技术” 纯干货赶紧收藏吧

文章目录一、 HTTP协议二、 会话三、 cookie3.1概念和设置cookie3.2读取cookie3.3设置cookie有效期3.4cookie是跨页面的3.5删除cookie3.6登录案例3.7cookie特点四、 session4.1概念4.2设置session4.3获取session4.4清除session4.5模拟购物车案例一、 HTTP协议 HTTP协议是Hyper…

[bzoj2729][HNOI2012]排队 题解 (排列组合 高精)

Description 某中学有 n 名男同学&#xff0c;m 名女同学和两名老师要排队参加体检。他们排成一条直线&#xff0c;并且任意两名女同学不能相邻&#xff0c;两名老师也不能相邻&#xff0c;那么一共有多少种排法呢&#xff1f;&#xff08;注意&#xff1a;任意两个人都是不同的…

详解 正则表达式

文章目录一、概念二、作用三、语法规则3.1定义规则3.2符号简介3.3preg_match用法详解3.4详解元字符3.4.1 \d和[0-9]3.4.2 \D和[^0-9]3.4.3^和$3.4.4*代表出现0次或者多次3.4.5代表出现1次或者多次3.4.5&#xff1f;代表出现0次或者1次3.4.6{n}3.4.7{n,}3.4.8{n,m}3.4.9点号&…

Java:控制台输入车辆信息,将信息保存至数据库中

程序功能&#xff1a;控制台输入车辆信息&#xff0c;将信息保存至数据库中 程序代码如下&#xff1a; BaseDao.java package DAO_dome.kehozuoye; import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;i…

echars 3D地图为区域自定义颜色

echars 3D地图为区域自定义颜色问题延伸解决问题问题 根据项目需求&#xff0c;我们要将下面省级地图中的个别市进行高亮&#xff08;不同颜色&#xff09;展示 延伸 首先跟大家介绍这个地图的展示方式&#xff1a; 采用的是Vue框架中运用echarts地图采用的是geo3D和scatt…

基于Python语言使用RabbitMQ消息队列(一)

介绍 RabbitMQ 是一个消息中间人&#xff08;broker&#xff09;: 它接收并且发送消息. 你可以把它想象成一个邮局: 当你把想要寄出的信放到邮筒里时, 你可以确定邮递员会把信件送到收信人那里. 在这个比喻中, RabbitMQ 就是一个邮筒, 同时也是邮局和邮递员 . 和邮局的主要不同…

爆赞程序猿开发软件

VSCode 使用 IntelliSense 超越语法突出显示和自动完成&#xff0c;它提供基于变量类型、函数定义和导入模块的智能完成 直接从编辑器调试代码。启动或附加到您正在运行的应用程序并使用断点、调用堆栈和交互式控制台进行调试 与 Git 和其他 SCM 提供商合作从未如此简单。查…

如果你在北京失业了,别怕,记得去领这笔钱!最少2034元/月!

人在江湖飘&#xff0c;哪能不挨刀 公司倒闭&#xff0c;老板走人&#xff0c;公司裁人 …… 就要被迫失业了 别怕! 如果你在北京失业了 记得去领这笔钱——失业保险金 每月最多有2143元 虽然钱不多&#xff0c;但能解燃眉之急 帮助你度过困难日子 重点全程网上就能…

真实诠释程序员日常的二十四张图【你中了几个】

当你打开遗留代码时 扒下来项目后改了一行代码…… 程序员调试css样式的时候 当你的try catch 不起作用 产品经理对你说要兼容IE 没有ui给你提供大小设计的结果 没吃透需求直接开发的你 程序员修复bug的真实处境 当你开始使用库&#xff0c;但忘记阅读文档 产品经理告诉你这只是…