第4-6次大作业的回顾与总结
引言
距离上一次大作业的总结已经过去了不少时间,在此期间作为沉淀哥的我,又学习到了不少心得。我们都知道java是一个面向对象的语言,而如何把思维转向到“面向对象”这一句话,或许没有想象中的那么简单。
首先,我们短暂回顾下上一次的题目。三个题目的压轴题都是一个学生试卷判分系统,难度不断递增。从最开始的简单输入判断输出,到后面加入了异常处理,如果没有强大的合理设计,那么就要不断地修修补补。是的,我就是这么修补过来的。加入新的内容之后,往往会和之前的代码不兼容,从而要花费大量时间去修改之前的代码,而修改之前又要花费大量时间去阅读理解之前的代码,这是极度痛苦的过程,也更加让我意识到一个合理的类设计是多么重要。
那么接下来,就是之后4-6次作业,我新的感悟。
对4-6次大作业的认知
第4次大作业
第四次大作业是判题系统的最后一题,难度无疑是比较高的。作为前三次大作业的最终迭代版本,它的代码量比较大。知识点涵盖了类的设计,正则表达式的使用,继承,多态,封装等面向对象语言的基础知识。
第5-6次大作业
5-6次大作业开始了一个新的系统设计,名为电器管理系统。在日常居家,或者办公场所,都有这样的软件去检测各个元件的状态。难度暂时没有太高,但是想要设计一个合理的类,保障日后的设计方便,需要更多的精力。
代码的设计分析
第4次大作业
在前三次的基础上,第四次大作业加入了异常分析,这是十分困难的。为此我学习了try-catch
语句去解决。
这个语句也是十分好用,当程序接收到了一个不符合格式的错误输入时,就会抛出异常,从而被接受,能够大大缩减代码的逻辑。
除此之外,这次大作业还给了我一些别的启发,比如MVC构架的实现。
同时,我咬咬牙,把之前三次作业的逻辑改变了,使用了新学的继承多态架构。之前因为不知道继承的知识点,所以就将题目
以及试卷题目
分成两个类去写。但是当使用了继承之后,不仅使得逻辑更加简洁,而且让后续的修改更加方便了(虽然没有后续了)
接下来给出第四次大作业的类图:
大部分的逻辑与前三次的如出一辙,这里不再赘述。让我们把目光放到Judge类新的内容上。
1.首先,我改变了寻找试卷的逻辑,我认为,默认找不到试卷才是更加符合逻辑的,对于后续的处理也十分方便。
2.其次,改变了寻找学生的逻辑,从由试卷寻找学生,变成了由学生寻找试卷。这样的好处是,如果试卷有多出的,程序抛出的返回值就是null,这样就很容易找到异常,并且及时进行处理。
第5,6次大作业
从第五次大作业开始,就着手编写新的“家庭电路管理系统”,拿到题目之后,老师贴心地附上了后面几次迭代的更改事项,让我们做出更加合理的设计。
思索过后,我决定使用继承的方法来编辑这些电器元件,所有电器都继承一个名为Device
的类,这样做的好处是什么呢:
1.可以将不同的电器元件存入同一个链表,方便多态的操作
2.可以使串并联电路相互兼容,从而组成复杂电路
在后续的迭代中,电路是很复杂的。我引入了串联电路与并联电路,他们同样继承于Device类。串联电路和并联电路都有自己的元件链表,而链表中又可以储存新的电路,这样的设计是合理的,并且有很好的延展性。
3.每个元件都有自己的独特方法,让代码逻辑更加清晰。
对于上述的第三点,我给出了目前设计的几个方法,它们都是Device的方法,但是复写与各个元件中。
1.show方法。
这个方法主要是用于显示各个原件的信息。比如,如果是风扇,那么show出来的就是它的转速;如果是灯泡,show出来的就是它的亮度;如果是开关,show出来的就是它的状态;如果是变速器,show出来的就是它的挡位。
2.calculateVoltage方法。
这个方法用于计算各个元件分到的压,主要是被串联类和并联类进行使用。它会把计算的压值作为属性存入对应元件的属性中,如此一来对应的元件就可以调用自己独特的计算方法进行相应的目标数值计算,十分方便。
3.isWork方法。
这个方法可以判断某部件是否正常工作,目前的题目中,它的作用主要就是判断开关的状态。当串联电路要计算分压前,会先调用isWork进行工作状态的判断,如此一来,便能避免一些错误计算断路之类,规避了很多潜在隐患。
4.calculateDianzu方法。
这个方法是计算各个元器件的电阻的,而电阻是用于计算分压的。如果是普通的元器件,则直接将属性中的电阻值返回;如果是串联类或者并联类,则会通过特定的计算方法去计算总阻值。
5.search方法。
这个方法是用于按名称查找对应元器件使用的,主要是为了改变元器件状态。
以上便是我的Device类设计,我将其开源:
哈哈哈怎么可能全部开源,我只展示关键部分。
接下来就是各个元器件的设计了,每个元器件只需根据题目的要求写出特定的方法即可。得益于继承的好处,元器件的属性基本没有需要添加的。
我想继续使用MCV结构,我将文本处理,数据分析,内容储存都放到了统一的类Agent类中,它会将输入的信息打包储存,并且自动分析数据。
这是各个类之间的关系
从图中不难看出,Device是整个程序的重中之重,它的设计至关重要。
实验的不足与反思
在这三次大作业的学习中,我也能看出很多自己的不足。
1.思维局限:
我居然被一个小小的排序难住了!在第6次大作业中,输出内容是按照开关,变速器,受控设备这样的顺序进行的,但是我的程序是逐层递归,返回的不是这个顺序,于是我就冥思苦想如何让它按照正确的顺序输出。但是通过他人的提醒,我发现其实只需要将输出的内容储存,然后按照字母的顺序排序就可以了。如此简单的逻辑我没有第一时间想到,其实很多时候事情并不复杂,换一个思路,就能看到不一样的世界。
2.递归:
我5-6次大作业使用的是递归思路,串联和并联逐层递归,但是我却难以把控它递归的深度,导致出现了多次死循环,死递归,从而使程序崩溃。所以日后的学习中,要加强对于递归的思维锻炼,这是编程的一个重要的能力。
3.引脚
我冥思苦想,却怎么也想不到引脚以什么方式存入电路时最优解。首先对于前两次作业来说,引脚没有用处,但是未来可能大有用途。但是引脚究竟是让它存储指向电器的信息呢,还是形式上以字符串储存呢,我并没有想清楚。
4.精度
在作业中,我注意到程序返回数据的精度总是无法达到题目标准。这可能因为中间的计算过程中,储存数据的形式不当导致。
总结
对于这一次大作业之旅,我认为是一次对自己新的认知,认识了自己的能力,以及思维的局限。同时也让我认识到了,交流对于软件工程师的作用是有多大。感谢CSDN上的大佬对我的问题进行耐性的答疑解惑,也感谢我的同学们指正出了我的问题。
乘风破浪会有时,直挂云帆济沧海!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~