BLOG-3
一、前言
在第7次和第8次的大作业,我们完成了家居强电电路模拟程序3和4。经过前面大作业的多次训练,我积累了了宝贵的实践经验,这不仅巩固了我对Java编程语言核心概念的理解,还进一步加深了我对面相对象设计原则的掌握。在完成这两个大作业的过程中,要求我们特别注重类的设计与实现,力求使代码结构清晰、功能模块化且易于维护和扩展。经过多次迭代和改进,我现在对Java的核心知识有了更加深入的认识,并学会了如何有效地进行单元测试以确保程序的稳定性和可靠性。
1.家居强电电路模拟程序3
(1)知识点总结
本题需要使用substring
、split
等来对输入进行分解,然后进行解析。除此之外,本题还使用了TreeMap
来存储各个电器的状态及相关数据。使用TreeMap
能够实现按照键值对存入的设备自动进行排序,这不仅减少了手动排序的工作量,还优化了代码结构。
(2)题量
在本次大作业中,相较于家居强电电路模拟程序2,引入了互斥开关和受控窗帘两个新设备,并增加了线路设计的复杂性,允许存在多个串联的并联电路。尽管这些新增元素使得系统看起来更为复杂,但只要这个大作业的前两次迭代中类的设计合理且灵活,我们可以将串联和并联电路视为独立的电路组件进行处理,这意味着我们不需要对原有的家居强电电路模拟程序2做过多改动即可实现新的功能需求。因此,我认为这次大作业的难度属于中等水平,主要挑战在于如何有效整合新设备和更复杂的电路结构,同时保持代码的清晰性和可维护性。
(3)难度
在本次大作业中,引入了新的输入条件,允许存在多个串联的并联电路。这一变化主要是在家居强电电路模拟程序2的基础上进行逻辑上的修改和功能上的添加。我认为新增的互斥开关是本次迭代的主要挑战。互斥开关的设计需要周全考虑各种可能的工作状态和交互情况,确保其在不同情境下的正确行为。因此,我认为本次大作业的难度属于中等水平。虽然新增的功能带来了额外的复杂性,但通过合理的类设计和对已有逻辑的适当调整,可以有效应对这些挑战。
2.家居强电电路模拟程序4
(1)知识点总结
相比家居强电电路模拟程序2,本次大作业引入了 LinkedHashMap
来存储串联与并联电路中的设备,以便更方便地计算管脚电压。不同于上次作业中统一使用 TreeMap
,这次选择 LinkedHashMap
确保了设备按存入的先后顺序存储,避免了 TreeMap
自动排序带来的顺序问题,从而简化了电压计算逻辑。
(2)题量
在本次大作业中,相较于上一次大作业,我们引入了诸多新元素和功能,包括二极管、管脚电压的显示、电流限制、短路检测,以及更为复杂的并联电路结构(允许并联电路中包含并联)。这些新增内容显著增加了题目的复杂性和工作量。特别是管脚电压的显示功能,由于之前的设计完全没有考虑这一方面,因此需要对原有代码进行大量的修改和扩展,以适应新的需求。此外,测试点的数量也大幅增加,涵盖了更多的情景和边界条件,确保系统的稳定性和准确性。这不仅要求我们对每一个新增功能进行详尽的单元测试,还需要进行全面的集成测试,以验证各个组件之间的协同工作。因此,本次大作业的题量是所有大作业中最大的。因此,我认为此次大作业的题量属于非常大,对我们的编程能力和问题解决能力提出了更高的要求。
(3)难度
相比较与之前的大作业,本次大作业的难度显著增加。本题新增了管脚电压的显示,由于之前完全没有考虑管教电压,导致处理本题的时候需要修改、添加很多东西。可以说这次大作业是所有大作业中最难的一次,想要完成需要花费大量的时间和精力。
二、设计分析
1.家居强电电路模拟程序3
家居强电电路模拟程序3引入了互斥开关和受控窗帘两个新设备,并增加了线路设计的复杂性,允许存在多个串联的并联电路。
1.类图:
2.时序图:
3.source monitor报表:
4.代码分析:
1.窗帘类
本次大作业新定义了一个窗帘类,用于处理题目中的窗帘设备。窗帘类中定义了一些基本方法。
2.互斥开关类
在互斥开关的设计中,我定义了一个抽象父类 MutexSwitch
以及两个具体子类 PinSwitch2
和 PinSwitch3
。这两个子类分别对应引脚2和引脚3,用于实现这两个引脚之间的互斥控制。通过这种继承结构,确保了互斥逻辑的统一管理和复用,同时为每个引脚提供了特定的行为实现。
3.并联电路集类
为了处理电路中多个并联电路的情况,我设计了一个 SeriesCircuitsMap
类,专门用于存储和管理这些并联电路。这个类能够有效地组织并联电路的结构,确保每个并联电路的数据清晰、易于访问和管理。
4.解析输入类
在解析输入的 ParallelCircuitsMap
函数中,我添加了识别并联电路的逻辑。该函数首先将识别出的并联电路存入并联电路集合,接着将每个并联电路中的串联电路存入预先定义的串联电路集合。最后,将串联电路中的电器设备存入设备库,实现了从并联电路到串联电路再到电器设备的层层解析和存储。这种结构化的方法确保了电路数据的有序处理和高效管理。
在 parseFinal
函数中,我新增了对窗帘和互斥开关的处理逻辑。对于互斥开关,通过检查设备的引脚编号(2 或 3),动态确定实例化 PinSwitch2
或 PinSwitch3
子类。这种设计确保了根据具体的引脚配置正确初始化相应的互斥开关对象,实现了灵活且准确的设备管理。
5.输出类
在 Judge
函数中,我新增了对多个并联电路的解析与处理逻辑。此前,代码仅处理单个并联电路中的串联电路。并联电路的处理方式与串联电路类似,确保了代码的一致性和可维护性。
在 PrintResult
函数中,我新增了对窗帘类和互斥开关类的输出处理。对于互斥开关,通过判断其两个子类 PinSwitch2
和 PinSwitch3
,并使用标志 HId
来跟踪当前闭合的引脚。每次处理互斥开关时,都会更新 HId
为当前设备的编号,从而确保正确反映哪个引脚处于闭合状态。
else if(devices instanceof PinSwitch2){
if(Double.isInfinite(devices.getResistance()))
{
System.out.println("@H"+devices.getId()+":turned on");
}
else {
System.out.println("@H"+devices.getId()+":closed");
}
HId=devices.getId();
}
else if(devices instanceof PinSwitch3&&HId!=devices.getId()){
if(Double.isInfinite(devices.getResistance()))
{
System.out.println("@H"+devices.getId()+":closed");
}
else {
System.out.println("@H"+devices.getId()+":turned on");
}
HId=devices.getId();
}
6.其他
本次代码优化基于上一次博客中提出的问题,主要改进如下:
- 设备类抽象化:将
Device
类设为抽象类,并定义了一个抽象方法calculateVoltage()
。每个具体的设备类(如灯具、风扇等)都实现了该方法,以提供特定的电压计算逻辑。 - 灯具抽象父类:定义了抽象父类
Light
,包含一个抽象方法changeBrightness()
。具体子类IncandescentLight
(白炽灯)和FluorescentLight
(日光灯)分别实现了亮度调整的具体逻辑。 - 风扇抽象父类:定义了抽象父类
Fan
,包含一个抽象方法calculateSpeed()
。具体子类CeilingFan
(吊扇)和FloorFan
(落地扇)分别实现了转速计算的具体逻辑。
通过这种抽象层次的设计,代码结构更加清晰,增强了可扩展性和复用性。
2.家居强电电路模拟程序4
家居强电电路模拟程序4引入了诸多新元素和功能,包括二极管、管脚电压的显示、电流限制、短路检测,以及更为复杂的并联电路结构(允许并联电路中包含并联),这些新增内容显著增加了题目的复杂性和工作量。
1.类图:
2.时序图:
3.source monitor报表:
4.代码分析:
1.二极管类
本次大作业新增了一个 Diode
类,专门用于处理二极管设备。该类通过检测引脚的电流方向来判断二极管是处于导通状态还是截止状态。
2.设备类
本次大作业中,设备类新增了两个关键属性:current
(电流)和 pinVoltage
(引脚电压)。由于本题引入了电流限制和短路检测的要求,原有的仅基于电压的计算已不足以满足需求。因此,我增加了 current
属性以支持电流的计算,并引入了 pinVoltage
属性来计算设备两个引脚之间的电压差。
3.解析类
在解析类中,我新增了二极管的识别功能,专门用于处理二极管设备,并增加了引脚识别和存储的操作,以便准确计算管脚电压。
4.输出类
在输出类中,我新增了每个设备电流的计算功能,并在 PrintResult
函数中加入了以下判断逻辑:
- 电流超限警告:通过判断电流是否超出预设限制,决定是否输出警告信息。
- 短路检测:通过检查电流是否为无穷大,来判断电路是否发生短路。
三、踩坑心得
-
在最初设计互斥开关时,我仅创建了一个
MutexSwitch
类来处理所有引脚的状态。这种设计不够灵活,导致在处理多个引脚的互斥逻辑时非常复杂,容易出现逻辑错误,进而引发设备状态不一致的问题。为了解决这一问题,我将互斥开关拆分为两个具体的子类:
PinSwitch2
和PinSwitch3
,分别对应引脚2和引脚3。通过这种方式,每个子类可以独立处理其对应的引脚状态,简化了互斥逻辑的实现。这种继承结构不仅提高了代码的可读性和维护性,还确保了互斥开关在不同引脚之间的行为更加一致和可靠。通过引入子类,互斥开关的处理变得更加直观和简便,避免了复杂的条件判断和状态管理,显著提升了系统的稳定性和灵活性。
-
在处理并联电路时,最初我使用了
TreeMap
来存储电路设备。然而,TreeMap
的自动排序特性导致设备的顺序不符合预期,影响了电压和电流的计算准确性。为了解决这一问题,我尝试改用HashMap
,期望能按设备存入的先后顺序进行存储。但很快我发现,HashMap
并不保证插入顺序,尤其是在输出数据时,它会按字符顺序排序,这仍然无法满足需求。最终,我选择了
LinkedHashMap
,因为它不仅保持了插入顺序,还能提供与HashMap
类似的高效性能。通过这一调整,确保了并联电路中设备的顺序正确无误,从而解决了电压和电流计算中的顺序问题。选择合适的数据结构至关重要,不同的数据结构适用于不同的场景。 -
在引入电流限制和短路检测后,原有的电压计算逻辑不再适用,导致部分设备的电流计算不准确,甚至出现无穷大值。新增了
current
和pinVoltage
属性,确保每个设备都能正确计算其电流和引脚电压。 -
在之前的开发过程中,由于完全没有考虑到引脚电压的处理,导致在最后一次大作业中引入管脚电压计算时,需要对原有代码进行大量的修改和扩展。这一变化不仅增加了工作量,还耗费了大量时间来确保新功能的正确实现。
四、改进建议
1.家居强电电路模拟程序3
- 在互斥开关的设计中,虽然通过引入
PinSwitch2
和PinSwitch3
子类解决了引脚状态管理的问题,但整体类设计仍然可以更加灵活和模块化。可以将互斥开关的公共行为提取到一个接口或抽象类中,这样可以提高代码的可扩展性和复用性。
2.家居强电电路模拟程序4
- 使用
TreeMap
来存储电器设备,虽然自动排序有助于某些场景,但在处理并联电路时,顺序问题导致了不必要的复杂性。统一使用LinkedHashMap
:在所有需要存储设备的地方统一使用LinkedHashMap
,确保设备按存入的先后顺序存储。如果需要排序输出,可以在最后阶段进行显式排序,而不是依赖于数据结构的特性。 - 由于之前的设计完全没有考虑到引脚电压的处理,导致在最后一次大作业中引入管脚电压计算时,需要对原有代码进行大量的修改和扩展。在项目初期,应该充分考虑所有可能的功能需求,尤其是那些看似不重要的细节。提前规划好这些需求,可以大大减少后期的返工量,提升开发效率。
五、总结
通过这几次大作业,在完成家居强电电路模拟程序3和4的过程中,我经历了从简单电路到复杂电路的逐步演进,学会了如何应对不断变化的需求和技术挑战。
在家居强电电路模拟程序3中,我引入了互斥开关和受控窗帘两个新设备,并增加了线路设计的复杂性。最初,我尝试使用单一的 MutexSwitch
类来处理所有引脚的状态,但很快发现这种设计不够灵活,导致在处理多个引脚的互斥逻辑时非常复杂,容易出现逻辑错误。为了解决这一问题,我将互斥开关拆分为 PinSwitch2
和 PinSwitch3
两个具体的子类,分别对应引脚2和引脚3。通过这种方式,每个子类可以独立处理其对应的引脚状态,简化了互斥逻辑的实现。这种继承结构不仅提高了代码的可读性和维护性,还确保了互斥开关在不同引脚之间的行为更加一致和可靠。
在处理并联电路时,我最初使用了 TreeMap
来存储电路设备。然而,TreeMap
的自动排序特性导致设备的顺序不符合预期,影响了电压和电流的计算准确性。为了解决这一问题,我尝试改用 HashMap
,期望能按设备存入的先后顺序进行存储。但很快我发现,HashMap
并不保证插入顺序,尤其是在输出数据时,它会按字符顺序排序,这仍然无法满足需求。最终,我选择了 LinkedHashMap
,因为它不仅保持了插入顺序,还能提供与 HashMap
类似的高效性能。通过这一调整,确保了并联电路中设备的顺序正确无误,从而解决了电压和电流计算中的顺序问题。这次经历让我明白了选择合适的数据结构至关重要,不同的数据结构适用于不同的场景,合理选择可以避免不必要的复杂性和错误。
在家居强电电路模拟程序4中,我遇到了更大的挑战。新增的二极管、管脚电压显示、电流限制和短路检测等功能显著增加了题目的复杂性和工作量。特别是管脚电压的显示功能,由于之前的设计完全没有考虑这一方面,因此需要对原有代码进行大量的修改和扩展。这一变化不仅增加了工作量,还耗费了大量时间来确保新功能的正确实现。为了应对这些问题,我在设备类中新增了 current
和 pinVoltage
属性,确保每个设备都能正确计算其电流和引脚电压。同时,我重新设计了电压和电流的计算流程,确保在处理串联和并联电路时能够正确传递和分配电流。特别地,对于二极管等非线性元件,引入了方向判断逻辑,确保其导通或截止状态的准确性。这次经历让我意识到,前期的需求分析和设计规划至关重要。如果能在项目初期充分考虑到所有可能的功能需求,尤其是那些看似不重要的细节,可以大大减少后期的返工量,提升开发效率。
未来的学习和改进措施方面,我将继续注重类设计和模块化的应用,确保代码结构清晰、功能模块化且易于维护和扩展。同时,我会更加重视前期的需求分析和设计规划,提前考虑所有可能的功能需求,避免后期大规模的返工。此外,我将进一步学习和掌握更多的设计模式,如状态模式、工厂模式等,以提高代码的灵活性和可扩展性。最后,我将继续加强测试能力,确保每次迭代都能顺利进行,避免不必要的调试时间。
六、学期总结
这个学期的Java课程已经结束,通过这段时间的学习,我对Java编程语言的基础知识和面向对象编程的思想有了更深入的理解。在完成八次大作业的过程中,我从最初的迷茫逐渐成长为能够熟练应用OOP原则的开发者。
课程初期,面对面向对象编程这一全新的概念,我感到非常陌生,导致最开始写大作业时无从下手。类的设计不合理,代码难以维护和扩展,导致我写答题判题程序4时几乎等于重写了整个题目。这种经历让我深刻意识到,良好的类设计是项目成功的关键。
随着课程的推进,我逐渐掌握了OOP的核心原则,如封装、继承和多态,并开始将这些原则应用到实际项目中。特别是在家居强电电路模拟程序的开发过程中,我吸取了之前的教训,认真合理地设计了类结构。通过定义抽象类、接口以及具体的子类,我确保了代码的模块化和可扩展性。这种设计思路使得我在完成前三次家居强电电路模拟程序大作业时得心应手,开发效率大大提高。
然而,第四次家居强电电路模拟程序的开发仍然给我带来了不小的挑战。这次大作业引入了二极管、管脚电压显示、电流限制和短路检测等新功能,显著增加了题目的复杂性和工作量。尽管我没有达到预期的效果,但通过这次经历,我学到了如何应对复杂的需求变化,如何在有限的时间内做出合理的权衡和优化。
总的来说,这个学期的Java课程不仅让我掌握了编程技能,还教会了我如何设计合理的类结构、选择合适的数据结构以及进行有效的测试。虽然有时候写大作业的过程让人感到痛苦,但正是这些挑战让我不断成长。未来,我会继续巩固所学的知识,进一步提升自己的编程能力。
标签:引脚,BLOG,互斥,电路,并联,模拟程序,强电 From: https://www.cnblogs.com/L1F7/p/18636638