OO第一阶段作业总结
对于OO这门课,学长学姐偶尔提起,大家都略有耳闻,但是并没有将其和计组相提并论。因此,在刚开始接触的时候,并不认为其会比计组难到哪里去,然而事实证明,还是不要想当然去判断,以及不提前学好JAVA对于OO这门课会降低很多的生存率。
代码度量分析程序结构:
第一次作业
Metric度量分析:

在度量分析中,可以看到第一行是红色标注的,这反映的是一个模块的复杂程度,而第三行反应的是各类的嵌套深度。从中不难看出,我所撰写的某个方法过于复杂,这是由于我将正则表达式的匹配加之对其是否正确的判断以及最后的输出功能都放在了这个方法中,因此出现了这个方法过于复杂的情况。从根本上来说这是由于第一次接触java语言,对于面向对象的思想还是不够理解,本质上还是撰写了一个偏面向过程的程序。因此,应当将每个功能细化和分开,这是十分重要的。
类图:

发现的bug、设计思路:
第一次作业我自认为是测试得比较详尽的,然而却忽略了指导书上提到的一个点,导致了三个测试点错误,那就是当系数为0时,不打印这对数。我当时并没有仔细去看指导书,对于这点要求是真的没有看清楚,这让我十分懊恼,也让我懂得了指导书是很重要的一个东西(还有readme)。惭愧的是,这次作业中还有一个bug没有被公测和互测测出,从而导致了第二次作业的失误。
在设计上,我将正确匹配到的数字存入一个大数组,然后用dividenum()方法将其分割为系数和指数,然后进行同指数合并并计算排序,思路简单,但是实现复杂。并且正则表达式的匹配功能并不完善,判断过于复杂和繁琐,以及对于数据的边界情况并没有进行很好的测试。
第二次作业
Metric度量分析:

在第二次作业中,同样出现了方法过于复杂的情况,也就是第一行所标注的get_list()方法,我将读取字符串,处理字符串,存储正确的字符串这三个功能,都放进了这一个方法中实现,因此过于复杂是理所应当的,同时还出现了第二行所标注的问题:参数过多。由于要实现这巨大的功能,因此大量的参数和变量是必不可少的,这就显得程序的这个方法模块很膨胀,可读性非常低,并且导致我在后来debug时十分困难,连自己都记不清楚这些参数变量代表的含义,还得花时间去回忆和重新理解,得不偿失。但是这次的作业更“OO”了一点,也就是更加的面向对象化了,对这种思想有了更进一步的理解。
类图

发现的bug、设计思路:
在我认为第二次作业已经测试得足够完善时,公测结果又一次活生生的打了我的脸,我的程序在公测中crash了,原因是数组越界。这次的作业要求实现一个傻瓜(FAFS)调度电梯,并且要求不符合要求的无效请求需立刻给出反应。因此我的程序设计成,当输入无效时,指针减一。但如果第一条指令就错误的话,数组的指针就变成了-1,也就是越界了。这也就导致了在公测样例中,只要涉及到第一条指令无效,那么我就错了。emmmmmm,越想越气,这就好比你吃鸡捡了个空投,你捡了一把AWM但是子弹忘带走了。
这次作业的难点在于判断同质,我的方法是从后往前判断,并且将指令分类为:UP,DOWN,NULL(ER),只有后一条指令和前一条指令类型相同,并且开始时间在前一条还未执行完成时,指令才会判断为同质。这个方法存在着一些小bug,当时我并没有de出来,但是在第三次作业中发现了,追悔莫及。
第三次作业:
Metric度量分析

第三次作业同样出现了方法过于复杂并且参数变量过多的情况,一部分原因是因为第三次作业是在第二次作业基础上的继承和重写,并且要求实现捎带功能。而我在ele_start()这个方法中,一是传进了过多的参数,二是在函数中既要判断同质,又要判断捎带,同时还得打印正确输出。可以说这个函数几乎完成了我整个程序的主要功能。这样的好处是,嗯,方便管理整个程序的运行情况,坏处依然是可读性极差,导致了我一点都不想debug。实质上,这个几乎万能的方法是不符合OO的基本思想的,对此我也十分惭愧和懊悔。
类图

发现的bug、设计思想:
第三次作业是我测试得最为粗糙的一次,由于时间没有安排好,导致几乎没有时间去debug和发现问题,因此捎带存在的问题很大,尤其是同层实现两个请求,并且是捎带请求时,不能很好的做出判断并且实行,同时连续两个捎带时程序也会出错,这也是由于我考虑不够周到造成的。但是在此基础上对第二次作业的改正是十分有效的,并没有重复出现第二次作业的bug,对正则的使用也更加得心应手。
捎带是这次作业最主要的功能实现,我的方法是使用一个变量loca,记录主请求的位置,然后判断接下来的指令存不存在捎带的情况,如果存在,就选择一条最优,也就是离当前楼层最近的请求执行,当执行完所有捎带请求后,回到loca的位置,执行主请求。可惜的是,我花了许多时间也没有de完我的bug。
心得体会:
1. OO这门课必须花费大量的时间和精力去学习和体会,不仅是面向对象的思想,还有设计思路的逐步完善和成熟,在动键盘前,应该至少有一个完整的设计思路,这样才会节省更多的时间,并且必须认真去理解指导书想表达的含义,readme也必须认真的去完成和说明。
2. 对于这门课,良好的心态是必要的。在身边的就有不少例子,互测的双方因为对方比知道自己的姓名而肆无忌惮。也有人跟我吐槽,一门课把整个系的阴暗面都展现出来了。我并没有遇到对我而言十分过分的人存在,我们并不能以一概全,只能以一个良好积极的心态去面对每次挑战。在抱怨别人给你找出bug之前,或者在给你readme挑错之前,为何不想想自己的问题出在哪里?为何不考虑自己的程序为什么没有完善?所以保持一个良好的心态吧。
OO第一阶段作业总结的更多相关文章
- OO第一阶段总结
OO第一阶段总结 一.各次作业程序结构 第一次作业 第一次作业由于初用JAVA,还没有深刻理解面向对象的编程方法,故在编程过程中只用了一个类,一个方法,即完成了相应的程序功能.这必然不是本课程的目的, ...
- 【作业1.0】OO第一单元作业总结
OO第一单元作业已全部完成,为了使这一单元的作业能够收获更多一点,我回忆起我曾经在计算机组成课设中,经常我们会写一些实验报告,经常以此对实验内容反思总结.在我们开始下一单元的作业之前,我在此对OO第一 ...
- 面向对象(OO)第一阶段学习总结
前言:对OO本阶段作业情况说明 本阶段一共完成三次作业,第一次主要是在主方法里面进行编程,也就是和之前C差不多,而随着学习的深入,慢慢了解到面向对象与面向过程的区别.作业的难度也在慢慢增大,后两次都用 ...
- 【OO学习】OO第一单元作业总结
OO第一单元作业总结 在第一单元作业中,我们只做了一件事情:求导,对多项式求导,对带三角函数的表达式求导,对有括号嵌套的表达式求导.作业难度依次递增,让我们熟悉面向对象编程方法,开始从面向过程向面向对 ...
- OO第一单元作业总结——表达式求导
OO第一单元作业总结 第一次作业 基于度量分析代码结构 基本算法 第一次作业是简单多项式导函数求解,不需要对输入数据的合法性进行判定, 基本思想是用 (coeff, expo)表示二元组 coeff* ...
- java 初学者 第一阶段作业编程总结及心得体会
0.前言 第一阶段java作业分为3次. 第一次作业是简单得一些语法和一些简单得逻辑思维,主要内容有求三角形是什么三角形的,还有就是求坐标点所在范围的,也涉及到了数字和字母的转换,总之相相当于是给ja ...
- Java第一阶段作业总结
目录 0.前言 1.作业过程总结 2.OO设计心得 3.测试的理解与实践 4.课程收获 5.对课程的建议 前言 本次博客针对第一阶段的三次作业发表总结,作业要求主要是初学者对于Java的基本语法.用法 ...
- 北航OO第一单元作业总结(1.1~1.3)
经过了三次作业之后,OO第一单元告一段落,作为一个蒟蒻,我初步了解了面向对象的编程思想,并将所学内容用于实践. 一.第一次作业 1.架构分析 本次作业需要完成的任务为简单多项式导函数的求解.表达式仅支 ...
- OO第一单元作业总结
oo第一单元的作业是对多项式的求导.下面就是对三次作业分别进行分析. 第一次作业 分析 第一次作业相对来讲比较简单,甚至不用面向对象的思想都能十分轻松的完成(实际上自己就没有使用),包含的内容只有常数 ...
随机推荐
- CSU 2056 a simple game (正反进行KMP)超级好题!!!
Description 这一天,小A和小B在玩一个游戏,他俩每人都有一个整数,然后两人轮流对他们的整数进行操作,每次在下列两个操作任选一个: (1)对整数进行翻转,如1234翻转成4321 ,1200 ...
- VMware Tools安装方法及解决无法全屏显示问题
环境:VMware8.0虚拟机 ubuntu:12.04 在刚安装完ubuntu后,屏幕不能全屏显示,此时: 1.安装VMware Tools 步骤: 1.1 进入ubuntu系 ...
- css3--js-jq动画效果
最近写网页时才发现原来css3的动画效果感觉还不错哦!但自己以前学的时候却没有当作重点,现在从新学习一下: 1:原理: 创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式.在动画过程中,您能够 ...
- 给button增加下划线
如何给button增加下划线简单版 - (void)setUnderLineForButton:(UIButton *)btn withTitle:(NSString *)title{ //利用富 ...
- 名字&值
1)名字VS值 名字和内存(存储)位置相关联. 名字—(环境)———>位置——(状态)——>值 这两个映射都在随着程序的运行而改变. 2)环境VS状态 环境是指一个名字到存储位置映射,也可 ...
- Ubuntu 18.04安装MongoDB 4.0
首先,导入包管理的公钥. Ubuntu包管理工具(即dpkg和apt)要求发行商使用GPG密钥签署包,从而确保包的一致性和真实性. sudo apt-key adv --keyserver hkp:/ ...
- laravel5.5源码笔记(七、数据库初始化)
laravel中的数据库也是以服务提供者进行初始化的名为DatabaseServiceProvider,在config文件的providers数组中有写.路径为vendor\laravel\frame ...
- 使用cgroups来控制内存使用
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页 回到顶级页面:PostgreSQL索引页 [作者 高健@博客园 luckyjackga ...
- loj#121.「离线可过」动态图连通性
题面 话说#122怎么做啊 题解 我的\(\mathrm{LCT}\)水平极差,连最小生成树都快忘了,赶紧复习一下 做法和这篇是一样的 这道题还可以练习线段树分治 还可以练习ETT 果然是道吼题 代码 ...
- Package设计2:增量更新
SSIS 设计系列: Package设计1:选择数据类型.暂存数据和并发 Package设计2:增量更新 Package 设计3:数据源的提取和使用暂存 一般来说,ETL实现增量更新的方式有两种,第一 ...