首页 > 编程语言 >面向对象程序设计

面向对象程序设计

时间:2024-12-28 18:31:32浏览次数:4  
标签:String 包含 面向对象 电路 电压 程序设计 方法 id

第三次博客作业

一、前言

第一次作业

第一次作业有一道题,即在前一次家居电路模拟程序的基础上进行迭代。添加了一种受控窗帘,线路中包含多个串联起来的并联电路,难度较大。

第二次作业

第二次作业有一道题,即在前一次家居电路模拟程序的基础上进行更进一步的迭代。添加了二极管元件,增加了管脚电压的显示、电流限制和短路检测,线路中包含多个串联起来的并联电路,并联电路中也可以包含并联,难度极大。

二、设计与分析

第一次作业

SourceMontor报表

image
image
image
12.9% 的代码行包含注释,没有特别指出类和接口的注释比例。

平均每个类有 3.67 个方法,每个方法平均有 6.03 条语句,方法的平均复杂度目标没有特别指出。最大块深度为 7(指代码块嵌套的层数);平均块深度为 2.85;平均复杂度为 1.82(指方法中不同路径的数量,较高的复杂度可能意味着方法难以测试和维护)表明代码的复杂度控制得相对较好。

最复杂的方法是 Circuit.calculateVoltages(),位于第 210 行。这可能表明 Circuit.calculateVoltages() 方法过于复杂,需要进一步的分解或重构或者需要拆分;其复杂度为 9,包含 16 条语句,最大深度为 7,调用了 14 次方法调用。这表明 Circuit.calculateVoltages() 方法可能需要进一步的优化。

类图

image
ControlDevice 类:
包含两个成员变量 id、inputVoltage 和 outputVoltage,表示控制设备的标识符、输入电压和输出电压。
包含一个构造方法,用于初始化控制设备的标识符。
包含一个抽象方法 updateOutputVoltage,用于更新设备的输出电压。
包含一个抽象方法 getStatus,用于获取设备的当前状态。

Switch 类:
包含一个成员变量 isClosed,表示开关的当前状态。
包含一个构造方法,用于初始化开关的标识符。
包含一个方法 toggle,用于切换开关的状态。
继承并实现 updateOutputVoltage 方法,根据开关状态更新输出电压。
继承并实现 getStatus 方法,返回开关的当前状态。

StepSpeedController 类:
包含一个成员变量 level,表示分档调速器的当前档位。
包含一个构造方法,用于初始化调速器的标识符。
包含两个方法 incrementLevel 和 decrementLevel,用于调整档位。
继承并实现 updateOutputVoltage 方法,根据档位更新输出电压。
继承并实现 getStatus 方法,返回调速器的当前档位。

ContinuousSpeedController 类:
包含一个成员变量 position,表示连续调速器的当前位置参数。
包含一个构造方法,用于初始化调速器的标识符。
包含一个方法 setPosition,用于设置调速器的位置参数。
继承并实现 updateOutputVoltage 方法,根据位置参数更新输出电压。
继承并实现 getStatus 方法,返回调速器的当前位置参数。

ControlledDevice 类:
包含两个成员变量 id、inputVoltage 和 outputVoltage,表示受控设备的标识符、输入电压和输出电压。
包含一个构造方法,用于初始化受控设备的标识符。
包含一个抽象方法 updateOutputVoltage,用于更新设备的输出电压。
包含一个抽象方法 getStatus,用于获取设备的当前状态。

IncandescentLamp 类:
包含一个构造方法,用于初始化白炽灯的标识符。
包含一个方法 calculateBrightness,用于计算灯具的亮度。
继承并实现 updateOutputVoltage 方法,白炽灯不需要更新输出电压。
继承并实现 getStatus 方法,返回灯具的亮度。

FluorescentLamp 类:
包含一个构造方法,用于初始化日光灯的标识符。
包含一个方法 calculateBrightness,用于计算灯具的亮度。
继承并实现 updateOutputVoltage 方法,日光灯不需要更新输出电压。
继承并实现 getStatus 方法,返回灯具的亮度。

CeilingFan 类:
包含一个构造方法,用于初始化吊扇的标识符。
包含一个方法 calculateSpeed,用于计算风扇的转速。
继承并实现 updateOutputVoltage 方法,吊扇不需要更新输出电压。
继承并实现 getStatus 方法,返回风扇的转速。

Circuit 类:
包含三个成员变量 controlDevices、controlledDevices 和 connections,分别存储控制设备、受控设备和设备间的连接关系。
包含三个方法 addControlDevice、addControlledDevice 和 connectDevices,用于添加控制设备、受控设备和连接设备。
包含一个方法 processCommand,用于处理控制命令。
包含一个方法 calculateVoltages,用于计算电路中所有设备的电压。
包含一个方法 outputStates,用于输出所有设备的状态。

Main 类:
包含 main 方法,是程序的入口点,负责读取输入并模拟电路系统的操作。
在 main 方法中,使用 Circuit 对象来管理电路中的所有设备和连接。
处理输入数据,创建相应的设备对象,连接设备,并处理控制命令。
最后,计算电路中的电压并输出所有设备的状态。

第二次作业

SourceMontor报表

image
image
image
13.1% 的代码行包含注释,没有特别指出类和接口的注释比例。

平均每个类有 4.78 个方法,每个方法平均有 5.42 条语句,方法的平均复杂度目标没有特别指出。最大块深度为 7(指代码块嵌套的层数);平均块深度为 2.23;平均复杂度为 1.57(指方法中不同路径的数量,较高的复杂度可能意味着方法难以测试和维护)表明代码的复杂度控制得相对较好。

最复杂的方法是 Circuit.processCommand(),位于第 282 行。这可能表明 Circuit.processCommand() 方法过于复杂,需要进一步的分解或重构或者需要拆分;其复杂度为 9,包含 23 条语句,最大深度为 4,调用了 19 次方法调用。这表明 Circuit.processCommand() 方法可能需要进一步的优化。

类图

image
ControlDevice 类:
包含三个成员变量:设备标识符 id,输入电压 inputVoltage,输出电压 outputVoltage。
包含一个构造方法,用于初始化设备标识符。
包含两个抽象方法:updateOutputVoltage 用于更新设备的输出电压,getStatus 用于获取设备的当前状态。

点击查看代码
// 控制设备的父类
abstract class ControlDevice {
    String id; // 设备标识符
    double inputVoltage = 0; // 输入电压
    double outputVoltage = 0; // 输出电压

    ControlDevice(String id) {
        this.id = id;
    }

    // 更新输出电压的抽象方法,具体实现由子类完成
    abstract void updateOutputVoltage();

    // 获取设备状态的抽象方法,具体实现由子类完成
    abstract String getStatus();
}

Switch 类:
包含一个成员变量 isClosed,表示开关的开闭状态。
包含一个构造方法,用于初始化开关的标识符。
包含一个方法 toggle,用于切换开关的状态。
重写 updateOutputVoltage 方法,根据开关状态更新输出电压。
重写 getStatus 方法,返回开关的当前状态。

点击查看代码
// 开关类,继承自 ControlDevice
class Switch extends ControlDevice {
    boolean isClosed = false; // 初始状态为打开

    Switch(String id) {
        super(id);
    }

    // 切换开关状态
    void toggle() {
        isClosed = !isClosed;
    }

    @Override
    void updateOutputVoltage() {
        // 开关闭合时输出电压等于输入电压,否则为0
        outputVoltage = isClosed ? inputVoltage : 0;
    }

    @Override
    String getStatus() {
        return "@" + id + ":" + (isClosed ? "closed" : "turned on");
    }
}

StepSpeedController 类:
包含一个成员变量 level,表示分档调速器的档位。
包含一个构造方法,用于初始化调速器的标识符。
包含两个方法 incrementLevel 和 decrementLevel,用于调整档位。
重写 updateOutputVoltage 方法,根据档位更新输出电压。
重写 getStatus 方法,返回调速器的当前档位。

点击查看代码
// 分档调速器类,继承自 ControlDevice
class StepSpeedController extends ControlDevice {
    int level = 0; // 初始档位为0

    StepSpeedController(String id) {
        super(id);
    }

    // 增加档位
    void incrementLevel() {
        if (level < 3) level++;
    }

    // 减少档位
    void decrementLevel() {
        if (level > 0) level--;
    }

    @Override
    void updateOutputVoltage() {
        // 根据档位调整输出电压
        double[] factors = {0, 0.3, 0.6, 0.9};
        outputVoltage = inputVoltage * factors[level];
    }

    @Override
    String getStatus() {
        return "@" + id + ":" + level;
    }
}

ContinuousSpeedController 类:
包含一个成员变量 position,表示连续调速器的位置参数。
包含一个构造方法,用于初始化调速器的标识符。
包含一个方法 setPosition,用于设置调速器的位置参数。
重写 updateOutputVoltage 方法,根据位置参数更新输出电压。
重写 getStatus 方法,返回调速器的当前位置参数。

点击查看代码
// 连续调速器类,继承自 ControlDevice
class ContinuousSpeedController extends ControlDevice {
    double position = 0.00; // 初始档位参数为0.00

    ContinuousSpeedController(String id) {
        super(id);
    }

    // 设置档位参数
    void setPosition(double position) {
        this.position = position;
    }

    @Override
    void updateOutputVoltage() {
        outputVoltage = inputVoltage * position;
    }

    @Override
    String getStatus() {
        return String.format("@%s:%.2f", id, position);
    }
}

ControlledDevice 类:
包含三个成员变量:设备标识符 id,输入电压 inputVoltage,输出电压 outputVoltage。
包含一个构造方法,用于初始化设备标识符。
包含两个抽象方法:updateOutputVoltage 用于更新设备的输出电压,getStatus 用于获取设备的当前状态。

点击查看代码
// 受控设备父类
abstract class ControlledDevice {
    String id; // 设备标识符
    double inputVoltage = 0; // 输入电压
    double outputVoltage = 0; // 输出电压

    ControlledDevice(String id) {
        this.id = id;
    }

    // 更新输出电压的方法,具体实现由子类完成
    abstract void updateOutputVoltage();

    // 获取设备状态的方法,具体实现由子类完成
    abstract String getStatus();
}

IncandescentLamp 类:
包含一个构造方法,用于初始化白炽灯的标识符。
包含一个方法 calculateBrightness,用于计算灯具的亮度。
重写 updateOutputVoltage 方法,白炽灯不需要更新输出电压。
重写 getStatus 方法,返回灯具的亮度。

点击查看代码
// 白炽灯类,继承自 ControlledDevice
class IncandescentLamp extends ControlledDevice {
    IncandescentLamp(String id) {
        super(id);
    }

    // 计算亮度
    int calculateBrightness(double voltageDifference) {
		//略
    }

    @Override
    void updateOutputVoltage() {
        // 灯具不需要更新输出电压,依赖电压差
    }

    @Override
    String getStatus() {
        double voltageDifference = Math.abs(inputVoltage - outputVoltage);
        return "@" + id + ":" + calculateBrightness(voltageDifference);
    }
}

FluorescentLamp 类:
包含一个构造方法,用于初始化日光灯的标识符。
包含一个方法 calculateBrightness,用于计算灯具的亮度。
重写 updateOutputVoltage 方法,日光灯不需要更新输出电压。
重写 getStatus 方法,返回灯具的亮度。

点击查看代码
// 日光灯类,继承自 ControlledDevice
class FluorescentLamp extends ControlledDevice {
    FluorescentLamp(String id) {
        super(id);
    }

    // 计算亮度
    int calculateBrightness(double voltageDifference) {
		//略
    }

    @Override
    void updateOutputVoltage() {
        // 灯具不需要更新输出电压,依赖电压差
    }

    @Override
    String getStatus() {
        double voltageDifference = Math.abs(inputVoltage - outputVoltage);
        return "@" + id + ":" + calculateBrightness(voltageDifference);
    }
}

CeilingFan 类:
包含一个构造方法,用于初始化吊扇的标识符。
包含一个方法 calculateSpeed,用于计算风扇的转速。
重写 updateOutputVoltage 方法,吊扇不需要更新输出电压。
重写 getStatus 方法,返回风扇的转速。

点击查看代码
// 吊扇类,继承自 ControlledDevice
class CeilingFan extends ControlledDevice {
    CeilingFan(String id) {
        super(id);
    }

    // 计算转速
    int calculateSpeed(double voltageDifference) {
		//略
    }

    @Override
    void updateOutputVoltage() {
        // 风扇不需要更新输出电压,依赖电压差
    }

    @Override
    String getStatus() {
        double voltageDifference = Math.abs(inputVoltage - outputVoltage);
        return "@" + id + ":" + calculateSpeed(voltageDifference);
    }
}

FloorFan 类:
包含一个构造方法,用于初始化落地扇的标识符。
包含一个方法 calculateSpeed,用于计算风扇的转速。
重写 updateOutputVoltage 方法,落地扇不需要更新输出电压。
重写 getStatus 方法,返回风扇的转速。

点击查看代码
// 落地扇类,继承自 ControlledDevice
class FloorFan extends ControlledDevice  {
    FloorFan(String id) {
        super(id);
    }

    // 计算转速
    int calculateSpeed(double voltageDifference) {
		//略
    }

    @Override
    void updateOutputVoltage() {
        // 落地扇不需要更新输出电压,依赖电压差
    }

    @Override
    String getStatus() {
        double voltageDifference = Math.abs(inputVoltage - outputVoltage);
        return "@" + id + ":" + calculateSpeed(voltageDifference);
    }
}

SeriesCircuit 类:
包含两个成员变量:电路标识符 id 和连接列表 connections。
包含一个构造方法,用于初始化电路标识符。
包含一个方法 addConnection,用于添加电路连接。

点击查看代码
// 串联电路类
class SeriesCircuit {
    String id;
    List<String[]> connections = new ArrayList<>();

    SeriesCircuit(String id) {
        this.id = id;
    }

    void addConnection(String[] connection) {
        connections.add(connection);
    }
}

ParallelCircuit 类:
包含两个成员变量:电路标识符 id 和串联电路列表 seriesCircuits。
包含一个构造方法,用于初始化电路标识符。
包含一个方法 addSeriesCircuit,用于添加串联电路。

点击查看代码
// 并联电路类
class ParallelCircuit {
    String id;
    List<SeriesCircuit> seriesCircuits = new ArrayList<>();

    ParallelCircuit(String id) {
        this.id = id;
    }

    void addSeriesCircuit(SeriesCircuit seriesCircuit) {
        seriesCircuits.add(seriesCircuit);
    }
}

Circuit 类:
包含四个成员变量:控制设备映射 controlDevices,受控设备映射 controlledDevices,串联电路映射 seriesCircuits,和并联电路映射 parallelCircuits。
包含四个方法:addControlDevice 添加控制设备,addControlledDevice 添加受控设备,addSeriesCircuit 添加串联电路,addParallelCircuit 添加并联电路。
包含两个方法:processSeriesCircuit 处理串联电路,processParallelCircuit 处理并联电路。
包含一个方法 processCommand,用于处理控制命令。
包含一个方法 calculateVoltages,用于计算电路中所有设备的电压。
包含一个方法 outputStates,用于输出所有设备的状态。

点击查看代码
// 电路类,管理所有设备及连接
class Circuit {
    //添加设备,电路

	//处理命令
    void processSeriesCircuit(String line) {
		//略
    }

    // 计算电压
    void calculateVoltages() {
		//略
    }

    // 输出设备状态
    void outputStates() {
		//略
    }

    // 获取设备类型的排序优先级
    private int getOrder(ControlDevice device) {
		//略
    }
}

Main 类:
包含 main 方法,是程序的入口点,负责读取输入并模拟电路系统的操作。
在 main 方法中,使用 Circuit 对象来管理电路中的所有设备和连接。
处理输入数据,创建相应的设备对象,连接设备,并处理控制命令。
最后,计算电路中的电压并输出所有设备的状态。

三、踩坑与心得

开发过程中,电路的串并联设计是核心部分,它直接关系到整个系统的稳定性和准确性。电路中的串并联不仅涉及到基本的电路理论,还涉及到复杂的逻辑处理和算法实现。在模拟系统中,每个元器件都有最大电流的设置,以防止电器过热和烧坏电路。我首先为每个元器件定义了一个最大电流值,并在电路计算中实时监控电流。当检测到电流超过这个值时,系统会在输出信息中加入“exceeding current limit error”提示。这个功能的实现让我深刻理解了电路保护的重要性,以及如何在软件中模拟这种保护机制。

短路检测是电路模拟中的另一个重要功能。如果电路中出现无穷大的电流,即短路,系统需要能够检测到这种情况并停止所有元器件信息的输出,仅显示“short circuit error”。这个功能的实现需要对电路的连接和电流流向有深入的理解,以及如何快速准确地检测异常情况。我通过模拟电流的流动,检查是否有异常的电流值,从而判断是否发生短路。这个过程需要精确的数学模型和高效的算法支持,以确保系统的响应速度和准确性。

在处理并联电路中包含并联的情况时,我遇到了逻辑上的复杂性。这要求我在设计电路模拟框架时,就需要考虑到电路的多层次结构。并联电路的设计需要考虑到多个电路路径的电流分配和电压分配。在并联电路中,每个分支的电压是相同的,而电流则根据各个分支的电阻进行分配。这种电路结构要求我必须有一个清晰的电路模型,以及能够处理复杂逻辑的编程技巧。

在模拟并联电路中包含并联电路的情况时,我采用了递归算法来处理这种嵌套的并联电路。这种递归算法允许我将复杂的电路结构分解为更小、更易于管理的部分。例如,一个并联电路可以包含多个串联电路,而这些串联电路又可以包含其他的并联电路。通过递归算法,我可以逐层解析这些嵌套的电路结构,计算每个部分的电流和电压,然后将结果合并,以得到整个电路的行为。

在实现递归算法时,我需要特别注意避免无限递归和循环引用的问题。这些问题可能会导致程序陷入无限循环,从而无法得到结果。为了避免这种情况,我为每个电路元素维护了一个状态,记录它是否已经被计算过。如果一个电路元素已经被计算过,我就不会再对其进行递归计算,而是直接使用之前的结果。

此外,我还需要注意电路的连接方式,确保电路的连接是正确的。在电路模拟中,错误的连接可能会导致电路无法正常工作,或者导致短路。我通过检查电路的连接顺序和连接方式,确保每个电路元素都正确地连接到其他电路元素。这需要我对电路的物理特性和连接规则有深入的理解。

在处理并联电路中的电流限制时,我需要考虑到每个电路元素的最大电流限制。在并联电路中,总电流是各个分支电流的总和。因此,我需要确保每个分支的电流都不会超过其最大限制。如果某个分支的电流超过了其最大限制,我就会在输出信息中加入“exceeding current limit error”提示,并停止该分支的电流流动。

在模拟电路的过程中,我还需要注意电路的动态变化。电路的状态可能会随着时间和其他因素的变化而变化,例如开关的开闭、调速器的档位变化等。我需要实时监控这些变化,并更新电路的电流和电压计算。这要求我有一个高效的事件处理机制,能够快速响应电路状态的变化。

四、改进建议及总结

总的来说,这次智能家居强电电路模拟系统的开发之旅让我学到了很多,不仅是技术上的提升,更重要的是对项目管理和用户体验的深刻理解。这些经验将对我未来的项目开发大有裨益。我不仅提升了我的技术能力,也加深了我对电路模拟和系统设计的理解。这些经历不仅提升了我的技术能力,也加深了我对电路模拟和系统设计的理解。这些经验将对我未来的项目开发大有裨益,尤其是在处理复杂系统和异常情况时。通过这些挑战,我学会了如何在软件中模拟真实的电路行为,包括电流限制和短路保护。我也意识到了在设计系统时需要考虑到各种异常情况,并提前规划好应对策略。此外,对于并联电路中包含并联的复杂情况,我学会了如何通过递归和模块化的设计来简化问题。这些经历不仅提升了我的技术能力,也加深了我对电路模拟和系统设计的理解。

标签:String,包含,面向对象,电路,电压,程序设计,方法,id
From: https://www.cnblogs.com/yangjiaobaoza/p/18637759

相关文章

  • 学期:2024-2025-1 学号:20241303 《计算机基础与程序设计》第十四周学习总结
    作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程序设计第十四周作业)这个作业的目标<写上具体方面>《C语言程序设计》第13-14章并完成云班课测试作业正文...本......
  • 专题七:程序设计语言
    重点模块说明编译与解释、文法、**正规式、有限自动机、表达式、传值与传址、**多种程序语言特点编译与解释画板文法的定义以及语法推导树文法定义一个形式文法是一个有序四元组G=(V,T,S,P),其中:1)V:非终结符。不是语言组成部分,不是最终结果,可理解为占位符。2)T:终结符。是语言的组......
  • 2024-2025-1学号20241309《计算机基础与程序设计》第十四周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第十四周作业这个作业的目标自学教材《C语言程序设计》第13章并完成云班课测试作业正文2024-2025-1学号20241309《计算机基础与程序设计》第......
  • C++高级程序设计 20241228
    当然可以。在C++中,面向对象编程(OOP)是一种编程范式,它使用类和对象来模拟现实世界中的实体和行为。以下是构造函数、拷贝构造函数、析构函数和普通成员函数的简单解释和例子:1.构造函数构造函数是一种特殊的成员函数,用于创建对象时初始化对象的状态。它与类同名,并且没有返回类型,甚......
  • 2024-2025-1 20241417 《计算机基础与程序设计》第十四周学习总结
    2024-2025-120241417《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>2024-2025-1计算机基础与程序设计第十四周作业这个作业的目标<《C语言程序设计......
  • 《计算机基础与程序设计》第十四周学习总结
    学期(2024-2025-1)学号(20241412)《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程<班级的链接>2024-2025-1-计算机基础与程序设计这个作业要求在哪里<作业要求的链接>2024-2025-1计算机基础与程序设计第十四周作业)教材学习内容总结复习......
  • 2024-2025-1 20241318 《计算机基础与程序设计》第十四周学习总结
    这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP(这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14这个作业的目标<学习《C语言程序设计》第13-14章并完成云班课测试>作业正文https://i.cnblogs.com/posts/......
  • 【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
    目录......
  • 2024-2025-1 20241329 《计算机基础与程序设计》第十四周学习总结
    作业信息作业归属课程:2024-2025-1-计算机基础与程序设计作业要求:2024-2025-1计算机基础与程序设计第十四周作业作业目标:《C语言程序设计》第13-14章作业正文:2024-2025-120241329《计算机基础与程序设计》第十四周学习总结教材学习内容总结《C语言程序设计》第13章二进制......
  • 2024-2025-1 20241316 《计算机基础与程序设计》第十四周学习总结
    2024-2025-120241316《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第十四周作业这个作业的目标《C语言程序设计》第13-14章并完成云班课测试作......