OO第二次blog作业

前言

这三次的作业可以分为两个阶段,前一个阶段是上三次作业“答题判题程序”的进一步迭代,而后一部分则是另一道题目“家居强电电路模拟程序”。

从结果来看,电路模拟程序的完成不尽人意,尤其是第二次迭代的电路模拟,由于这次没有了测试点的提示,导致程序在提交出现错误后不知从何处下手进行修改。这也是个惨痛的教训,在真正的现实情况下,肯定是不会有测试点提示的。日后要争取在设计阶段进行优化,提前考虑好可能出现的各种情况,弥补这次的失误。

后续将对近三次作业进行一些具体的分析。

三次作业分析

第一次作业

第一次作业是对上次答题判题程序的进一步迭代。在此次迭代中,题目加入了多选题和填空题的类型,并且输入顺序方面也进行了改动。只要是正确类型的数据便可以任意顺序输入。除此之外还引入了多张试卷的情况,按照学生学号和试卷号对输出进行排序。

23201829OO第二次blog作业-小白菜博客
由于引入了两种新的题目类型,采用继承的方法来定义三种不同的题目类。

Stone类作为题库,其中存储一个链表,包含所有输入题目的信息。后续删除的行为也是对此处进行操作。

Respond类、Paper类和Student类分别用于存储答卷、试卷和学生信息。

GetMassage类用于对输入的信息进行判别、处理以及相应的存储。

Judge类作为代理类,用于对学生的答卷进行判断并输出相应的数据。

SourceMonitor分析结果如下
![image]image

由于在是上一次的代码上进行了改进,在修正了一些错误的同时也延续了代码的一些问题,比如采用多重分支语句等,导致代码的深度和复杂度仍旧居高不下。

第二次作业

第二次作业出现了新的题型——“家居强电电路模拟程序”,这次的题型模拟包括了三种控制设备和三种受控设备。
由于是第一次迭代,模拟情况仅包含了单条串联电路。

23201829OO第二次blog作业-小白菜博客
定义了两个父类控制类和用电器类,三种控制设备类受控设备类分别继承自这两个父类。

还定义了一个Ponit类啊作为代理类,用于输入信息、对输入信息进行处理和输出信息。

SourceMonitor分析结果如下
image

从图中可以看出,代码的深度和平均复杂度较低,但最大复杂度过高,这是由于在Point类中当处理输入信息时使用了多重分支语句和多重循环所导致的。

第三次作业

第三次作业是前一次作业的迭代,在这次作业中,加入了并联电路的情况和一种新的用电器落地扇。
这次作业的难度无疑是又上了一个台阶,不仅仅是设计的难度提高了,而且没有给出测试点也是给我们出了一个难题。

image

由于上一次的代码难以对并联电路的输入进行处理,因此本次迭代对代码进行了重构。

相较于上次代码,本次代码构建了Skewer类和Combine类分别为串联电路类和并联电路类。

此次代码还构建了一个最高级父类Machine类,并联电路类、控制类和用电器类都继承自这个类。Machine类的构建使得我能够在定义串联电路类时使用一个链表来存储信息。

SourceMonitor分析结果如下
image

从图中可以看出,经过本次代码的重构,代码的复杂度有了显著的下降,这主要是由于定义了串联电路类与并联电路类的原因。并且Machine类的使用使得在串联电路中对数据的调用和计算复杂度更低。

下面进行对三次作业的历程进行一些详细的描述与心得分享。

历程

第一次作业

23201829OO第二次blog作业-小白菜博客
这是在本次代码修改后的第一次提交,本次提交修改了信息的输入和处理,实现了信息的乱序输入,但对于多份答卷的问题还未得到解决。同时本份代码也存在其他问题,会使得出现分零返回的情况。

23201829OO第二次blog作业-小白菜博客
此次修改更正了信息的调用部分,解决了数组越界所引起的非零返回问题。但是对于多张试卷的问问题仍未得到解决。

23201829OO第二次blog作业-小白菜博客
在试卷类中加入了用于处理多张试卷的属性后,多张试卷的问题得到了解决,但仍有少数测试点存在问题。但在后续修改了某些会出现问题的情况后也得到了解决。

第二次作业

image

这是本次代码的首次提交情况,由于但由于分档调节器的部分问题导致有些测试点出现错误,在修正后便解决。

image

在与同学的交流中,我得知了最后三个测试点的情况是在用电器的两端都有一个开关,但由于我本次代码的设计问题,它只能处理一个控制元件和一个用电器的情况,所以导致没有通过这三个测试点。这个问题直到下一次大作业中才得到解决。

第三次作业

23201829OO第二次blog作业-小白菜博客
在我看来这次作业相较于上次的难度提高了不少,在首次提交时我只拿到了三分,并且还出现了非零返回的情况。在对代码的检查后发现时在对串联电路信息进行存储后在调用时没有及时更新导致调用的数据错误或是不存在在导致的。

在对信息输入进行了少许的修改后,又多过了几个测试点,并且也解决了非零返回的问题。

对计算设备数据时如何调用串联电路数据库中的数据部分进行修改,又正确了一部分,但由于没有测试点的提示,导致不知道下一步应该对何处进行优化。

总结

在设计方面还需具有前瞻性,要考虑到对后续功能添加的情况,否则每次对代码进行迭代时都需要进大量的重构,耗费大量的时间不说,还可能会出现很多bug。
此外,最后一次作业没有给出测试点,因此导致自己不知从何处进行下一步的优化。然而在现实案例中,是不可能像这样给出一个个测试点的。因此,自身寻找错误的能力也需要加强。