面向对象第一次课程总结
在第一次作业中,我设计了三个类 Parentheses、CurlyBraces、Test。
Parentheses类,存储多项式中的每一项的系数与指数,具有将该项加入最终结果的方法。此类功能简单,规模在20行以内。
CurlyBraces类,主要实现将输入字符串中的一段转换为一段多项式,同时将多项式中每一项调用Parentheses的方法,对最终结果进行操作,实现“加减”,具体规模在90行左右。
Test类作为主类,首先对输入的字符串进行格式审查,将合法字符串中的每一个多项式提取出来,使用CurlyBraces的方法转换为多项式,再进行进一步操作,规模在60行左右。
——第一次作业
图中标红的getPara()方法代码长度有60行,主要是实现将多项式中的各个项提取出来,并将其加入到最终的结果中。在这里,我手搓了一个状态机实现将各项的指数、系数提取出来,导致代码长度过长,但个人认为,这里的逻辑还是较为清晰的。
优点:使用正则表达式直接判断输入字符串是否符合格式,实现较简单。
缺点:
-
由于对java各种常用方法没有了解,在将字符串中的数字提取成数字时,手搓的parseInt,造成代码长度较长;
-
未考虑正则表达式匹配时可能出现的问题,在对输入较长字符串进行格式审查时,有crash的风险;
-
类中的方法没有做到相互独立,加大了维护难度。
在公测时,没有通过压力测试的测试点,程序crash了。
第二次作业分析
在第二&三次作业中,设计了Elevator、ExpHandler、Floor、Request、Requestqueue、Scheduler、Main七个类。
各个类的属性和方法都设计的没有什么逻辑,这里就不具体分析了.QWQ
——第一次作业
——第二次作业
——第三次作业
在第二次作业的代码中,主要还是按照解决问题的步骤一步步的实现功能,没有对各个类应当具有的属性和行为做进一步的思考。这也导致了在第三次作业基于此基础上继续添加功能时,代码逻辑变得极为复杂。在调试时,为了解决一个BUG,代码各个部分都需要缝缝补补,在这个过程中,很可能一时疏忽就产生新的BUG。
反思和总结
在写第一次作业之前,我对面向对象的思想没有什么了解,在编程时还是以实现功能为目的。严格意义上讲,第一次作业我提交的还是面向过程的程序,或者也可以说是java格式的c程序。
在第二次作业中,调度器的功能较为简单,仅仅是按照输入的顺序执行指令,只是简单的写了个for循环遍历一遍请求队列就可以满足需求,代码规模也不算长。在编程时,将解决某些需求的方法提取出来,作为一个独立的方法,如去除字符串空格、检查格式、提取请求等,但由于在编程前没有对具体设计做出详细的规划,各个方法应当放入哪个类中考虑不够周全,导致了各个类之间的逻辑十分混乱,而且还是没有做到数据结构和函数的相对独立。
而在第三次作业中,由于允许捎带,指令执行的顺序就变得复杂起来,我还是傻傻的按照我第二次的写法,没有将判断捎带、输出等各个功能写在独立的方法里,导致调度器类中一个主要的方法代码规模突破200行。在DDL前一天晚上,我发现了自己的一个BUG——当在同一层需要执行几条请求时,输出的顺序可能出现问题。面对冗长的代码,各种if-else if-else,在调试时,我遗忘了其中某个分支中相应语句的修改。最后还一顿令人智熄的操作,把调试过程里,测试用的printf还没有注释掉的程序交上去了.QAQ
互测又被发现了好几个BUG后,我反思了一下,第三次作业调度的逻辑比第二次的复杂许多,再按照我第二次调度器类的一个方法里实现很多个功能的写法来写,就将问题变得更为复杂,也会导致各种奇怪的BUG——
1.不以(FR,1,UP,0)开头时,判断的逻辑有问题;
2.同质请求判断,与电梯同层的指令判断同质时存在BUG;
3.一次开门响应多条请求时,输出的顺序可能不正确。
由于在第二次作业时就对问题抽象程度不够,程序的各个函数又不够独立,在第三次添加功能时,将一种情况的代码改了,另一种情况的代码却忘了改。比如,我将判断指令是否捎带分为电梯上、下行两种情况,而这两种情况又是在调度器类中某200+行的函数中的一部分的功能,而在这个函数中,同时还包括输出等其他的功能。调试时发现一个BUG,在对一种情况的代码进行修改后,还需要同时对另一种情况做出相应的修改,还要注意不要误改了实现其他功能的代码片段,这就极大地加大了调试的难度,还容易引发各种“神奇”的BUG。
DDL之后,实在是看自己的丑陋的代码不爽,就将第三次作业重新写了。重写之后的代码,基本做到了数据结构和函数的相对独立。
——重写后的第三次作业
虽然,还有很多不足之处,但较上一个版本,在程序设计和程序规模方面,都有不错的进步。
-
将实现不同功能的代码段放进不同的方法中
-
基本实现了对数据的保护
不足之处:
-
对捎带与否的判断逻辑能否继续简化,
但它真的有那么多条件啊 -
还是存在某方法功能不够明确、代码巨长,
但个人又感觉没有进一步拆分的必要
心得体会
-
做程序设计前,仔细阅读指导书,多逛各个讨论区,对作业要求有更明确的认识,防止在编程过程中反复修改代码;
-
在开始写代码前,先将程序各个类要实现的功能设计好;
-
一定一定要注意各个函数功能的相对独立,在一个类里某些方法实现的功能太多,调试时可能会付出巨大的代价。
最后祝你,身体健康【雾】,再见