一、前言
题目集7中只包含了一道题目,题目量较少。题目要求在题目集6中的题目的基础下进行迭代,要求对互斥开关设置限流电阻,不同的引脚之间分别设置不同的默认电阻值。同时增加模拟受控窗帘;在输入并联电路信息时考虑多个并联电路串联在一起及一条串联电路中包含其他串联电路的情况。输出信息中添加互斥开关和受控窗帘的设备状态和参数。我认为该题难度偏大,因为尽管该题的要求是在之前的题目上进行迭代,但是随着电路图的内容与设备的增加,需要考虑到的条件也变得更多。这不仅要求对物理方面的知识要理解的更深刻,还进一步考验对编程技术的掌握。
题目集8中也只有一道题目,题目量较少。题目要求是对题目集7中的内容进行迭代,要求在设备中添加二极管模拟项。输出模拟中,添加电流限制、短路限制等情况,同时增加管脚电压的显示。我认为本题偏难,因为本题在电路图的迭代中,添加了大量的元件与线路,同时增加了二极管设备,这使得整个电路变得更加复杂,从而导致代码在编写的过程中有更多可能无法考虑到的地方。电路的复杂程度也决定了代码在编写过程中的容错率。
二、设计与分析
1.题目集7 7-1 家居强电电路模拟程序-3
本题的类设计图如下:
其中各个类的功能如下:
1.Device
功能: 作为所有设备的基类,定义了所有设备共有的属性和方法。
属性:
id: 设备的唯一标识符。
方法:
getStatus(): 返回设备的状态描述。
2.ControlDevice
功能: 继承自 Device,定义了可以控制的设备的通用行为。
方法:
adjust(command: String): 接受一个控制命令来调整设备的状态。
3.ControlledDevice
功能: 继承自 Device,定义了受控设备的通用行为。
方法:
updateState(voltage: double): 更新设备的状态,根据输入电压调整设备的行为。
4.Switch
功能: 继承自 ControlDevice,表示一个开关设备。
属性:
isClosed: 表示开关是否闭合。
方法:
getStatus(): 返回开关的状态。
adjust(command: String): 调整开关的状态。
5.FixedSpeedController
功能: 继承自 ControlDevice,表示一个固定速度控制器。
属性:
level: 当前控制器的输出电压级别。
VOLTAGE_RATIOS: 不同级别的电压比例数组。
方法:
getStatus(): 返回当前输出电压级别。
adjust(command: String): 调整输出电压级别。
getOutputVoltage(inputVoltage: double): 根据输入电压和电压比例数组计算输出电压。
6.VariableSpeedController
功能: 继承自 ControlDevice,表示一个可变速度控制器。
属性:
level: 当前控制器的输出电压级别。
方法:
getStatus(): 返回当前输出电压级别。
adjust(command: String): 调整输出电压级别。
getOutputVoltage(inputVoltage: double): 根据输入电压和控制器级别计算输出电压。
7.IncandescentLamp
功能: 继承自 ControlledDevice,表示一个白炽灯。
属性:
brightness: 灯的亮度。
方法:
getStatus(): 返回灯的亮度状态。
updateState(voltage: double): 根据输入电压更新灯的亮度。
8.FluorescentLamp
功能: 继承自 ControlledDevice,表示一个荧光灯。
属性:
brightness: 灯的亮度。
方法:
getStatus(): 返回灯的亮度状态。
updateState(voltage: double): 根据输入电压更新灯的亮度。
9.CeilingFan
功能: 继承自 ControlledDevice,表示一个吊扇。
属性:
speed: 吊扇的转速。
方法:
getStatus(): 返回吊扇的转速状态。
updateState(voltage: double): 根据输入电压更新吊扇的转速。
10.PedestalFan
功能: 继承自 ControlledDevice,表示一个落地扇。
属性:
speed: 落地扇的转速。
方法:
getStatus(): 返回落地扇的转速状态。
updateState(voltage: double): 根据输入电压更新落地扇的转速。
11.Curtain
功能: 继承自 ControlledDevice,表示一个窗帘。
属性:
openPercentage: 窗帘的开启百分比。
方法:
getStatus(): 返回窗帘的开启状态。
updateState(voltage: double): 根据输入电压更新窗帘的开启状态。
updateState(voltage: double, lightIntensity: double): 根据输入电压和光强度更新窗帘的开启状态。
12.ToggleSwitch
功能: 继承自 ControlDevice,表示一个拨动开关。
属性:
isUp: 表示开关是否在上位。
方法:
getStatus(): 返回开关的状态(上或下)。
adjust(command: String): 调整开关的状态(上或下)。
13.Circuit
功能: 表示一个电路,管理一组设备的连接和交互。
属性:
id: 电路的唯一标识符。
devices: 电路中包含的设备列表。
方法:
simulate(): 模拟电路的行为,根据连接的设备状态进行计算。
14.SeriesCircuit
功能: 继承自 Circuit,表示串联电路。
方法:
simulate(): 模拟串联电路的行为,根据串联规则计算设备状态。
15.ParallelCircuit
功能: 继承自 Circuit,表示并联电路。
属性:
seriesCircuits: 并联电路中包含的串联电路列表。
方法:
simulate(): 模拟并联电路的行为,根据并联规则计算设备状态。
16.CircuitSimulator
功能: 管理所有设备和电路,提供调整设备和模拟电路的方法。
属性:
devices: 设备的映射,键为设备ID,值为设备对象。
circuits: 电路列表。
方法:
addDevice(device: Device): 添加设备到设备映射中。
addCircuit(circuit: Circuit): 添加电路到电路列表中。
adjustDevice(command: String): 根据命令调整特定设备的状态。
simulate(): 模拟所有电路的行为。
printStatus(): 打印所有设备的状态。
从分析报表来看,代码有365行和140个语句。每个方法平均有 3.48 个语句,方法的复杂度适中;最复杂方法的行号为 9,名为 Device.Device()
;最大复杂度为 1,整体复杂度较低;代码中包含 5个类或接口,每个类平均 6.60个方法,方法的数量适中;平均块深度为 6.56,大多数代码块的嵌套层次较高;方法调用语句有 89 个,在代码中占了较大比重。综合以上分析,代码结构较为复杂。
题目集8 7-1 家居强电电路模拟程序-4
本题的类设计图如下:
其中,大部分类的功能和题目集7相同,改了一些类中的属性和方法,同时新增了一些类。
其中修改后的类的功能如下:
1. Device 类
功能: 作为所有设备的基类,定义了所有设备共有的属性和方法。
属性:
id: 电器元件的标识符。
voltages: 管脚电压数组,假设所有元件有两个管脚。
current: 电器元件的电流。
方法:
setVoltages(double[] voltages): 设置管脚电压。
getVoltages(): 获取管脚电压。
setCurrent(double current): 设置电流。
getCurrent(): 获取电流。
getStatus(): 抽象方法,获取电器元件的状态信息。
2. IncandescentLamp 类
功能L继承自 Device 类,表示一个白炽灯元件。
属性:
MAX_CURRENT: 白炽灯的最大电流限制。
方法:
IncandescentLamp(String id): 构造函数,初始化白炽灯标识符。
getStatus(): 获取白炽灯的状态信息,包括管脚电压和电流限制检测。
3. Circuit 类
功能:表示一个电路,由多个 Device 组成。
属性:
id: 电路的标识符。
devices: 电路中包含的设备列表。
方法:
Circuit(String id): 构造函数,初始化电路标识符和设备列表。
addDevice(Device device): 添加设备到电路中。
simulate(): 抽象方法,模拟电路。
checkForShortCircuit(): 检测电路是否存在短路情况。
printStatus(): 打印电路中所有设备的状态信息。
4. SeriesCircuit 类
功能:继承自 Circuit 类,表示一个串联电路。
方法:
SeriesCircuit(String id): 构造函数,初始化串联电路标识符。
simulate(): 模拟串联电路中所有设备的行为。
5. ParallelCircuit 类
功能:继承自 Circuit 类,表示一个并联电路。
方法:
ParallelCircuit(String id): 构造函数,初始化并联电路标识符。
simulate(): 模拟并联电路中所有设备的行为。
新增的类的功能如下:
1.Diode类
功能:继承自 Device 类,表示一个二极管元件。
属性:
isConducting: 表示二极管是否导通。
MAX_CURRENT: 二极管的最大电流限制。
方法:
Diode(String id): 构造函数,初始化二极管标识符和状态。
updateState(): 更新二极管的状态,决定其是否导通。
getStatus(): 获取二极管的状态信息,包括管脚电压和电流限制检测。
getResistance(): 获取二极管的电阻,根据其导通状态返回相应的电阻值。
静态代码分析图如下图所示:
从分析图表看出,代码总行数为490,语句数为303。最复杂方法的名称为 Curtain.updateState(),该方法
复杂度为9,语句数为17,最大深度为4,方法调用次数为2,这表明该方法内部逻辑非常复杂,,可能需要重构以提高可读性和可维护性。每个类的方法数为3.00和 每个方法的平均语句数为3.49表示方法相对较短,符合单一职责原则,方法长度适中;最大块深度为6和平均块深度1.82表明代码存在较深的嵌套层次,深度为6的块可能难以理解和维护。
三、改进建议
题目集7 7.1家居强电电路模拟程序-3
对于该题,我对相应编码改进给出了一些见解:
1.抽象基类与具体类的设计
当前设计中的抽象基类(Device
、ControlDevice
、ControlledDevice
)和具体类(如 Switch
、FixedSpeedController
等)结构合理,但有一些可以进一步优化的地方。我认为可以通过引入接口和增加状态管理等方法进行优化。
2.单一职责原则
Curtain
类的 updateState
方法有两个版本,其中一个根据电压更新状态,另一个根据电压和光强度更新状态。方法职责不单一。可以将更新状态的方法分开,以遵循单一职责原则。
题目集8 7-1 家居强电电路模拟程序-4
对于该题的一些改进见解如下:
1. 接口替代抽象类
ControlDevice
和 ControlledDevice
采用抽象类方式,如果某个设备需要同时继承两个抽象类会受到限制。我认为可以将 ControlDevice
和 ControlledDevice
改为接口,使得类继承更灵活,易于扩展。
2.电路模拟优化
SeriesCircuit
和 ParallelCircuit
的模拟方法没有考虑多线程或异步操作,可能导致性能瓶颈。我认为可以引入多线程或并行处理,提高模拟性能。
四、总结
在这两次题目集中,我通过一个电路模拟器的实现,学习了如何设计和组织一个复杂系统,其中涉及多种抽象类、继承关系和多态性的运用。从中我了解了如何使用抽象类和继承来设计设备和电路模型,从而实现代码的重用和结构的清晰化。同时对多态性的应用、异常处理等方面也有了深刻理解。这不仅加深了我对面向对象设计原则的理解,还提高了问题解决能力和代码设计的规范性。、
对于面向对象程序设计这门课,我认为可以在课程内容方面,可以推陈出新,找出更多有利于我们领会知识点的教学方式;在pta作业方面,希望不要把重心放在设置过于复杂的测试点,而应该把主要精力应该花费在类的设计上。
标签:状态,第三次,getStatus,blog,电路,电压,方法,设备 From: https://www.cnblogs.com/gch123/p/18276833