OOP第4-6次作业总结
前言:
这三次作业中第四次作业是对前三次作业答题判题程序的迭代,而从第五次作业开始,则是新的家居强电电路模拟程序题目。就难度而言,第四次作业比第五、六次作业难,第五次作业是家居强电电路模拟程序的开头,所以自然简单,而且第六次作业还减少了两道题目,使得第六次作业更为轻松。因为是家居强电电路模拟,所以正则表达式相比第四次作业而言,是相当简单了,没有加入错误信息导入判断,所以捕获信息方面的正则表达式可以写的十分简单。当然,后面加互斥开关什么的也会开始变得难了。
分析:
<1>
设计与分析:
第四次作业相比第三次作业加入了选择题和填空题,这对答案批改就不能单纯地用matches或者equals来直接匹配整个字符串了。要先判断属于那种题目再拆分答案字符串进行匹配。虽然只是添加了两个题目种类,但是由于第三次作业类的设计并不合理,于是重写,但当时以为想清楚了,实际上脑子里的框架还没有完全搭好就开始写的缘故,导致写的代码比之前写的还要抽象。遗憾的是,做题目的时候,不知道有哪个细节没处理好,找了很久也没找到,有几个测试点始终过不去。
将题目类作为父类,加上前三次题目的通常类题型,三种题型作为题目类的子类。试卷类依赖题目类,答卷类依赖答案类,答案类依赖题目类。运行顺序方面,先通过Splite类中的方法根据每行的输入情况返回不同的值,再根据不同的值调用InPut类中的不同方法把数据存储进入对应的类中并实现各类中的依赖关系完成输入数据处理。再调用Correct类中的方法完成试卷分数判断和答案批改。最后进行输出。
踩坑心得:
1.对选择题和填空题的部分正确未考虑周到。比如一个选择题的正确答案是ACD,答卷答案是AD时肯定是正确的,DA也毫无疑问没错,但我的判断方式是Pattern(标准答案),Matcher(答案)来进行简单判断。所以后面一种DA最后判断会得0分。
2.因为用HashMap时存储时的key值不不是简单的0,1,2之类的,所以多名学生输出时因为HashMap输出的随机性,输出结果也是乱序的。最后也是在输出前面用ArrayList再记录了一遍顺序进行输出。
3.答案批改的方法,是否进入批改的判断仅为题目是否在输入时读取到,这导致被删除的题目也会被计算出答案,而我的答案输出形式判断的是answer是否为0,这使得题目被删除的情况依旧会输出答案。
改进建议:
类之间的依赖关系需要调整,类之间的属性也需要调整。answer类中的question对象删除,加入学号属性,这样存储,输出的时候会更方便。main类中answerpaper的存储方式采用ArrayList。把试卷总分判断和答案批改放入相应的类中。创建一个agent类,里面放入输出和类间依赖关系绑定。
<2>
设计与分析:
第五次作业是家居强电电路模拟的开头,所以难度和第一次作业差不多。只用简单的模拟一条串联电路就好了。但也是因为想不到之后的变换,并且第一次题目给的东西太少,有些条件也不知道是干什么的(对电路电路上设备连接顺序和引脚没有头绪),代码也写的有点乱。
我将受控设备和控制设备和代理类抽象化,对于拥有不同的受控设备的电路将其存储到不同的代理类子类里去,再通过不同的代理类子类的方法对其进行电路运转效果计算。最后便是按条件输出。因为没想到之后的变换,所以关于电路上设备连接顺序的存储只是就简单地在主函数中用链表存储在主函数中。
踩坑心得:
1.区间范围写错。挡位为0-3共4个挡位。所以下意识的写了if(level <4)使得某些测试点没过。
2.审题不清,以为开关也只有一个。所以当时连电路上设备连接顺序都没有写,于是便在主函数中新加一个链表存储电路上设备连接顺序。在进行电路运转效果计算之前再进行电路上开关的判断。
3.写白炽灯的时候因为它的状态只有两种,非常简洁明了,所以写相应的状态计算就想当然地只写了一个if,else,而忽略了有调速器的时候电压也可能变为0。
改进建议:
对类进行重新设计。将电路设备设计为最上面的父类,将受控设备、控制设备和电路设为电路设备的子类。再在三大类中再往下划分电器、控制设备和串联设备。在输入数据处理完毕后,通过agent类把电路顺序串起来,再通过其他类中的开关检查、电阻计算、电压计算、设备状态计算方法进行电路处理。
<3>
设计与分析:
第六次作业增加了出现并联电路的情况,之前第五次作业中老师给的类图设计建议我那时候还完全不能理解,但看到第六次作业的题目之后就理解了,电路类作为电路设备类的子类,是为了存储电路中的元件顺序。于是便按上面的设计进行了电路类修改。但是当时还是没有意识到引脚到底有什么用,所以还是没有把它考虑进去。
这次的设计思路就是将电路设备设计为最上面的父类,将受控设备、控制设备和电路设为电路设备的子类。再在三大类中再往下划分电器、控制设备和串联设备。输入数据读取方面,我采取了分批读取的方式,先把电路顺序完全读取,再把对电路的命令进行读取。然后通过在输入数据处理完毕后,先通过agent类中的conformity方法把电路顺序串起来,再通过agent类中的开关检查、电阻计算、电压计算、设备状态计算方法进行电路处理。最后进行输出。
踩坑心得:
1.数据读取的时候,因为这次的题目新增了并联电路,于是我下意识地认为电路顺序类输入信息不止一行,而没有像电路指令类输入信息考虑只有一行信息输入的情况,循环中读取nextLine的语句没有放在合适的位置,导致代码运行后非零返回。
2.忽略匹配情况。第一种电路顺序类输入信息是读取到下一行,如果下一行匹配,则把下一行存储进去并结束循环;而第二种电路指令类输入信息是读取到下一行,如果下一行匹配,则直接结束循环,并不会把下一行存储进去。当时发现1错误时,简单地把电路指令类输入信息的代码复制粘贴到电路顺序类输入信息中,导致出错。
3.“resistance = 0;”语句在循环中放错位置。当时直接放在“for(int m = 0; m < parallelcircuit.size(); m++)”这个循环的下面,忘记了这个resistance求的是并联电路中的支路上的电阻总和。所以发现后立马把它移到了“for(int n = 0; n < parallelcircuit.get(m).getSeriescircuits().size(); n++)”循环的下面。
改进建议:
将agent类中的方法分散到几个新类中。Light类与Fan类也许不用搞那么多子类,只用Light类与Fan类两个就够用了。将Light类与Fan类中的效果计算方法提取出来抽象成接口,将不同的电器的效果计算方法继承该接口。这样之后写的时候就不用写那么多行代码了,代码相对来说更简单一点,读起来也更方便。
总结:
从答题判题程序到家居电路模拟程序,不仅仅只是几次单纯的作业,它更是我们以后工作后在实际编程中可能遇到的挑战和问题的缩影。对循环的处理,逻辑的准确性都会直接影响到我们代码的成效。而在这几次作业中,我对Java基本的继承、多态等语法的运用更加熟练。我深刻认识到以上几点的重要性,也在一步步中慢慢思考理解类之间的设计究竟怎么样才更好,让我的代码更偏向面向对象。