目录
一、答题判题程序第四次迭代
1、题目分析
2、题目类图
3、题目时序图
4、题目思路
二、家居强电电路模拟程序第一次迭代
1、题目分析
2、题目类图
3、题目时序图
4、题目思路
三、家居强电电路模拟程序第二次迭代
1、题目分析
2、题目类图
3、题目时序图
4、题目思路
四、踩坑心得
五、改进建议
六、总结
一、家居强电电路模拟程序第三次迭代
题目分析:本次题目是家居模拟电路的第三次迭代,在本次迭代当中,新增加了一个互斥开关,同时因为需要考虑电阻的原因,互斥开关接在不同的引脚的时候电阻不同,因此我增加了一个判断位,判断他究竟是哪一个地方作为输出,以此来改变电阻值,并且判断那一条路有电流,同时本次题目增加了串联电路中含有多个并联电路,需要增加一个存储并联电路的数组。
题目类图:
类图分析:首先我定义了一个总的抽象类,然后这个抽象下面一共三个子类,分别是控制电器子类,家居子类和电路子类,这三个子类又同时作为不同部分的父类,比如控制电器子类当中有控制开关子类,分档控制器子类,连续控制器子类,互斥开关子类,家居子类有落地扇,吊扇,日光灯,白炽灯,窗帘,电路当中有串联电路并联电路
题目时序图:
题目思路:首先我在每一个家居里面增加了设置电阻,进入电压和离开电压,因为题目中关于这些电路的逻辑基本上都差不太多,都是一个输入电压然后内部进行处理逻辑然后再将电压输出因此,只需要给定一个输出电压的逻辑即可,我的做法是想遍历一遍输入,然后给每一个输入都创建一个对应的类,然后将类存入到串联电路的数组当中,然后再根据并联电路包含的序号,将对应串联电路存储到里面,在进行电路的基本设置,比如判断电路是否是出于联通的状态,电路的输入电压以及电器的电阻。经过内部的处理,最后调用各自的打印函数。
处理互斥开关部分逻辑代码
二、家居强电电路模拟程序第三次迭代
题目分析:本次题目在上一次题目的基础上难度再一次加大,这一次题目中多了一个仅支持单向电流的电子元件,这一次作业的难度好大,我并没有完全实现本次作业的功能。
类图:
类图分析:类图的总体逻辑和上一次迭代差不多,在此基础上增加了二极管部分,因为二极管的特性只能允许特定方向的电流通过,因此在二极管的电阻部分增加一个判断,判断是不是和接入方向一致。
题目时序图:
题目思路:在类设计上,新增了二极管 erjiguan 类,用于精准控制电流的单向进出在电路连接流程中,首先依据输入信息创建元器件类,并根据引脚顺序为类内引脚编号,遇到互斥开关时单独判断其状态。接着,妥善处理串联包含串联的复杂情况,将所有非并联电路统一整合到主路内。随后,从主干路开始,循环各个支路的状态,准确判断电路启用状态,进而计算电阻,再算出串联干路电流、并联各支路电流以及对应的电压降。最后,通过传递电压,计算电阻与电流乘积并减去接入引脚电压后向下传递,同时从 GND 口反向出发,将与之直接相连的输出引脚电压纠正为 0,最终完成各个元器件状态及参数的计算。
踩坑心得:类设计的复杂:在多次迭代家居强电电路模拟程序时,类的设计随着功能需求的增加变得愈发复杂。就像处理互斥开关,将其整合进已有类看似便捷,实则引发了一系列连锁问题,如额外的判断逻辑使代码可读性变差,后期维护难度直线上升。而且每一次新功能的添加,例如引入二极管,都要小心翼翼地在原有类结构基础上进行扩展,稍有不慎就会破坏整体的逻辑连贯性,导致代码出现难以排查的漏洞。
没有使用递归的思想:起初面对复杂电路计算,总是习惯性地依赖基础逻辑去实现,特别是在递归算法的运用上,虽然发现了电路结构与递归思想的契合点,但因为不想改动先前迭代的代码所以最终还是没有使用递归的方法,所有的代码逻辑基本都是简单的循环遍历原先的数组,如下图:
改进建议:优化类设计架构:在后续项目开发前,先进行更全面、深入的需求分析,根据功能模块合理划分类,遵循高内聚、低耦合的原则。对于类似互斥开关这样具有特殊逻辑的元器件,考虑单独设计一个类来专门处理其复杂行为,避免污染其他类的纯净性。同时,利用设计模式,如工厂模式来创建元器件类,使代码结构更加清晰,易于扩展和维护。比如这几次迭代的电路中可以使用组合模式,将电路中的元件视为文件夹中的文件,将串联电路视为文件夹,然后递归的使用即可
2、在编写具体逻辑的时候可以尝试一下看看有没有符合的算法逻辑,这样子能极大的减轻开发成本和加强开发的效率。
总结:
作为这个学期最后两次大作业,我完成的并不是很好,总的来说,一些本来可以简单一点的类逻辑,我还是用了很复杂的方法来实现。但也收获到了很多东西,比如在第三次迭代的时候,因为我第二次的代码逻辑需要很大程度的修改,所以我干脆重构了代码,用比较器来区分是哪一个类。同时在类设计方面,随着功能增多,类结构愈发臃肿复杂,像互斥开关融入既有类体系后,额外判断逻辑缠绕其中,极大地破坏了代码可读性,让后期维护举步维艰。同时,在算法运用上,起初未能大胆采用递归思想,局限于简单循环遍历数组,错失优化代码结构、提升计算效率的良机。
这两次的大作业我还是学会了很多东西的,比如加深了子类父类的理解,明白了一些java上提供的更加简洁明了的功能,同时还增加了我的开发能力。
总的来说,这个学期java的学习下来,让我充分地体会了面向对象的思想,明白了java的一些基础语法的使用,明白了很多的设计模式,也知道了自己很多方面的不足。