首页 > 其他分享 >第三次blog

第三次blog

时间:2024-06-30 23:55:40浏览次数:15  
标签:状态 第三次 getStatus blog 电路 电压 方法 设备

一、前言

  题目集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(): 打印所有设备的状态。

  SourceMontor的生成报表内容如下:

 从分析报表来看,代码有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.抽象基类与具体类的设计

当前设计中的抽象基类(DeviceControlDeviceControlledDevice)和具体类(如 SwitchFixedSpeedController 等)结构合理,但有一些可以进一步优化的地方。我认为可以通过引入接口和增加状态管理等方法进行优化。

2.单一职责原则

 Curtain 类的 updateState 方法有两个版本,其中一个根据电压更新状态,另一个根据电压和光强度更新状态。方法职责不单一。可以将更新状态的方法分开,以遵循单一职责原则。

题目集8 7-1 家居强电电路模拟程序-4

对于该题的一些改进见解如下:

1. 接口替代抽象类

  ControlDeviceControlledDevice 采用抽象类方式,如果某个设备需要同时继承两个抽象类会受到限制。我认为可以将 ControlDeviceControlledDevice 改为接口,使得类继承更灵活,易于扩展。

2.电路模拟优化

  SeriesCircuitParallelCircuit 的模拟方法没有考虑多线程或异步操作,可能导致性能瓶颈。我认为可以引入多线程或并行处理,提高模拟性能。

四、总结

  在这两次题目集中,我通过一个电路模拟器的实现,学习了如何设计和组织一个复杂系统,其中涉及多种抽象类、继承关系和多态性的运用。从中我了解了如何使用抽象类和继承来设计设备和电路模型,从而实现代码的重用和结构的清晰化。同时对多态性的应用、异常处理等方面也有了深刻理解。这不仅加深了我对面向对象设计原则的理解,还提高了问题解决能力和代码设计的规范性。、

  对于面向对象程序设计这门课,我认为可以在课程内容方面,可以推陈出新,找出更多有利于我们领会知识点的教学方式;在pta作业方面,希望不要把重心放在设置过于复杂的测试点,而应该把主要精力应该花费在类的设计上。

  

标签:状态,第三次,getStatus,blog,电路,电压,方法,设备
From: https://www.cnblogs.com/gch123/p/18276833

相关文章

  • 题目集7~8总结性blog
    一、前言作为本学期学习完面向对象程序设计之后的最后一个总结性blog,我学到的知识点有很多,也包括对本两次大作业的知识点的总结面向对象程序设计课程是计算机科学中的重要一课,它是一种编写计算机程序的方式,采用的是面向对象的技术。在学习此课程之前,我们需要先学习一些基本的编......
  • 题目集7~8的总结性Blog
    前言:这两次的题目集和以前相比没有很多新学的知识, 但是难度都明显上来了很多,主要考验学生综合能力运用问题,所以这两次编程的不是很理想,需要我对于逻辑和各种情况上细致分析,需要学生具备很强的设计和修改能力;我在写最后一次题目集时,花费了很长时间,但是依然毫无所获,非常遗憾,自己的......
  • 第三次blog
    第三次blog前言这次题目集相比与前面几次的题目集的题目都加大了很多,并且相比于前面的题目难度也略有增加,所考察的知识点也更加全面和综合,具体如下:oopt题目集07这次题目集仍然是前面几次菜单集的迭代,由于我前面几次菜单做的并不是很理想,所以在做这次题目集仍然成绩并......
  • 题目集7~8的总结性Blog
    7-7家居强电电路模拟程序-3分数70退出全屏作者 蔡轲单位 南昌航空大学智能家居是在当下家庭中越来越流行的一种配置方案,它通过物联网技术将家中的各种设备(如音视频设备、照明系统、窗帘控制、空调控制、安防系统、数字影院系统、影音服务......
  • 第三次blog
    第三次PTA总结前言 这两次pta题目集的难度较之前难度上升还是比较大的,最主要的原因是因为答案提交之后移除了测试点的告知,导致写的时候有点摸不着头脑,很难找出自己的错误设计与分析第七次题目集 智能家居是在当下家庭中越来越流行的一种配置方案,它通过物联网技术将家中的各......
  • 第三次Blog
    abstractclassDevice{Stringid;doubleresistance;Device(Stringid){this.id=id;}abstractStringgetStatus();abstractdoublegetResistance();}classSwitchextendsDevice{booleanstate;//false代表turnedon,true代表closedSwitch(Stringid){sup......
  • 第三次blog
    前言:第7次作业和第8次作业设计到的知识点,如下类和对象:需要设计各种设备的类,如开关、调速器、灯、风扇等,并为每个设备创建对象以便进行操作和状态记录。数据类型和运算:使用double类型来保存电压、转速等数值,进行计算时需要注意不进行类型转换,最终输出时按截尾规则保留整数。数......
  • 第三次BLOG
    转眼已经到了学期末,面向对象课程也迎来结课,这是oop第三次作业的大总结,题目集的难度都是由浅入深,循序渐进的,越往后写越是有点力不从心的感觉。但是这门课是我们接触软件的开始,并不是结束,这门课结束了不代表学习就要结束,所以在结课之后,对于最后两次题目集做一次总结,以便巩固自己所学......
  • 第三次Blog
    一,前言本次Blog是对题目集7-8的总结,正则表达式,类型转换,字符串处理,链表,以及例如Arraylist等包的知识,需要合理运用继承多态来设计类,需要对题目的逻辑过程,具体实现有充分的认知.特别是用map将类之间联系起来对于逻辑的考验非常大.难度很大,在写代码之前要对实现的过程,思......
  • 第三次Blog
    7-1家居强电电路模拟程序-3分数100作者蔡轲单位南昌航空大学智能家居是在当下家庭中越来越流行的一种配置方案,它通过物联网技术将家中的各种设备(如音视频设备、照明系统、窗帘控制、空调控制、安防系统、数字影院系统、影音服务器、影柜系统、网络家电等)连接到一起,提供家......