Java大作业总结
Java大作业总结
一.前言
这2次大作业都是前面作业的延续,加了互斥开关和管脚电压的显示电流限制短路检测并联电路中包含并联二极管这些内容难度提升了很多,同时用到的知识点都是前几次大作业用到了的集合,链表的遍历接口等等。
第七次大作业
1.设计与分析
CircuitElement作为整个系统的基石抽象类,其定义的属性和方法构建了设备的通用框架。例如,id属性为每个设备提供了唯一标识符,在设备管理和状态更新过程中起到关键索引作用。update_state抽象方法强制子类实现自身特定的状态更新逻辑,确保了多态性的有效实现。这使得在系统运行时,无论面对何种具体设备,都能通过统一的调用方式触发其对应的状态更新操作,极大地提高了代码的扩展性和可维护性。
Controllable接口为可控设备提供了标准化的控制方法定义。通过实现该接口的applyControl方法,如ToggleSwitch、DiscreteSpeedController等设备能够以统一的方式接收和处理外部控制命令,实现了控制逻辑的一致性和模块化。这种基于接口的设计模式使得新的可控设备能够轻松融入系统,只需遵循接口规范实现applyControl方法即可,符合开闭原则,有效降低了系统的耦合度。 ToggleSwitch类在继承CircuitElement和实现Controllable的基础上,通过active属性表示开关状态。在update_state方法中,简洁地根据开关状态决定输出电压,当active为true时输出等于输入电压,否则为 0,直观地模拟了开关的通断功能。applyControl方法中,通过判断控制命令是否与自身id匹配来切换开关状态,并相应地更新电阻值,体现了良好的封装性,将开关的控制和状态更新逻辑紧密结合在类内部。
IncandescentLightBulb类在update_state方法中对亮度的计算基于电压差与预设参数的关系。通过判断电压差是否小于 10V 来确定亮度是否为 0,对于大于 10V 的情况,使用特定公式(int) (((voltageDiff - 10) * 5) / 7.0) + 50计算亮度,并限制在 0 - 200lux 范围内。
在设备状态更新方面,不同设备的算法紧密结合其物理特性。以CeilingFan为例,其在update_state方法中根据电压差进行多段式转速计算。当电压差小于 80V 时,转速为 0;大于 150V 时,转速达到最大值 360 转 / 分钟;在 80V 到 150V 之间,通过线性插值公式speed = (int) (80 + (voltageDiff - 80) * 280 / 70)计算转速。
对于调速器类,DiscreteSpeedController的update_state方法采用简单的乘法运算outputVoltage = inputVoltage * level * 0.3来根据档位调整输出电压,其中level表示档位,范围为 0 - 3。这种设计直观地体现了分档调速的功能实现方式,通过改变档位系数来控制输出电压,进而影响后续连接设备的工作状态。
在电路连接处理中,DeviceManager类的processConnection_chuanglian和processConnection_binglian方法承担了关键任务。以processConnection_chuanglian为例,首先通过正则表达式\\[[^\\]]+\\]从输入字符串中提取设备连接信息,将其解析为设备编号和引脚组合。然后,根据设备编号在total_devices中查找或创建设备,并建立设备间的连接关系存储在connections和Exclusive_connection等映射中。在创建串联电路chuanglian对象时,将相关设备和连接信息传递给构造函数,确保串联电路能够正确维护内部设备拓扑结构。
在处理并联电路时,processConnection_binglian方法类似地解析输入信息,将串联子电路组合成并联电路binglian对象。通过这种分层的处理方式,系统能够有效地构建和管理复杂的电路网络,从简单设备到串联、并联组合电路,实现了对实际电路结构的全面模拟。
类图
顺序图
2.踩坑心得
(一)电阻值处理
在初始设计中,开关类电阻值设定为特殊值(-1表示开路,0表示短路等),在电路计算时需要特别处理,容易遗漏导致计算错误。尤其是在串联和并联电路电阻计算逻辑中,需频繁判断设备电阻是否为特殊值,增加了代码复杂性和出错风险。例如,在chuanglian类的update_resistance方法中,对互斥开关和串联子电路电阻为-1的情况判断逻辑较为复杂。
(二)设备状态更新顺序
由于设备间存在相互影响(如调速器输出电压影响后续设备输入,灯具亮度影响智能窗帘控制),确定正确的设备状态更新顺序至关重要。在早期版本中,未考虑智能窗帘需在灯具状态更新后获取光照强度进行自身状态更新,导致智能窗帘状态计算错误。后来通过调整DeviceManager的update_state方法中设备更新顺序,先更新产生光照的灯具,再更新智能窗帘,解决了此问题,但这也凸显了在复杂系统中处理设备间依赖关系的难度。
3.改进建议
- 
(一)错误处理与异常机制
当前代码缺乏完善的错误处理机制。在设备创建、连接信息解析和控制命令执行过程中,若出现用户输入错误或非法操作,可能导致程序异常终止。建议添加异常处理代码块,如在
createDevice方法中,若设备类型识别错误,抛出自定义异常并提供清晰的错误提示信息,引导用户修正输入,增强程序的健壮性。(二)性能优化
在大规模电路模拟场景下,频繁的电阻计算和设备状态更新可能导致性能瓶颈。可考虑引入缓存机制,如在串联和并联电路类中缓存已计算的电阻值,当电路结构未发生改变时,直接使用缓存值,减少重复计算。同时,优化设备状态更新算法,避免不必要的计算,例如在设备输入电压未改变时,跳过该设备的更新操作,提高系统整体性能。
(三)代码结构调整
部分方法如
DeviceManager中的update_state和printStatus方法较为冗长,可进行适当拆分。例如,将update_state中串联电路电阻更新、设备输入设置和状态更新等逻辑拆分为多个小方法,提高代码可读性和可维护性。此外,可进一步优化类的职责分配,如将一些与设备连接信息处理相关的方法提取到独立的工具类中,使代码结构更加清晰,遵循单一职责原则,便于后续扩展和维护。 
第八次大作业
1.设计与分析
为了使设备可以被外部命令控制,引入了Controllable接口,它包含了一个名为control的方法。任何实现了此接口的设备都可以接收特定格式的字符串命令,并据此改变自身的状态或配置。这为系统的交互性提供了一种统一的方式。
SeriesCircuit和ParallelCircuit分别模拟了串联和并联电路的行为。它们不仅继承自Device,还额外维护了一个内部的设备列表以及连接关系表。
在total_resistance方法中,这两个类会遍历其内部的所有设备,递归地计算出总的电阻值。对于SeriesCircuit来说,总电阻等于各部分之和;而对于ParallelCircuit,则是各部分倒数之和的倒数。此外,updateVoltage方法负责根据计算得到的总电阻更新每个设备的工作状态,包括电流、电压等参数。
PinandDevice类充当了解析用户输入命令的角色。它首先通过正则表达式分割输入字符串,提取出电路连接信息及控制命令。然后根据这些信息动态创建相应的设备实例,并将它们添加到适当的电路结构中。
对于控制命令,processControlCommand方法会遍历所有实现了Controllable接口的设备,并调用它们的control方法来处理具体的命令。这样就实现了从文本指令到实际操作的转换过程。
为了确保整个电路能够在发生变化后及时反映最新的状态,系统引入了一个全局的更新机制。每当有新的连接建立或控制命令下达时,都会触发一次完整的电路状态刷新。这个过程由Update_circuit_resistance方法主导,它按照从底层向顶层的顺序依次更新每个电路单元的状态,直到最外层的电路完成更新为止。
特别注意的是,在处理多层级嵌套电路时,需要保证更新顺序正确无误,以避免出现循环依赖或者其他逻辑错误。为此,采用了先构建整个电路结构图,再逐层向下传递电压和电流值的方法,从而保证了数据的一致性和准确性。
在多个地方加入了简单的异常检测逻辑,比如当电流超过设定阈值时会在toString方法中返回警告信息。
类图
顺序图
2.踩坑心得
在开发过程中遇到的主要问题之一是如何正确地处理复杂的电路连接逻辑。特别是当涉及到多个层级的嵌套时,比如并联电路内包含多个串联电路的情况。起初尝试直接使用递归函数来解决这个问题,但很快就遇到了性能瓶颈和难以调试的问题。最终采用了一种更为结构化的方法,即先构建整个电路结构图,再逐层向下传递电压和电流值,这样不仅提高了代码的可读性和维护性,也避免了许多潜在的错误。
另一个是确保所有设备都能正确响应控制命令。由于不同类型的设备有不同的控制方式,因此必须精心设计control方法,以保证它能够理解特定格式的字符串命令并据此做出适当的动作。此外,还需要考虑到并发访问的可能性,尤其是在多线程环境中,这要求对共享资源进行适当的同步保护。
3.改进建议
- 优化性能:目前的实现方式对于小型电路来说已经足够高效,但对于大型复杂电路,可能会出现性能下降的情况。可以通过引入缓存机制或者更高效的算法来加速电阻、电压等参数的计算过程。
 - 增强灵活性:当前系统中的设备类型和连接规则都是硬编码在程序中的,如果想要添加新的设备或者修改现有设备的行为,则需要更改源代码。可以考虑将这部分内容外部化,例如通过配置文件或数据库来定义,从而提高系统的灵活性和扩展性。
 - 增加异常处理:虽然部分地方已经有了简单的错误提示(如超过电流限制),但在实际应用中可能还会遇到更多类型的异常情况,如非法命令、硬件故障等。应该进一步完善异常处理机制,确保即使发生意外也不会导致整个系统崩溃。
 
期末总结
在本学期的 Java 课程学习中,我经历了从基础语法入门到复杂大作业的成长过程,收获颇丰,不仅掌握了 Java 编程的核心知识与技能,更在编程思维和问题解决能力上有了质的飞跃。
类与对象的概念是 Java 面向对象编程的核心。我学会了如何定义类,封装属性和方法,通过构造函数初始化对象状态。在继承机制中,子类能够复用父类的属性和方法,并根据自身需求进行扩展或重写,如在图形类的继承体系中,矩形类继承自基础图形类,继承了面积计算的通用方法,并根据自身特点重写了获取边长的方法。多态性则通过方法重写和接口实现,使不同类对象在相同方法调用下呈现出不同的行为,增强了程序的灵活性和扩展性。
从最初的面向过程思维逐步转变为面向对象思维是本学期的重要收获。在解决问题时,不再局限于线性的步骤流程,而是学会从对象的角度去分析问题,将复杂系统分解为相互协作的对象集合,每个对象负责特定的功能,通过对象之间的消息传递和方法调用实现系统的整体功能。这种思维方式的转变使我在面对大型项目时能够更好地进行架构设计和模块划分,提高了代码的可读性、可维护性和可扩展性。
同时,在遇到问题时,学会了运用调试工具进行逐步排查,分析问题出现的原因,并通过查阅文档、搜索网络资源和参考优秀代码示例等方式寻找解决方案。这种自主学习和问题解决能力的培养将对我今后的编程学习和职业发展产生深远的影响。
通过本学期的学习,我对 Java 编程有了更深入的理解和兴趣,但也深知自己还有很多需要学习和提高的地方。在未来,我计划继续深入学习 Java 的高级特性,如多线程编程、网络编程、反射机制等,进一步提升自己的编程能力。





                
            
        
浙公网安备 33010602011771号