面向对象程序大作业总结(二)

一 ·前言:本次博客是对第四至第六次大作业的总结。我认为第四次大作业算的上是前三次大作业的完善版本,实在前三次大作业的基础上完成的,第四次大作业新增了多选题和填空题的判题方法,总体难度看似提升很大,但仔细分析下来难度并不大,这是因为在进行填空题的判断上,我们所学尚浅,若是真要算下来,光是匹配字符并不准确,可能要运用到后面所学的知识,但就从目前所学来看,仅仅匹配部分字符串,是比较好操作的,更何况多选题。第五六次大作业则是全新的内容,智能家居模拟电路设计。前两次大作业难度把并不在于代码本身多难写,而在于对类与类之间关系的划分较为困难,当然在老师提供的思路下来做,将电器分门别类,将串联和并联电路也当作电器元件的一部分,问题也就简化许多。在这两次大作业中,集合是一个常用的概念,比如我自己的思路就是在一开始创建一个所有电器元件的存储类,不仅方便后续类的使用,更便于最后的输出。我还写了行为类,在输入时将行为放入这个类中,将这个类传入到后续的连接类中,以便于开关,调速器的状态调节。在设计过程中,我认为我的步骤相对繁琐,一是本来一个步骤能够完成的任务我分多部多余的步骤完成,二是我在类中的数据集合创建过多,在后续的程序中我也会尽可能将类的设计调整地更完善。三是没有做到开闭原则,对于程序来说,或许最好的状态便是实现开闭原则,每一次迭代,我的代码就可能进行大范围的修改,但第六次大作业我已进行调整,后续要修改的内容就是在电器元件的部分进行增加,在输入的部分进行增加,在输出的部分进行增加,在最后进行光照的计算,最后输出所得即可。此次大作业对于正则表达式的运用是必须项,但是由于我还没有掌握正则表达式的高级用法,所以可能会结合之前的split方法和正则表达式进行拆分。最后,这两次大作业难度适中的前提还是得益于输入的限制较多,后续若引入错误输入测试点,难度将会放大很多。
二 ·设计与分析:
以下为第四次大作业简化类图:

在类的设计中,将答卷,试卷,题目分别作为三个大类,判断题,选择题,多选题,填空题作为题目的子类,当然在其中的细节就不过多赘述。输入类和判断类,分别对输入的内容进行处理,将信息分发到后续类中,判题类,则是将得到的答卷信息,题目信息,试卷信息作为元素存储起来,输入类中也有对输入格式的检测方法,一但不符合输入格式,便输出错误信息,后续的答题判题类的写法与之前类似,此处不赘述。
以下为第五次大作业简化类图:

在类的设计中,将开关,调速器,灯,吊扇作为主要电器类,将电路单独成类,电路中有保存电路元件的ArrayList,在写入电路后,便对电路中的元件进行遍历,Do类则是对开关,调速器的行为类,将输入的行为信息进行保存并使用。Connect类则是将电路进行连接,类中包含connectdevice方法,将计算后的结果对每个元件进行赋值得到它们的状态。ListObject类则是存储所有元件的集合类,类中包含所有元件的ArrayList,show类则是输出类,即获取ListObject类中的所有对象并分门别类进行输出操作。
以下为第六次大作业简化类图:

在类的设计中新增串联电路类与并联电路类,和新增的落地扇类,将这三个类看作电器元件类的子类,新建一个主线路类。所以在处理元件时类似于第五次大作业的操作,只不过此次加入各个元件的电阻,包括并联电路的电阻,便于电流的计算。此次依旧是先连接线路,将线路当成元件存储到集合当中,并对其中的开关进行调整。接着遍历线路,选择线路进行并联操作,最后将各个元器件存入主线路中,依次遍历主线路,对每个元件获取其电阻,得到总电阻计算电流,将电流赋值给每个元件使其计算功率。此处要注意的是,并联电路是分压相等,所以在输入电流时最好先将其转化为电压。同样,最后show类对所有元器件进行输出即可(此处不将电路作为元件)。
三 ·踩坑心得:
(1)对于第四次大作业而言,我踩的坑就是在多选题的输入和填空题的判断当中。多选题的输入可以乱序输入,即答案ABC,可以输入BCA也是正确的,这点在于是正确答案还是写入的答案做外循环的问题,原来是正确答案做外循环,这也就导致了如果内循环时某一个选项找不到,这当然是存在错误,但如果个人答案缺少选项,则会将答案误判为正确答案给满分,所以将个人答案做外循环,这不仅可以避免以上情况,还能避免答案乱序输入带来的误判。第二点,填空题的判断,因为之前我也在考虑,若是仅仅匹配字符串,会造成误判的情况,不过在后续审题的过程中,我也看到只有答案与标准答案完全一致才能算全对,其它情况只能算部分正确。这次的题目,我的类与类的关系调用明显分工明确了很多,之前出现过的问题也基本没有出现,但这次出现的问题在于我的代码的复杂程度太高了,循环里嵌套了多个循环,这是我算法的缺陷,比如在判断格式是否正确的时候,我的答卷类甚至进行了3次判断,我是考虑到了部分的格式问题,比如大小写的输入,在#之前还有其它东西输入,第二次正则表达式String regexanswer1="#S:(\d+)\s(.)";我先截取试卷序号,再截取后面的东西,这里是我考虑到它没有输入学号姓名,所以用的".",我认为他若是不输入那就是格式错误,实际上这就是我对正则表达式的错误理解,其实可以单写前面的模板,只提取后面的答题信息即可,采用的是matches,后面答案的判断我采用的是split("#A:"),因为我认为若是没有输入#A则表示后面的信息还是这道题目的答案,但是因为有空答案这个测试点,所以我在split之后用的正则表达式regexans3="\d+-.";这就出现问题了,我用的是matcher而不是matches,这不仅会导致贪婪匹配之间把后面的都当作“."的一部分被匹配,还会导致无法判断符合该格式后面若出现不符合格式的内容,我的程序是不会报错的,虽然它这次没有这种测试点,不过这依旧是一个bug。关于方法复杂度,我这次没能做好,循环多次嵌套,特别是在对题目答案进行判断时,因为要考虑此题是否被删除或是否存在,我特别把题目给拿出来进行判断,没对一张答卷进行解析,就要判断一次题目,其实题目只需要判断一次,但是我的题目判断必须跟着试卷一起,所以被我与试卷一起判断,在判断题目的特性后,我还要进行非特殊情况答案的判断,所以可能是我没有掌握正则表达式的高级用法,导致我需要用这么复杂的办法去判断格式合理性。
(2)对于第五次大作业而言,类的设计我进行了两次,第一次是没有引入线(Line)类的概念,导致我在连接时处理不当,不仅代码冗长,而且不能包含开关状态的判断,第一次进行类的设计,我认为所谓连接就是将前者的输出赋值给后者的输入,这也就导致我其实并没有把一条线上的元件正真连接在一起,导致我电路的连接受到输入顺序的影响,若是开关在元器件后面且没有进行闭合操作,但是元件依然会输出非零值,这也就是我这个问题最大的后果,仅仅赋值无法解决连接的问题,后续在听了老师的讲解之后,法线连接实际上是可以将元件存储到同一条list内,这也方便对开关等调速器的状态判断与调整,在对类的设计进行修改后,不仅内容便于理解,之前出现的问题也不再发生,之后提交的代码也一遍就拿到满分。
(3)对于第六次大作业而言,基于之前类的设计比较合理,这次也只是加入新的内容,这次问题最大的地方,都是在并联电路状态的计算上。第一,数据的精确度问题,在求助其它同学后,写入判断精确度的方法后,问题便解决。第二点,就是并联电路状态的判断,我写的判断方法是检测一条电路上的开关的闭合状态,但是由于我的方法即便在没有闭合的情况下也会导致电路默认闭合,并且代码复杂,我用了flag,和situation两个变量判断,实际上只需要一个,而且两个变量不仅复杂而且在其中一个改变时并不会对另外一个造成影响,也就是说可能就将电路的状态为默认的打开状态,将方法删除并保留一个变量后便通过了测试点。
四 ·改进建议:
首先经过这几次迭代,我认为我需要对第六次大作业进行修改的地方有如下几点:1.对输入格式的修改,可借鉴他人正则表达式用法,尽可能降低判断复杂度。2.提前进行类的设计,好的设计能有效避免后续缝缝补补的过程。3.尽量避免计算过于复杂,使其精度丢失。
五 ·总结:
经过这三次的练习,让我更加熟练的运用类,从一开始“过程化”的思维在慢慢转变为“对象化”的思维,也让我更加理解到类与类之间的调用关系,以及考虑问题的严谨性,我也可以去参考别人更加短小精悍的思路,从而降低代码的复杂度,在做题之前可以先将自己的思路写出,合理规划类,画出类图以便后续类之间关系的调用。不断优化程序的设计,多了解一些高级语法,对正则表达式的使用还不够纯熟,还需要进一步的研究。目前还需要考虑如何在目前的类中加入继承与多态,还需要通过网上资料以及云课堂的进一步学习。我认为这样的大作业组织方式是能正真提升我的编程水平的,并且能让我在学习中有恰到好处的紧迫感。在学习过程中向老师们提问也能有及时的反馈,老师也很热情地帮助我解决问题,总而言之,感觉良好。

posted @   三十一月七  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示