第一次作业
度量图:
类图:
由度量图可以看出,由于在完成第一次作业时,不熟悉java,也没有较好的理解面向对象式变成的方法与精髓,所以仍然在使用面向过程式编程的思路去完成作业。第一次作业中,GetPoly类用于获取用户输入、检查输入合法性、获取多项式并存入相应结构中,poly类用于储存多项式。而运算部分仍然集中于main方法,所以在度量图中可以明显看出main方法仍然占用了绝大多数资源。由于第一作业相对来说难度仍然较低,所以这种程序核心功能集中于一个方法实现的原始思路不会出现太大的问题。但是从第二次作业开始,这样的思路显然就会因难度的提升而凸显出其不合理性。
第一次作业的难点我认为在于输入的合法性判断。在输入的合法性判断上我和大多数同学一样选择了用正则表达式来解决。经过对正则表达式的学习,发现正则表达式强大的功能与灵活性可以很好的解决输入合法性的检查。但在随后的测试中,我和同学们发现,在单行输入数据很长时,直接匹配正则表达式会出现爆栈的错误。所以经过思考,我们选择了每次只匹配一个多项式,匹配多次后将所有匹配到的多项式拼接,与原输入想对比的方式绕开了爆栈的错误。在互测中,第一次作业的BUG有两个:1、在多项式中只有一项时,会多输出一个逗号(显而易见的低级错误,在测试时光顾着测试复杂数据,反而忽略了这种最简单的情况);2、输入21个多项式时不会报错(显然是判断条件中多打了一个等号。。)。两个BUG都是因为粗心大意而出现的错误,这一点也体现出了第一次作业在测试上的不足。
第二次作业
度量图:
类图:
从度量图中可以看出,第二次作业相比第一次作业有了较大的改善,占用资源最多的是用于将输入的指令转换成Request对象的setr方法、用于每次执行完指令后进行灭灯、更新需要指令的指令队列的updater方法。这两个方法的主要特点都是需要重复多次使用,所以占用了较多资源。第二次作业的难点我认为主要有两个。1、如何正确理解5个类的设计要求,并实现5个类协同完成整个程序所需要的功能;2、正确理解指导书,并正确处理各个边界数据。第一点,由于每个人的设计思路不同,所在在设计时思路有可能和实现5个类的设计要求不符,互测时我也拿到过为了满足要求而创建了空类,并没有使用的程序。第二点,由于这一次作业的情况比第一次作业复杂很多,加之其是基于现实的场景的虚拟,导致在处理很多辩解情况时同学们容易有先入为主的理解,而这种理解有可能与指导书的要求不一致,导致程序中出现了很多非技术性的BUG。
第二次作业互测中,我因为没有将eclipse的编码改成UTF-8而被报了一个imcomplete的BUG,除此之外没有出现其他BUG。
第三次作业
度量图:
类图:
第三次作业中,设计的总体思路和第二次作业基本一致 ,只是在更新电梯需要执行的请求队列、判断指令是否被执行以及电梯的运行及输出方面进行较大的改动,而总体运行流程与设计框架依然继承了第二次作业。从度量图中可以看到,由于第三次作业的复杂度大大提高,所以在用于运行电梯及输入的elerun方法、用于更新需要执行的请求队列并判断同质、捎带的updater方法占用的最多的资源。这一点也暴露了在第三次作业中大部分功能的实现都集中于调度类的问题。类图中可以看到,为了满足指导书中的设计要求,所有属性都设置为了private,所以实现了大量的get、set函数。
第三次作业互评中,我没有被找到任何BUG,但是因为readme中包含个人信息而被判定了无效作业,导致自己十几个小时的努力白白浪费了。在这一次悲剧中,我自己确实有一定的责任,没有及时了解到使用win10自带的“生成没有任何可删除信息的副本”在专业pdf阅读器下依然可以看到作业信息。因为本人和周围同学大多用chrome查看pdf文件,而这样的方法确实保证了在chrome下无法查看个人信息,并且周围同学在这三次作业中也几乎都采用的是这种方法,且没有出现任何问题,就默认了这种方法的有效性。同时,又因为“第二次作业开始readme不再要求使用pdf格式”、“在客服群中通知过此种方法不能有效删除个人信息”等重要信息只在OO微信客服群中出现过,而在通知版、指导书中从未提及等综合原因,导致了包括我在内的部分同学的大量努力只得到了无效作业的结果。
寻找BUG方法
第一次作业时,我主要通过根据错误分指树逐个构造数据并测试,再测试一些有关输入的极端情况、特殊情况的方式进行测试。在发现错误输出后,根据构造的数据类型去阅读具体的有关代码,寻找错误的根源。这样的方法缺点在于人工成本较高,需要花费较长时间构造数据并进行测试。从第二次作业开始,我和室友们以及周围同学集思广益,找到了效率更高的方法:在测试完各种错误输入的情况后,进行随机正确输入的对拍,在结果不一致时,就可以确定参与对拍的某一方出现了BUG。在互测时,直接使用对方的程序与自己的程序进行对拍,可以较快的发现对方存在的BUG。尤其是在第三次作业中,由于情况复杂,且每个人的设计完全不同,在不同的情况组合下,有可能会出现独特的BUG。所以在对拍时进行的大量随机输入测试就能较快的发现这样的BUG。发现BUG后再针对性的阅读代码、进行测试,就能找出BUG出现的原因。
心得体会
经过了一个月的面向对象程序设计的学习,我切实感受到了面向对象与面向过程式编程所存在的巨大差距,在程序规模逐步提升时,也体会到了面向对象式编程给程序员所带来的便利。而OO独特的互评机制,更让我提前感受到了步入社会后我们所要面对的是怎样的环境(大概这就是刚踏入社会的大染缸就被淹死了吧)。世界上没有公平可言,只有通过自己的努力来减少自己可能会受到的不公待遇。最后希望同学们在之后的OO作业中都能如有神助,一次AK,同时也希望OO课程的通知机制、统一规定方面能变的越来越好,让助教们、同学们都能少受委屈,少做无用功。