大闸蟹的 O O 战记
一、 第四单元架构设计分析
第一次作业,UML类图
第一次作业的主要任务是完成对UML类图的解析并实现查询等操作,需要在课程组给定的框架中添加函数。对于UML类图,其存储是按照元素来存储的,其将所有的类图中的对象,属性,关系等都视作元素,按照元素类型存储着相关的量。我们要做的工作,就是对这些元素进行分类储存,将其实现为有利于查询的结构。
我的理解是,本次作业中,所输入的数据都是自底向上的,而需要我们进行的查询过程是自上而下的,我们要完成的任务其实是将一个个的元素还原为图的结构,来进行存储与查询操作。故我新建了存储方法、接口、和类的三个类,用来存储UML图以及实现查询等功能。
对于方法类,其中需要存储方法本身的名字,包含的参数等基本属性,对于存储类的类,需要存储其包含的属性、方法、继承关系、关联关系以及实现关系等,对于接口,由于跟接口有关的查询操作只需要考虑其及继承关系,故只需要存储其继承关系即可。
类图如下:
这次作业总体来说比较简单,在与同学交流的过程中甚至发现暴力遍历也是可以的23333
第二次作业,对类图、顺序图、状态图的 解析以及有效性的检查
第二次作业,在第一次作业的基础上增加了顺序图、状态图以及有效性的解析。对于顺序图和状态图,在阅读了大佬们在讨论区的讲解之后,其本质上和第一次作业是一样的思路,新建几个类来存储他们的信息即可。关键在于有效性的检查。对于第一个检查,要检查类中的属性与连接对端是否重名,但在实现过程中发现,还需要对类中的重名的属性进行检测。对于第二个检查,要检查循环继承。我采用的做法是将继承关系以及实现关系看作一样,使他们构成一个图,然后对每一个顶点查看是否有到自己的路径,如果有的话就有循环继承。对于第三个有效性检查,是要检查重复继承与重复实现。我采用的检查方式依旧是遍历图,看是否有多条路径到同一个点。在实现的过程中,我发现不同id但相同的继承关系在图中只会被计算一次,所以需要单独计算,并且所有能够到达这个点的点都应该加入重复继承的矩阵中。
类图如下:
在具体实现的过程中,发现如果将所有的代码都放在一个类中,会远远超过500行,故需要写多个类分别实现官方的接口,然后在标准的这个类中实例化其他的对象并且在构造方法中将数据传到其他的类中。
在debug的过程中,发现有好多对于指导书理解有问题的地方,遇到了无数空指针异常报错,是一个浩大的工程。
二、架构设计及oo理解方法的演进
第一单元,是我们刚刚解除面向对象的单元,完成的任务是逐渐变得复杂的多项式求导。由于刚刚解除面向对象,我们采用的还基本上都是面向过程的思维。我采取的都是采用正则表达式去匹配然后进行分割计算。对于数据的储存,第一次和第二次作业是使用数组等存在一个类里,并没有将其构建类去分类储存计算。在第二次第三次作业时,由于需要支持嵌套,不得不将每一个因子构建类去逐层匹配并进行嵌套的求导运算。然而,由于对面向对象思想的不熟悉,采取面向过程的思路去写,代码量很大,问题层出不穷,导致对于第一单元作业都能够很快过掉能看见数据的中测但在强测中大面积爆炸。
第二单元,是多线程单元,任务主要围绕电梯系统。多线程是我们新接触的东西,所以刚开始非常混乱,完全不理解多线程的含义,胡乱写了好多个不知道是什么的版本。在多次与同学交流的过程中,才逐渐一点点理解了多线程的含义。这一单元的作业我都采取的生产者消费者模式,每一次作业都是在上一次作业的基础上进行增添。在关于如何判断电梯停下来这个问题上,我花费了很多时间去设计,最终确定为向调度器中传入一个null并且监视电梯中是否还有运行的人来判断结束。多线程单元强制我们使用面向对象的思维去看待问题,去编写代码,虽然是一个十分痛苦与坎坷的过程,但确实是我们飞速地理解了面向对象地思想并且加以运用。
第三单元,是JML单元。这一单元向我们介绍了JML规格,企图使我们的代码标准化。这一单元我们通过下载官方包,在其中根据给定的规格来填写函数完成功能。对于前两次作业,按照官方给的规格就可以简单完成。但是,这一单元对于运行时间有着限制,需要我们合理地合计和采用数据结构。自从这一次开始,我就基本全部换成了HashMap。第三次作业,是一个比较复杂的地铁线路系统,需要我们完成图的遍历等操作,而由于题目比较复杂,官方给出的jml规格也十分复杂难懂,最后基本变成了数据结构还债作业0.0
第四单元,使UML图单元。作业主要完成的任务使UML图的解析工作。在经历了前几个单元的练习,这一单元虽然工程量很大,但是写起来并没有之前那样吃力。使用面向对象的思想,建立类去储存和实现数据的相关操作,使得这一单元作业的完成逻辑很清晰,bug也明显减少。
三、测试的理解与实践的演变
第一单元的测试基本上都是手动敲一些数据,寻找一些极端的数据来进行bug测试,效率较为低下。在进行测试结果的检查时,由于有些数据较长,对于输出的结果正确性判断也有一些难度和问题,并且由于输出也应该合乎给的规则,对于输出正确性的 检查也有很大问题。
第二单元,由于是多线程,并且调度方法不一,输入的数据得到的结果有很多种,并且bug基本无法复现,测试功能也比较难以进行。
第三单元,在指导书的指导下,我们解除了JMLUNITNG,Junit等工具。但是在大面积测试中,这些方法效率还是比较低的。故我采用生成随机数据并且跟自己写的以及同学的比较的方式来进行。但是由于进入强测之前无法获取其他同学的代码,故自己测试的时候基本只能测出空指针异常等错误,问题还是比较大。
第四单元,是最后一个单元。由于是最后,在自己写完之后我也去要了同学的代码一起进行测试来找到输出结果不同的数据。得益于此,这一单元强测基本上没有bug出现。
四、课程收获
1.学习了面向对象的思想。之前学的基本都是面向过程的语言,解决的问题也都是一些规模比较小的问题。但在面对大规模的问题时,分类分块去解决是非常重要的。采用面向对象的思想更加利于我们之后参与项目的开发。
2.学习了测试的方法。之前由于是可以看见测试数据的,基本是面向测评编程。而OO课程采取中测+强测+互测的方式,要求我们要完全找到程序中的错误进行修改。这极大的锻炼了我们思维的逻辑性、严密性以及测试的能力。
3.提前体验了社会中的程序员生活。在大企业中,都是存在着测试与开发人员分工的。互测阶段让我们提前体验到了程序员间关于bug的惨烈战争。(以及经常熬夜肝代码的夜生活0.0)
4.代码规范有所提高。之前,我写程序基本只是为了完成作业,完全没有代码规范的概念。这次,由于checkstyle的存在,对于代码的合理安排以及规范表达都渐渐使我规范了我写的代码。之前的汉语拼音命名法也改正了过来。
五、建议
1.关于实验课的安排。感觉oo的实验课相对于作业来说有种无关紧要的感觉。并且实验的时间紧跟在理论课之后,都没有时间去理解与消化,安排有些不太合理的地方。
2.作业的难度或许有待调整,第一单元的最后一次作业对于刚接触的我们难度有些大。第三单元的最后一次也基本完全偏离了JML而变成了数据结构和算法竞赛。
3.希望能够提高中测的数据强度以及覆盖面,不然经常出现中测过了但是强测因为一个小bug全面爆炸
4.希望强测的梯度不是简单的增加随机代码,我这种非洲人很多次因为一个小bug炸掉了近乎全部的强测,而欧皇有很多bug甚至测不出来。
大闸蟹的 O O 战记的更多相关文章
- 达洛克战记3 即将开服! What's New!
历经数个月的开发,达洛克战记3即将全新开服! 剧情: 回归到三大种族起源时期,三大种族并没有像现在三足鼎立.人类一直处于统治地位.但是突然间一群巨人的出现,让人类损失惨重,身为勇者,需要探索巨人背后的 ...
- 圣魔大战3(Castle Fantisia)艾伦希亚战记完美攻略
作为城堡幻想曲系列续作,艾伦希亚战记继承了前作的战棋+养成模式进行游戏. (城堡幻想曲3,纠正大家个错误哦,不是圣魔大战3,圣魔大战是城堡幻想曲2,圣魔大战不是个系列,艾伦西亚战记==艾伦希亚战记,一 ...
- 攻略三战的完美体验3Castle Fantisia阿兰·梅希亚战争艾伦西战记它包含重做版本(这是新的艾伦·梅希亚大战)
(城堡幻想曲3,纠正大家个错误哦,不是圣魔大战3,圣魔大战是城堡幻想曲2,圣魔大战不是个系列,艾伦西亚战记==艾伦希亚战记,一个游戏日文名:タイトル キャッスルファンタジア -エレンシア戦記-リニュー ...
- 完美攻略心得之圣魔大战3(Castle Fantisia)艾伦希亚战记(艾伦西亚战记)包含重做版(即新艾伦希亚战记)
(城堡幻想曲3,纠正大家个错误哦,不是圣魔大战3,圣魔大战是城堡幻想曲2,圣魔大战不是个系列,艾伦西亚战记==艾伦希亚战记,一个游戏日文名:タイトル キャッスルファンタジア -エレンシア戦記-リニュー ...
- 圣魔大战3(Castle Fantisia)艾伦希亚战记改动器/秘籍——究极改动大法
艾伦西亚战记== 艾伦希亚战记,是一个游戏 武器:UltraEdit(金山游侠自带的文件改动器也能够,仅仅是这个专业) 目标: 存档文件(建议先备份) 知识:save00.dat-save19.da ...
- TCG卡牌游戏研究:《炉石战记:魔兽英雄传》所做的改变
转自:http://www.gameres.com/665306.html TCG演进史 说到卡牌游戏,大家会联想到什么呢? 是历史悠久的扑克牌.风靡全球的<MTG 魔法风云会>与< ...
- 甲小蛙战记:PHP2Java 排雷指南
(马蜂窝技术原创内容,申请转载请在公众后后台留言,ID:mfwtech ) 大家好,我是来自马蜂窝电商旅游平台的甲小蛙,从前是一名 PHP 工程师,现在可能是一名 PHJ 工程师,以后...... 前 ...
- 问题 B: 傻鸡抓大闸蟹
问题 B: 傻鸡抓大闸蟹 时间限制: 1 Sec 内存限制: 128 MB提交: 94 解决: 39[提交] [状态] [命题人:jsu_admin] 题目描述 背景又到了吃大闸蟹的季节,黄老师想 ...
- 大闸蟹的项目分析——CSDN APP
大闸蟹的软件案例分析 项目 内容 这个作业属于那个课程 班级博客 这个作业的要求在哪里 作业要求 我在这个课程的目标是 学习软件工程的相关知识 这个作业在哪个具体方面帮我实现目标 从多角度分析软件 一 ...
随机推荐
- 全局CSS样式表
看api手册使用即可 1.按钮和图片 2.表格.表单 表单的lable作用就是点击前面的文字可以聚焦到对应的输入框中
- Windows下安装程序时提示未安装Microsoft Net FrameWork 2.0
问题描述 安装程序时碰到如下: 现在基本都是用win7.win10系统,缺少环境大多数都是因为系统没有启用. 解决方法 控制面板 - 程序 - 启用或关闭Windows功能 - 把第一项'NET Fr ...
- ci框架 自定义配置方法
系统自动在Application文件夹下生成的config.php文件,采用key-value关联数组的形式来存放配置项和值.为了使结构更清晰,手动新建另外一个配置文件myconfig.php,所采用 ...
- Charles抓包工具断点修改返回内容
在测试过程中,往往需要让服务器返回指定的内容,测试一些特殊情况.例如列表内容为空.数据异常的情况等.如果通过操作服务器配合构造相应的数据会比较麻烦,甚至不好构造数据.此时,可以使用Charles的断点 ...
- html网页乱码
html乱码原因与网页乱码解决方法 html乱码原因与网页乱码解决方法,浏览器浏览网页内容出现乱码符合解决篇(html中文乱码) 造成html网页乱码原因主要是html源代码内中文字内容与html ...
- 动图图解GC算法 - 让垃圾回收动起来!
原创:码农参上(微信公众号ID:CODER_SANJYOU),欢迎分享,转载请保留出处. 提到Java中的垃圾回收,我相信很多小伙伴和我一样,第一反应就是面试必问了,你要是没背过点GC算法.收集器什么 ...
- serialVersionUID序列化版本号与ObjectOutputStream对象输入输出流
1. 观察ObjectOutputStream 我们观察ObjectOutputStream就可以发现该类没有无参构造,只有有参构造,所以他是一个包装流 2. 具体使用: public static ...
- RabbitMQ 3.9.7 镜像模式集群与Springboot 2.5.5 整合
1. 概述 老话说的好:做人要懂得变通,善于思考,有时稍微转个弯,也许问题就解决了. 言归正传,之前我们聊了 RabbitMQ 3.9.7 镜像模式集群的搭建,今天我们来聊聊 RabbitMQ 3.9 ...
- 安装Transformers与ValueError: Unable to create tensor, you should probably activate truncation and/or padding with 'padding=True' 'truncation=True' to have batched tensors with the same length.报错
此篇博客内容为短暂存留记录(项目使用过程还未记录),后续将会更新完整学习流程.. 1.根据官网上的链接安装有两种方式: (1)pip直接安装 pip install transformers # 安装 ...
- 憋了很久,终于弄懂什么是IOC(控制反转)
导航 共享充电宝 IOC思想 复杂的依赖关系 IOC定义 Spring中的IOC IOC与工厂模式 IOC容器的技术剖析 结语 参考 本节是摘自<Spring Boot 实战纪实>的第 ...