第三阶段两次PTA作业总结

一、前言

PTA作业已经进入第三阶段,第三阶段为"家居强电电路模拟程序-3"和"家居强电电路模拟程序-4"的迭代

这两次的PTA作业第一次为“家居强电电路模拟程序-3” ,他是以前两次家居强电电路模拟程序为基础所扩展的,在"家居强电电路模拟程序-2"的基础上增加了一个新的控制设备,互斥开关,互斥开关设置了限流电阻,12引脚之间默认电阻为5,13引脚之间默认电阻为10,还增加了一个新的受控设备,受控窗帘,受控窗帘的电路符号为S,其最低工作电压为50V,电压达到或超过50V,窗帘即可正常工作,不考虑室外光照强度和室内空间大小等因素,窗帘受室内灯光的光照强度控制,且本次迭代考虑多个并联电路串联在一起的情况;

第二次作业为“家居强电电路模拟程序-4”,在“家居强电电路模拟程序-3”的基础上了管脚电压的显示(在输出每个电器的状态信息后,再依次输出该电器每个管脚的电压)、电流限制(电器在工作时,过大的电流会引起电器过热,从而烧坏电路。本次迭代,每个元器件都有最大电流的设置,当实时电流超过最大电流时,在该电器输出信息的最后加入提示“exceeding current limit error”,与前面的信息之间用英文空格分隔)、短路检测(如果电路出现无穷大的电流造成短路,所有元器件信息不输出,仅输出提示“short circuit error”)、并联电路中包含并联,并增加了二极管元件,其电路特性为:正向导通,反向截止;其电器符号如图4所示,当电流从左至右流过时,二极管导通”conduction”,电阻为0;电流从右至左流动时,二极管截止”cutoff”,电阻无穷大,相当于开关打开。


二、设计与分析

接下来,我将会对这两次的作业进行分析。

1、家居强电电路模拟程序-3

以下是代码的类图
image

这次的代码我重新设计了类结构,所以我重新分析一下类结构

由以上类图可知,定义了一个设备基类 (Device),Device 是一个抽象类,定义了所有设备的基本属性和行为。
它的属性有:
id:设备的唯一标识符。
pins:设备的引脚数组,用于存储每个引脚的电压。
方法:
getOutputVoltage(int pin):获取指定引脚的输出电压。
setInputVoltage(int pin, double voltage):设置指定引脚的输入电压。
updateState(String command):根据命令更新设备状态。
getState():获取设备当前状态。

控制设备类

开关 (Switch):
继承自 Device。
属性:state(开关状态,true 表示开,false 表示关)。
方法:实现 Device 的抽象方法,处理开关状态的切换。
分档调速器 (SteppedSpeedController):
继承自 Device。
属性:currentStep(当前档位),steps(档位对应的输出电压倍数)。
方法:实现 Device 的抽象方法,处理档位的增减。
连续调速器 (ContinuousSpeedController):
继承自 Device。
属性:position(当前位置,范围 [0.00, 1.00])。
方法:实现 Device 的抽象方法,处理位置的设置。
互斥开关 (MutexSwitch)
继承自 Device。
属性:activePin(当前激活的引脚),resistances(引脚间的电阻)。
方法:实现 Device 的抽象方法,处理互斥开关的状态切换。

受控设备类

灯 (Light):
抽象类,继承自 Device。
属性:brightness(亮度)。
方法:定义抽象方法,由具体灯类型实现。
白炽灯 (IncandescentLight):
继承自 Light。
方法:实现 Light 的抽象方法,计算白炽灯的亮度。
日光灯 (FluorescentLight):
继承自 Light。
方法:实现 Light 的抽象方法,计算日光灯的亮度。
风扇 (Fan):
抽象类,继承自 Device。
属性:speed(转速)。
方法:定义抽象方法,由具体风扇类型实现。
吊扇 (CeilingFan):
继承自 Fan。
方法:实现 Fan 的抽象方法,计算吊扇的转速。
落地扇 (FloorFan):
继承自 Fan。
方法:实现 Fan 的抽象方法,计算落地扇的转速。
受控窗帘 (ControlledCurtain):
继承自 Device。
属性:openPercentage(窗帘打开的百分比)。
方法:实现 Device 的抽象方法,计算窗帘的打开百分比。

电路类

串联电路 (SeriesCircuit):
继承自 Device。
属性:devices(串联的设备列表)。
方法:实现 Device 的抽象方法,处理串联电路的电压传递和状态更新。
并联电路 (ParallelCircuit):
继承自 Device。
属性:seriesCircuits(并联的串联电路列表)。
方法:实现 Device 的抽象方法,处理并联电路的电压传递和状态更新。

主类 (Main)
方法:
addDevice(Device device):添加设备。
addCommand(String command):添加命令。
processCommands():处理命令列表,更新设备状态。
simulate():模拟电路运行,输出设备状态。
inputProcess():处理输入。

这次的类结构设计具有模块化,每个设备和电路都有独立的类,便于扩展和维护,可以方便地添加新的设备类型和电路类型。但是处理输入的方法在主类中比较复杂,且未对输入进行充分验证,可能导致运行时错误。

2、家居强电电路模拟程序-4

以下是代码的类图
image

通过类图可以知道,修改了Device、Switch、SeriesCircuit、ParallelCircuit四个类,并增加了二极管(Diode)。

此次迭代增加了管脚电压的显示:在 simulate 方法中,输出每个电器的状态信息后,再依次输出该电器每个管脚的电压,并在 simulate 方法中,计算每个电器的实时电流,如果超过最大电流,则输出“exceeding current limit error”。

增加短路检测:在 calculateCurrent 方法中,如果检测到无穷大的电流,则输出“short circuit error”。

增加并联电路中包含并联:在 ParallelCircuit 和 SeriesCircuit 类中,处理并联电路中包含并联电路的情况。

增加二极管:增加 Diode 类,处理二极管的正向导通和反向截止特性。

以下是经过修改以及增加的类:

抽象类(Device)
作为所有电器设备的基类,提供统一的接口和属性。
属性:
id:设备的唯一标识符。
pins:设备管脚的电压数组。
maxCurrent:设备的最大允许电流。
方法:
getOutputVoltage(int pin):获取指定管脚的输出电压。
setInputVoltage(int pin, double voltage):设置指定管脚的输入电压。
updateState(String command):根据命令更新设备状态。
getState():获取设备当前状态。
getPins():获取设备所有管脚的电压。
getMaxCurrent():获取设备的最大允许电流。

开关 (Switch):
继承自 Device。
属性:state:开关的状态,true 表示开启,false 表示关闭。
方法:
getOutputVoltage(int pin):根据开关状态返回输出电压。
setInputVoltage(int pin, double voltage):设置输入电压。
updateState(String command):根据命令更新开关状态。
getState():返回开关状态。

二极管(Diode):
继承自 Device。
属性:conduction:二极管的导通状态,true 表示导通,false 表示截止。
方法:
getOutputVoltage(int pin):根据导通状态返回输出电压。
setInputVoltage(int pin, double voltage):设置输入电压并更新导通状态。
updateState(String command):不需要更新状态。
getState():返回二极管的导通状态。

串联电路(SeriesCircuit):
继承自 Device。
属性:devices:串联电路中的设备列表。
方法:
getOutputVoltage(int pin):计算并返回串联电路的输出电压。
setInputVoltage(int pin, double voltage):设置串联电路中所有设备的输入电压。
updateState(String command):更新串联电路中所有设备的状态。
getState():返回串联电路中所有设备的状态。

并联电路(ParallelCircuit):
继承自 Device。
属性:seriesCircuits:并联电路中的串联电路列表。
方法:
getOutputVoltage(int pin):计算并返回并联电路的输出电压。
setInputVoltage(int pin, double voltage):设置并联电路中所有串联电路的输入电压。
updateState(String command):更新并联电路中所有串联电路的状态。
getState():返回并联电路中所有串联电路的状态。

整体来看,这个程序比之前的答题判题程序有了明显改进,但是还是不够好,对类结构设计也还只是学到了皮毛,并不能真正满足需求,但每次都进步一点,就会越来越好!


三、踩坑心得

在进行类结构设计与写代码时,我遇到了许多问题,也从中吸取了许多教训。以下是我的一些踩坑心得:

1、抽象类与具体类的边界:在设计抽象类 Device 时,我最初尝试将所有可能的方法和属性都放入抽象类中,导致抽象类变得臃肿,难以维护。

2、多态性与方法实现:在具体类中实现抽象方法时,我最初没有充分考虑多态性的优势,导致一些方法在不同具体类中的实现相似度很高,代码重复。

3、电路类的递归设计:在设计 SeriesCircuit 和 ParallelCircuit 类时,我最初没有考虑到递归包含其他电路的情况,导致在处理复杂电路时逻辑混乱。

4、考虑未来的需求:在设计类结构时,要考虑到未来的需求,为可能的扩展留下空间。例如,我可以为处理不同题型的类留出扩展点,以应对未来的题目变化。

5、不断学习和改进:在设计类结构时,我意识到自己的能力还有很大的提升空间。我需要不断学习,了解更多的设计模式和原则,以便在遇到问题时能够更好地解决问题。


四、改进建议

1、使用抽象类:定义清晰的抽象类,可以让更容易地扩展新的题型或设备。当需要添加新功能时,可以直接创建一个新的子类,而不用修改现有的类。

2、降低耦合度:尽量减少类之间的依赖关系,比如定义一个控制类Control或管理类Agent这样可以更容易地修改和维护代码。

3、代码复用:尽量代码复用,这样可以减少代码冗余,并使代码更加清晰。

4、学习和应用设计模式:这一点很重要,了解并应用设计模式,可以帮助解决常见的设计问题,并提高代码的可维护性可扩展性

5、调试代码:学会使用调试工具,如断点调试、日志输出等,可以帮助更快地找到并修复错误。


五、总结

在本次PTA作业的第三阶段,我们迎来了“家居强电电路模拟程序-3”和“家居强电电路模拟程序-4”的迭代。这两个阶段的项目在类结构设计、功能实现和用户体验方面都有了显著的提升和扩展。

在“家居强电电路模拟程序-3”中,我们重新设计了类结构,引入了设备基类(Device)、控制设备类、受控设备类和电路类。这样的设计使得设备和电路的模块化更加明显,便于扩展和维护。然而,输入处理方法在主类中较为复杂,且未对输入进行充分验证,可能导致运行时错误。

在“家居强电电路模拟程序-4”中,我们对之前的类结构进行了修改和扩展,增加了管脚电压显示、电流限制、短路检测和二极管等新特性。这次迭代使得程序在功能上更加完善。

在整个过程中,我遇到了许多问题,也从中吸取了许多教训。比如,在设计抽象类时,我意识到需要保持其简洁性,避免过于臃肿;在实现多态性时,我学会了如何充分利用抽象类和具体类之间的关系;在设计电路类的递归结构时,我意识到了递归的重要性和处理复杂逻辑的方法;在考虑未来需求时,我学会了为可能的扩展留下空间;在不断学习和改进的过程中,我意识到了设计模式和原则在解决问题和提高代码质量方面的重要性。

总的来说,这几次PTA作业让我对类结构设计有了更深入的理解和实践。虽然还存在很多不足,但我相信随着不断的学习和实践,我会越来越好。

posted @   HULia  阅读(70)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示