OO第一次总结

OO第一次博客--前三次做业分析:java

第一次做业:正则表达式

第一次做业的要求是实现有必定鲁棒性的多项式加减法。对于大多数刚开始接触JAVA语言和OO思想的同窗来讲,此次的难点主要是:JAVA语法、面向对象思想、正则表达式的使用和程序的鲁棒性。相比觉得的语言,我没法理解“面向对象”这个词的含义。在膜拜已经对java有所理解并上过面向对象先导课的大佬们的代码后,我才稍微对“面向对象”的写法有所理解。虽然听起来很不现实,但在了解了一个语言的基础语法后,参观和学习大佬们的代码彷佛是快速上手的好方法(这彷佛与课程要求相违背但对于学习确实有所帮助)。在听学姐讲解后,有据说正则表达式是一个便利的工具,便利用之。对于程序的正确性以及如何保证不crash,除了本身多加try来注意,还须要大量的测试验证了。毕竟本身测得不够全面,就只能指望别人也不帮你测。。。编程

在设计上,我采用了一个Poly类型的数组Polylist来存放各个合法多项式,在首项前加“+”,再利用找操做符号来分割各项进行操做。这是一种常见的操做,效率算不得很高,但好在不至于超时并且很便于理解。数组

如下是其类图及其度量分析数据结构

从度量分析中看出的是Match方法被标红;该方法是本次做业中个人主方法。。。函数

(附:McCabe Cyclomatic Complexity(圈复杂度)用来衡量一个模块的复杂程度,统计一个函数有多少个分支(if,while,for),没有的话复杂度为一,每增长一个分支复杂度加一。圈复杂度的做者McCabe认为,圈复杂度在3~7为比较好的结构化方法,圈复杂度大说明程序代码可能质量低且难于测试和维护。Nested Block Depth(块嵌套深度)则为嵌套深度。这两块出现超标,每每说明程序设计有缺陷,或部分代码嵌套深,难以判断逻辑,或直接写成了面向过程的思想。)工具

做为一个菜鸡的第一个java程序(除了HelloWorld),我代码中的问题不少:学习

首先是对java语言的不熟练致使到处像C,也直接致使了一个函数到结尾(就像main)。另外由于初学面向对象编程,致使代码中对于对象的重视不够,更多则是在面向过程。。。测试

而本身被爆出的bug中也体现了本身对代码的理解不深入:被人爆数组(公测一样在爆但侥幸逃过一劫),对方刻意构造大型错误输入,瞄准我在错误输入处理时想固然的随意开了一个小数组来储存结果,被爆两组数据。这也让我在以后的两次做业中debug和找bug时对于代码中的数字更加剧视。spa

 

第二次做业:

傻瓜电梯的设计与验证。傻瓜电梯的难点,应是对电梯的设计上,即如何实现电梯、分别给五个或者更多的类什么功能、各个类之间如何串联等问题上。我采用了dipatcher类对操做进行处理;而电梯类elevatorfloor分别存储电梯在该指令执行完成先后的时间、楼层、运动状态,并给调度器计算指令完成时间。指令demand负责读入,在work函数进行输入筛选处理后将可执行的传进指令队列,再从头开始逐条传入dipatcher取出处理。

此次的做业相比第一次做业,面向对象的思想体现的就明显多了;指导书中对于多个类的提示也在把咱们从面向过程的误区往出拉。

如下是其类图及其度量分析:

 

 

从类图中能看出demand类几乎是没有起到任何做用,由于只是在work函数对输入进行暂存,进行筛选以后直接就传给queue了。。。甚至没有均可以。。。这带来的问题也十分明显:queue类过于庞大了,在第三次做业中更会有所体现,这又致使了个人数据结构复杂冗余,本来demand中应该实现的分类只能在queue中狂开数组来分类保存。。。在调度时也麻烦的一逼。。。

好在做为第二次做业,相比上一次的青涩少年我也是有了第一次经验了。。。在数据处理上稍微严谨了一些,不幸地是,此次我被爆出的问题比上次还要多:

  1. 对分支结构的处理太过傻逼。在处理错误输入时,由于经验不足,面对诸多错误状况自乱了阵脚。。。一大堆的if,break,flag自增在公测的几个小数据面前就开始瞎几把输出(对错误判断后的处理太混乱),好在为第三次提供了宝贵的参考。
  2. 采用了奇怪的计数和循环:do-while和一个从0开始的count,判断条件里的是[count-1]元素。。。有一个事先考虑大条致使了只有一个RUN的时候数组越界(count-1<0)。。。
  3. 对指导书的理解不深入:指导书中对于“第一条指令时间不为0crash处理”的描述,被我简单的理解成了直接报错结束进程。。。结果挂了两组公测数据。。。也是参考。。。

度量分析中红色的是新加入的度量类,几乎是代码中的核心处理部分,说明了我对于指令的处理仍是应当有所精简。

 

第三次做业:

学长口中的第一个“很差写”:ALS电梯。

此次电梯的最大改动为容许捎带,这就出现了主指令和最多两条捎带指令(即若存在捎带,能找到一条最早捎带的指令,以及可能会找到一条和它仅指令标识符不一样的指令一块儿被捎带)。所以排在后面的指令有可能被先完成,不能单纯只从从队列头开始向后一次遍历。将全部指令按楼层进行储存。再使用了一个指令队列,规定头指令为主指令,再每变更一层后判断同质,向后找最优捎带指令,执行后将其标记,再也不执行。当全部比主指令先执行完的捎带指令所有完成,执行主指令并从队列删除,将新的主指令置顶。循环下去至队列为空。然而在完成代码的时候,仍是被炸出了一些奇怪的bug(主指令为同质指令时没有将其筛除,说到底仍是判断逻辑不够完备)。此外,要求使用对于咱们菜鸟来讲新学习的继承、接口、重写。。。(然而惭愧的是本身代码中几乎没有对这些的体现。。。接口无用,继承基本全是重写。。。)

做为单线程第二次电梯做业,她已经向现实中的电梯有所靠拢。。。同时对于咱们第一次的电梯要求更高了(得先调好第一次才能避免第二次出现上一次的bug)。遗憾的是仍是出现了问题(上面已提到)。。。

如下是其类图及其度量分析:

 

 

度量中体现的仍是老生常谈的问题:depatcher的庞大。而致使这些的缘由之一是对数据结构的组建太混乱(第二次中的queue在本次中不减反增)。。。

好在debug方面总算把第二次的问题解决了,但是测试数据太弱仍是没能发现一些特殊的问题,好比提到的主指令为同质。。。以上这些缘由这也致使了我后来de了很久也没de完。。。

 

至于心得体会,从一个菜鸡的角度来看有如下几点吧。。。

  1. 基本语法得学明白。。。Java做为新的工具,欲善其事不利其器是绝对不行的。。。否则就会出现像我同样申明数组却没有没有挨个实例化的de了很久bug的傻叉行为。。。
  2. 打出提早量;周二晚上写确定写不完,除非你通宵。。。
  3. 多向大佬们学习;这很重要,菜鸡闭门一个月造的车也不必定跑的过大佬三天写的sports car。。。毕竟一个月的学习和大佬几年的积累仍是没得比,面对人家的丰富经验,咱们仍是要多学习。。。(遗憾的是不少大佬并不肯意分享代码)因此咱们要多接受大佬的点拨和教育,这是咱们尽快走向熟练甚至成熟的不二之法。
相关文章
相关标签/搜索