开学以来oo的三次作业每次都让我有新的体验,学到了很多东西,也发现了很多问题。
第一次作业:初试java、正则匹配、try-catch。
和多数同学一样,多项式相加这一次作业是我第一次接触java语言,也是第一次接触面向对象。我可以说完全没有切换到面向对象的思维模式,只是把c语言里的struct换了个class的名字,所以最大的收获就是熟悉了java的基本语法和eclipse的一些调试功能。有幸我拿到的大佬各个类都分工明确,把工作拆成小模块来执行,确实是比我的思路清晰多了,我才知道原来面向对象得这么写。
多项式相加并不算难,难的是各种输入的限制。在网上各种搜索的时候发现了一个很好用的东西叫“matches”,我很高兴地就把整个输入要求写成了一个长长的正则,再match一下,各种错误都能发现,于是以为万事大吉了。直到截止当天试了一个大数据的输入才发现还有栈溢出这回事,上网查了下是因为匹配的时候递归深度太大了,网上提供了一些解决方案,例如贪婪匹配改非贪婪,不要求捕获组等等,我一一试了下,发现并不能挽救。原来其他同学都是分层匹配括号和里面的内容,爆栈问题得从根源上解决。
我的另外一个问题是指数部分不能识别“-0”,也和正则匹配的写法有关,这次作业让我有了好好学正则的觉悟。
由于分层匹配涉及到“split”分组之类的写法,当时学艺不精的我在短时间内没法改好匹配的内容,为了防止程序崩溃,最后很蠢地加了个输入长度的限制,后来我才知道有try-catch这个用法,到目前看来写上try-catch应该是有益无害的。
第一次作业类图和代码度量:
没错,就是把一个结构体放到了主函数里,完全没有什么分工可言了。我甚至还把Poly类的定义直接嵌套写在了Calculator里面,始终没有跳出面向过程的框。
第二次作业:提前规划。
到写单部电梯调度的时候我大概有了点面向对象的概念,在脑海里大致想了一下各个类该干什么就迫不及待开始敲代码,其结果是写了一大段又统统注释掉,函数的参数写着写着加一个,写着写着又删一个。最后的“成品”虽然有意识地封装了各个类的属性和方法,但功能的分划还是很不协调,主要的执行部分和一些输入判断全放在调度器里,导致这部分的代码又长又混乱。
第二次作业很多同学采用了直接逻辑判断整个输入的方法,而我的思路是完全模拟现实,也就是按时序取出请求进行判断。按理说这样的做法也是可行的,但由于我写之前没有好好规划,判断同质请求和获取电梯状态这两部分的很多小细节出现了时序逻辑的错误,一些极端的情况就会满足不了。我在截止时间之前改掉了一个bug,没想到这一改又导致了另一个bug,公测就被测出不能排除同一时间发出的同层同质请求。
除此之外,由于我按照逻辑时间每次递增0.5s的方式循环处理,遇到最长时间的时候程序超时了,后来加了一句在当前暂时没有任务的时候直接跳到下一条请求的发出时刻,又引起了一些局部的逻辑错误,好在后来修正了。总之,第二次作业给我的教训就是写之前一定要先规划好。
第二次作业类图和代码度量:
第二次作业我还是没有写专门的Main,把主函数放进了调度器的类里,其他类也基本上都是在调度器里实例化,和调度器打交道,输入逻辑之类的也都在调度器里。调度器作为我主要的“过程”而不是一个独立的类,复杂度很高,类之间的分工仍旧很不协调。但至少比起第一次,有了一点类的概念,有了类的划分和合作。
第三次作业:完备测试。
第三次作业是在第二次作业的基础上改的,用新学的继承和重载重写尽量调整了类的功能,把输入逻辑部分移到了调度器外面,但最终结果仍然不尽理想——执行部分还是很冗长,类之间的关系还是不够明晰,这也是我之后需要主要改进的地方,但至少目前没有发现错误情况,也没有因为极端输入导致程序崩溃。
吸取前两次测试不够的教训,我这次主要的重点放在了测试上面。在仔细阅读指导书和暗中观察同学们讨论的基础上,我自己写了很多特殊情况的测试样例,每个样例都不是很长,但是基本概括了所有我能想到的会出问题的情况。这样有针对性的测试帮了我不少忙,找到很多bug,当然互测的时候也找到了同学的一些漏洞。个人感觉测试样例典型并且短一点更有利于调试逻辑上的问题,过长的随机性的样例虽然容易暴露缺陷,但是始终存在碰运气的因素,而且追溯问题的时候会很头大。
第三次作业类图和代码度量:
emmm……第三次呢,加上了主类和继承上次作业的新调度器,各类基本在主函数里实例化,但是从代码度量来看,并没有什么改善。
后两次作业让我有了面向对象的感觉,我知道这种写法的主要优势应该是把所有的操作都模块化,让功能的拓展变得很容易。对于一个类来说,只需要关心交给自己的任务,无需关心整体过程。但是怎么说呢,就是心里清楚是怎么回事但实践的时候总是做不到预期的效果,经常在最开始构建类的时候忽略了一些具体的情况,实际遇到了才发现不得不增加类之间的交互,不知不觉就变成了变量传来传去,不停地这个调用那个,那个又访问这个……我想这跟我缺乏经验应该有很大关系,所以之后在作业的洗礼中应该努力去优化这些问题,争取写出自己满意的程序吧。
多线程来了,清明大概不能浪了。