虽然早在开学之前就已耳闻过OO这门课的威力,也在寒假自学了一些java的语法,但在真正面对OO这样的工程训练时才发现寒假所学的那点语法简直不值一提,也深刻的感受到在这个过程中自己的提升确实很快,毕竟ddl是第一生产力。

第一次作业-一元多项式加减


1.程序结构分析

类图:

代码分析:

整体上来看,虽然本次作业用了一些面向对象的特性,比如多项式类和数对类,但从主类ComputePoly来看依然是个过程式的程序。最大的体现就是主类里有非常多的static全局变量和static函数,然后在main里依次调用。说白了,这就是一个伪过程式程序。

耦合度方面,可能是因为第一次作业比较简单,整体上的复杂度和耦合度都还可以,只有ComputePoly类的复杂度略高。

2.自己程序的bug

这个程序只有一个bug,却令我非常懊恼。这个bug的原因在于我正则表达式只能匹配两个项以上的多项式,导致我程序对于所有单项式输入都是直接判定为ERROR。因为这个小bug,我公测挂了6个测试点!!!所幸互测没有产生新的bug。在此也提醒各位同袍们,进行输入格式判定的正则表达式一定要仔细检查,不然一字之差就会导致公测6个点报错甚至更多。

出错的代码段:

String itemRex = "\\({1}[+-]?\\d{1,6},[+]?\\d{1,6}\\)";
String polyRex = "\\{((" + itemRex + "),){1,49}(" + itemRex + ")\\}";

改正后的代码段:

String itemRex = "\\({1}[+-]?\\d{1,6},[+]?\\d{1,6}\\)";
String polyRex = "\\{(" + itemRex + ")(," + itemRex + "){0,49}\\}";

3.别人程序的bug

我所拿到的程序没有使用正则表达式,而是非常复杂的if-else条件判断,连注释也没有。因此我并没有根据其代码结构来设计样例,而是按照分类树将分类树的每个分支都设置了一个样例(实际上在测试自己程序时已经写好了样例,只是忽略了单项式这一边界条件没查出自己的bug…)

该被测者虽然程序结构不是很好,可读性也不高,但是并没有被我查出来bug。

4.心得体会

1) 这次作业确实能起到速成java的作用,尤其是对于正则表达式的使用,配合实验可以很快熟练掌握。

2) 对于正则表达式爆栈问题,我采用的处理方法是对于多项式依次匹配,即每匹配到一个就把这个多项式从整个字符串中去除掉,再匹配剩下的,这样反复迭代就可以避免输入的整个字符串过长爆栈。看到之前的同学有提到这个问题,因此可能有些借鉴意义。

3) 实际上这次作业消除了一部分我对于OO课程的恐惧(可能是因为还没有做到多线程Orz 虽然因为一个小bug挂了6个点,但是我能在3天内通过自学速成一门语言并实现一个小功能,已经是很有成就感的一件事情了。(也可能是我比较菜,满足感的阈值比较低

4) 回头看这次程序的代码,还是过于偏向过程式程序,用到的新知识无非是正则和简单的类操作。后面的电梯明显比这次程序要好

第二次作业-单部傻瓜电梯


1.程序结构分析

类图:

代码分析:

本次作业的类图完全是参考推荐设计,但是Floor类是个空类。虽然命名和推荐设计一样,但是推荐设计中Scheduler的一部分功能聚集在了Elevator中,这给我第三次作业造成了很大的困难。

这次作业的复杂度依然不错,但是用于运行的主类Run依然出现了红字(17),入口函数main的相关向量值也非常高。本以为会很冗余的Elevator类却还可以。

2.自己程序的bug

因为设计原因,我的程序在运行2的32次方-1的时间输入的请求时会timeout,挂了两个公测点,但是后来助教应该把这个问题解决了,不算bug。

互测阶段被发现了一个bug,是由于我在判断同质请求时未遍历当前所有待执行请求,而是只排查了队列的最后一位。这是写代码时的逻辑疏忽造成的,也说明了自己在测试时不够全面。

3.别人程序的bug

这次抽到了一个大佬的程序,不仅程序简洁,也确实没有bug。我采用的方法依然是按分支树测试。我仔细研读了一下,发现他是完全模拟电梯实际情况,包括各楼层的按钮,电梯内的按钮。我想这可能是老师一开始希望我们写的设计。

4.心得体会

1) 和计组一样,设计要先于实现,好的设计可以节约很多debug的时间。我花了很长时间思考本次作业的算法,在思考完成后很快便实现了主要的功能,后面又修复了一些bug。而之后的第三次作业由于是添加功能,我便没有做好设计,而是修修补补,直接造成了我程序可读性的大幅降低。

2) 由于每个人对作业的理解和设计都不一样,所以程序之间相差很大。但是老师布置的作业似乎是想让我们贴近“官方思路”。从第三次作业也可以看出,越贴近“官方思路”,实现起来越容易。我觉得这在某种程度上会限制我们思路的扩展性,但也可以引导我们,节约写程序的时间。

3) 我没有很好的使用Floor类,导致Elevator类内聚过高。

第三次作业-单部ALS电梯


1.程序结构分析

类图:

代码分析:

第二次作业设计思路与“官方思路”的偏离直接导致了第三次作业与“官方思路”越来越远。从类图中可以看到我在Elevator类中创建了太多的函数;还创建了三个请求队列;Scheduler的改动却寥寥无几。究其原因,在于我对第二次作业的理解不同。我认为Scheduler类是将当前时间的请求给Elevator类,从而Elevator有一个待执行的队列,剩下对于待执行请求的处理(包括哪些捎带,哪些同质)则由Elevator类完成。而我想其他同学的程序中,Elevator只是一个被操控的对象,Scheduler负责现在让Elevator往上还是往下,停还是走。

思路的差异带来的是设计上代码量分配的不同。本次作业我Elevator类的WMC(Weighted Method per Class)达到了惊人的69,说明复杂度极高。部分核心函数,如checkOnTheWay(对捎带请求的处理)的Cyclomatic Complexity Metric (v(G))和Module Design Complexity Metric (iv(G)) 极高,一方面可能是代码不够精简,一方面也可能是因为由于设计原因,对于捎带逻辑的处理就是这么复杂。

2.自己程序的bug

本次程序公测和互测均无bug。

3.别人程序的bug

由于本次作业分支树太多,我采取了和前两次作业不同的测试方式。除了设计了几个在自己的测试中体现出来的易错bug样例以外,其余我采用了脚本生成的方法批量测试。最后成功找到了两个bug,一个是捎带请求和主请求输出顺序错乱,一个是同质请求和捎带请求判定错乱。

需要特别指出的是,我认为作业指导上所述“根据被测程序代码结构来设计测试用例”很多时候并不可取,同学们更多的是采用黑盒测试的方法。就拿我拿的代码来说,总行数1000行,注释寥寥无几,变量名也不规范,真要读下来太过艰难。

4.心得体会

1) 像这种往代码上添加功能的程序也要提前做好设计,不要一点点往上加功能,然后不断测出bug不断改。本次作业我这样干了,导致代码可读性极差!核心类的复杂度极高!经常需要在一个类的开头几行加几个判断,然后又在最后几行加几行代码。

2) 注释非常重要,变量名命名要有意义。本工程小白首次出现:周一晚上写的代码,周二白天居然就看不懂了 这一现象。本来说写完后补注释,后来也懒了没加,让我现在再回头看第三次作业的代码,估计又看不懂了(多线程怎么办啊Orz

3) 功能过于集中,导致可读性很差,也没有进一步发挥面向对象的功力。看过几个大佬的博客,他们的类图中有若干个类,相对而言复杂度就低一些,而我和上一次作业相比几乎没有增加新的类,导致Elevator类代码行数从100不到飙升至300(正如吴老师课上所说,一个类代码量很高,已经说明出现了很大的问题)

总结

整体来看我对自己前3次作业的情况还算满意,前两次作业各有一个bug,第三次作业没有bug。但是设计上仍然有待改进,无论是代码规范还是设计细节等都和大佬们相去甚远。希望接下来自己能再接再厉,争取从这门课程中收获满满。

OO第一次博客总结的更多相关文章

  1. OO第一次博客作业

    OO第一次博客作业 一.三次作业的bug反省 1.自己发现别人的问题 (1)输入处理的问题,比如第一次作业,主要就是处理输入的字符串,然后有同学的正则表达式有问题,则对于一些错误输入就不能正确判断. ...

  2. oo 第一次博客作业

    oo 第一次博客作业 早在大一就听说了oo的各种传奇故事,大二下学期终于也开始了我的oo之旅. 基于度量来分析自己的程序结构 第一次作业 类图分析 耦合度分析 可以看出在第一次作业中,我的耦合度非常高 ...

  3. OO第一次博客作业--第一单元总结

    OO第一单元总结 面向对象设计与构造的第一单元,对“面向对象”的概念还根本不理解不熟悉,只觉得需要“分模块”,但不知道怎么分,分多少模块,怎么根据需要的模块的功能建立类.学习的进度又太慢,根本跟不上出 ...

  4. OO第一次博客

    过去的三周里我们完成了表达式求导的程序设计与构造.表达式求导程序,大致思路是实现一个表达式类,支持表达式的输入.求导运算和输出功能.可能的话,还可以增加表达式的化简方法,从而得到更高质量的输出结果.总 ...

  5. 2019年北航OO第一次博客总结

    一.基于度量对程序结构的分析 1. 第一次作业 1.1 基于类的分析的度量 首先,基于类的属性个数,方法个数,每个方法的规模,每个方法的控制分支数目,类总代码规模等特征对本次作业的结构进行分析. 1. ...

  6. OO第一次博客作业总结反思

    使用了masteruml插件来生成类图和metrics插件分析代码 第一次作业 1.UML类图 >在第一次作业中,使用了两个类,代码中有没有使用的变量与函数,为平衡两个类的内容,我将输出函数放在 ...

  7. 始入OO课程的殿堂,初识面向对象的奥妙——OO第一次博客总结

    当我满怀期待叩开OO的大门,却发现宝藏藏在层层阻难之后 第一次作业 1.度量分析 >关于第一次作业的metrics图分析没有出现标红的McCabe Cyclomatic Complexity或者 ...

  8. OO第一次博客作业(第一单元总结)

    Q:菜是绿的,鸡是黄的,那菜鸡是什么颜色的? A:红的,强测全WA了,能不红么. 菜不菜的问题先不说了,认真研究一下这次的题目,以及WA的原因吧. 程序结构简析 三次实验的核心结构都是差不多 第一次的 ...

  9. [BUAA OO]第一次博客作业

    第一次作业 第一次进行面向对象的编程,不论是针对数据设计类还是对方法进行合适的归于不同类中,都不是很熟悉.所写出来的程序还是面向过程+有函数的类(虽然现在很大程度上感觉起来也是这样).索性作业难度并不 ...

随机推荐

  1. JS解决在提交form表单时某个值不存在 alter弹窗点确定不刷新界面

    <form action="" method="post" onsubmit="return checkname()"> < ...

  2. 用深信服AC控制方位话机注册链路的开、关

    1.话机正常配置:专线.互联网 配置: 抓包: 结论:话机走专线注册,正常. 2.在SANGFOR AC上阻断专线地址组(域名没有找到阻断方式),模拟专线断开的场景 1)nslookup解析出地址组 ...

  3. Ubuntu配置ORB-SLAM2过程中的问题

    https://www.imooc.com/article/details/id/29136 1. 提示“CMAKE_CXX_COMPILER-NOTFOUND ” 具体形式: Check for w ...

  4. ASP.NET Core下发布网站图解

    与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel ...

  5. 命令行连WiFi

    命令行连WiFi sudo iw dev wlan0 scan |grep SSID wpa_cli -iwlan0 add_network wpa_cli -iwlan0 set_network 4 ...

  6. Workerman创建聊天室实例

    // 标记是全局启动 define('GLOBAL_START', 1); require_once __DIR__ . '/Workerman/Connection.php'; require_on ...

  7. 《笨方法学Python》加分题29

    加分练习猜一猜 “if 语句” 是什么,他有什么作用.在做下一道题之前,试着用自己的话回答下面的问题: 你认为 if 对他下一行代码做了什么?为什么 if 语句的下一行需要 4 个空格缩进?如果不缩进 ...

  8. 博客1--tensorflow的图像基本处理操作

    话不多,具体内容在开源中国里我的博客:https://my.oschina.net/u/3770644 代码: #!/usr/bin/env python# -*- coding:utf-8 -*-# ...

  9. [C#.net]SQL参数传入空值报错解决方案

    C#中的null与SQL中的NULL是不一样的,SQL中的NULL用C#表示出来就是DBNull.Value. 注意:SQL参数是不能接受C#的null值的,传入null就会报错. SqlComman ...

  10. IOS11导航栏自定义返回按钮被遮挡

    将file作为请求体传入到服务端. { WaitForSingleObject(handle, INFINITE); printf(" -- by MoreWindows( http://b ...