OO4-6次作业作业总结

总结性博客:Java题目习题集4-6学习心得

一、前言
通过三次习题集的练习,我对面向对象编程(OOP)、集合框架和输入输出操作有了更加深刻的理解。这三次题目涵盖的内容主要包括以下几个方面:

  1. 题目知识点:
    第一次习题集:以Java的继承与多态为核心,强化对类与对象的理解,设计与实现了多个基于父类与子类的题目(如教师与学生、员工与本科生)。
    第二次习题集:探索集合框架的使用,包括ListIterator的操作,涉及学生与员工管理场景。
    第三次习题集:更复杂的设计题目,包括智能家居模拟系统,模拟电路设备的工作逻辑,结合面向对象的抽象与实现。

  2. 题目数量与难度:
    每次习题量为 56 道,难度呈递进关系。
    第一次习题:较为基础,主要考察类的继承和方法重写。
    第二次习题:涉及集合框架,要求对集合操作有一定的实践。
    第三次习题:综合性强,设计复杂的智能家居电路模拟,较高的代码量和逻辑推理要求。

  3. 学习目标:
    熟练掌握面向对象编程。
    提高程序的设计与优化能力。
    深入理解Java集合框架。
    解决多场景下复杂逻辑问题。

二、设计与分析
本次重点分析习题集中 第三次习题 的一题——智能家居强电电路模拟程序。

  1. 核心设计概述:
    通过类的继承和多态实现了控制设备与受控设备的功能。
    利用输入解析方法,动态处理各种连接信息,并计算电压传递逻辑。

  2. 代码结构:
    设备类层级设计

    主要功能模块:
    设备的状态管理:每种设备有不同的状态逻辑(如开关的开/关、风扇的转速等)。
    电压传递与计算:基于串联和并联电路的信息,递归计算各设备的输出状态。
    输入解析:解析复杂的输入格式,动态生成电路连接。

  3. 代码分析:
    1.电压递归传递逻辑
    这一段代码实现了设备之间的电压递归传递,是整个智能家居电路模拟程序的核心逻辑
    原始代码片段:

private void propagateVoltage(String pin, double voltage) {
    if (!connections.containsKey(pin)) return; // 如果没有连接到其他引脚,直接返回

    String connectedPin = connections.get(pin); // 获取与当前引脚连接的另一端引脚
    Device device = devices.get(connectedPin.split("-")[0]); // 获取连接的设备

    if (device != null) {
        device.update(voltage); // 更新设备的状态
        double outputVoltage = voltage; // 假设初始电压未被改变

        // 如果是控制设备,计算输出电压
        if (device instanceof StepSpeedController) {
            outputVoltage = ((StepSpeedController) device).getOutputVoltage(voltage);
        } else if (device instanceof ContinuousSpeedController) {
            outputVoltage = ((ContinuousSpeedController) device).getOutputVoltage(voltage);
        }

        // 递归传播电压到下一个引脚
        propagateVoltage(connectedPin, outputVoltage);
    }
}

分析与解读:
功能描述:
该方法用于将电压从一个设备传递到下一个设备,并根据设备的特性计算电压变化。
使用递归方式处理设备连接链路,适用于串联电路的模拟。

关键实现点:
连接关系查询:
利用connections字典存储引脚间的连接关系,通过引脚查询其连接的另一端。
connections.get(pin)返回连接引脚,确保递归传播的方向性。

设备电压更新:
根据设备类型(如调速器)动态计算输出电压。
使用instanceof检查设备类型,并调用具体设备类的方法进行计算。

递归调用:
递归传递电压到下一个设备的引脚,模拟电压在电路中的传播过程。

潜在问题与优化建议:
问题1:重复计算
对于复杂电路,可能多次访问同一设备,导致重复计算。
优化:引入访问记录,避免已处理设备的重复递归
private Set<String> visitedPins = new HashSet<>(); if (visitedPins.contains(pin)) return; visitedPins.add(pin);

问题2:类型检查较繁琐
使用instanceof进行设备类型判断,耦合性较高。
优化:通过设备基类定义统一的getOutputVoltage()接口,具体逻辑由子类实现,简化代码。

2.调速器的档位控制逻辑
调速器设备的档位控制是智能家居模拟中重要的特性。以下是StepSpeedController类中档位计算的核心代码:

class StepSpeedController extends Device {
    private int level = 0; // 初始档位为0

    void increaseLevel() {
        if (level < 3) level++; // 增加档位,最大为3
    }

    void decreaseLevel() {
        if (level > 0) level--; // 减少档位,最小为0
    }

    double getOutputVoltage(double inputVoltage) {
        // 根据档位计算输出电压比例
        switch (level) {
            case 0: return 0;
            case 1: return 0.3 * inputVoltage;
            case 2: return 0.6 * inputVoltage;
            case 3: return 0.9 * inputVoltage;
            default: return 0;
        }
    }

    @Override
    String getStatus() {
        return Integer.toString(level); // 返回档位状态
    }
}

分析与解读:
功能描述:
该类模拟分档调速器,通过档位调整设备的输出电压。
支持档位增加和减少,范围在0-3之间。
关键实现点:
档位调整方法:
increaseLevel() 和 decreaseLevel() 分别控制档位增加和减少,确保档位不越界。
最大值和最小值通过简单的条件限制处理,保证设备行为合理。

输出电压计算:
根据档位使用switch分支语句计算输出电压比例。
输出电压与输入电压按比例关系确定,实现了分档调节功能。

状态获取:
getStatus() 方法返回当前档位状态,用于外部查询设备信息。

潜在问题与优化:
问题1:档位范围的硬编码
档位最大值3和比例值直接写死在代码中,若未来需要扩展为4档或5档需要修改代码。
优化:将档位范围和比例设置为配置参数

private static final double[] LEVEL_OUTPUT_RATIO = {0, 0.3, 0.6, 0.9};
double getOutputVoltage(double inputVoltage) {
    return LEVEL_OUTPUT_RATIO[level] * inputVoltage;
}

问题2:输出电压计算耦合性较高
档位逻辑直接耦合在getOutputVoltage()中,扩展性有限。
优化:提取档位逻辑为独立模块,支持动态配置档位电压比例。

三、采坑心得
在源码提交和调试过程中,以下是遇到的主要问题及对应解决方法:

  1. 问题一:递归电压传递导致栈溢出
    原因:在设备连接信息复杂时,未设置递归终止条件。
    解决:在递归函数中,添加访问记录,避免重复访问同一设备。

  2. 问题二:输入解析中的格式错误
    原因:部分输入格式未完全匹配预期,导致Pattern匹配失败。
    解决:调整正则表达式,加入对特殊情况的处理,如TM解析分开处理。

  3. 问题三:电路状态输出不正确
    原因:调速器档位或开关状态未正确更新。
    解决:在状态更新时,确保正确传递输入电压;同时测试多个输入样例,修复边界问题。

四、改进建议
针对本次习题的代码实现,我提出以下改进建议:

  1. 模块化设计:
    将电压计算与状态更新分离为独立模块,降低方法复杂度。
    引入日志记录模块,便于调试与问题追踪。

  2. 输入处理优化:
    对输入格式进行预处理,将格式检查独立为一个函数,提高代码可读性。

  3. 性能优化:
    对设备连接的递归处理,加入缓存以减少重复计算。
    对设备列表排序,避免在输出时重复排序操作。

  4. 扩展性:
    引入配置文件,支持动态扩展设备类型和连接规则。
    为设备类增加通用接口,便于未来功能迭代。

五、扩展性设计与思考
在实际开发中,代码的扩展性和复用性非常重要。以下是对习题集代码的扩展性设计和一些未来可能的改进方向:

  1. 可扩展的设备框架设计
    可以通过增加以下内容,进一步提升设备类框架的扩展能力:

抽象接口:将设备的通用功能抽象为接口,如Controllable(可控制)和Updatable(可更新),实现对复杂设备的统一管理。
配置化支持:通过JSON或XML文件描述设备类型、连接关系等,使系统支持动态扩展新设备。
示例代码:设备抽象接口

interface Device {
    String getStatus(); // 获取状态
    void update(double voltage); // 更新设备状态
}

// 可控制设备接口
interface Controllable {
    void control(String command); // 接收控制命令
}

// 开关实现了设备和控制接口
class Switch implements Device, Controllable {
    private boolean isClosed = false;

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

    @Override
    public void update(double voltage) {
        // 开关无需更新电压
    }

    @Override
    public void control(String command) {
        isClosed = !isClosed; // 切换开关状态
    }
}

通过这样的设计,可以轻松扩展支持其他设备(如电梯、传感器等)

六、总结
经过三次题目集的练习,我不仅加深了对Java语言的理解,也学会了如何从复杂场景出发,设计高效的程序结构。以下是我的收获和改进方向:

  1. 主要收获:
    学会在继承与多态基础上设计更复杂的类层次结构。
    提升了对集合框架的使用能力。
    了解如何通过正则表达式解析复杂输入。
    掌握了电路模拟场景中的逻辑处理技巧。

  2. 需改进的地方:
    提升算法的效率,优化时间复杂度。
    加强对边界情况的考虑,避免程序崩溃。
    学习如何撰写单元测试,确保代码质量。

  3. 对课程与实验的建议:
    增加代码设计的专题课程,讲解如何优化代码结构。
    提供更多有趣的实践题目,如物联网和人工智能方向。
    增强对代码风格与规范的要求,帮助学生养成良好的编程习惯。

通过这三次练习,我从理论到实践完成了一个完整的学习闭环。期待后续的课程可以带来更多挑战与收获!

posted @   yna0206  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示