OO课程的第二单元——数字电路模拟程序

第二单元——数字电路模拟程序

通过第二单元的学习,我学到了很多:

  1. 继承与多态:
    1. 理解为什么使用抽象类
    2. 掌握方法重写(@Override)
  2. 接口设计:
    1. 接口的定义和使用
    2. 面向接口编程的好处
  3. 组合模式:
    1. 递归结构的设计
    2. 透明性和安全性的权衡

下面我将对作业内容进行分析和总结

前言

三次作业集知识点概览

作业 核心知识点 新增内容 难度

第一次 继承、多态、抽象类 基础逻辑门元件构成电路 ★★☆

第二次 接口设计、引脚类型 多输入输出元件、控制引脚 ★★★☆

第三次 组合模式、异常处理 子电路、异常输入检测 ★★★★★

题量与难度分析

三次作业呈现明显的递进式难度增长:

第一次作业(基础层):题量适中,主要考察面向对象基础。需要实现5种基本逻辑门,重点是理解继承体系的设计。

第二次作业(进阶层):题量增加,新增4种复杂元件(三态门、译码器、数据选择器、数据分配器)。难点在于引脚映射和信号传播。

第三次作业(挑战层):题量最大,引入子电路和异常检测两大功能。需要运用组合模式重构代码,处理复杂的异常优先级。

第一次作业:

作业要求:基础逻辑门元件构成电路

设计思路:基础门元件——链接——电路

整体思路清晰且较为简单。

类图:

4c4d4c89bd6b2ebc64a84799a339e664

现阶段类图设计较为简单,且对各部分的要求较低,相关类较为复杂的有抽象类的元件,以及主函数涉及的函数:

元件基类如下(Component抽象类是整个设计的核心)

cd42459e580aa3d9082f4816a8b6deb3

0cf04cc039745e2f49ad08ffd5489dd1

主函数内部所拥有的较为复杂的函数如下:

链接:

39cb2f992fc05dcf63548058f35cd9e2

以及输入输出的函数:

f27c476b574c41ee4e765604157d3fd6

169f62dbcb2512aa0937a8895f7fc1a0

设计心得:

  1. 使用抽象类统一管理引脚状态,避免代码重复
  2. isReady()方法实现了输入就绪检测,为信号传播奠定基础
  3. 模板方法模式(getOutput())确保计算顺序正确

第二次作业:

作业要求:

在第一次的基础上添加以下两个内容:

1、包含多输入输出的组合电路元件如数据选择器;

2、元件引脚类型除输入、输出之外,增加控制引脚,如三态门。

设计:

在第一次的基础上添加控制引脚,三态门,译码器,数据选择器,数据分配器,结构较先前更为复杂

类图如下:

c500d08fb8c723d558a0bcae57e8ffe5

在这一次的作业中难点较多,如下:

  1. 引脚编号映射复杂:不同元件的引脚编号规则不一致,译码器、选择器、分配器的引脚分配特殊等增加了改作业的难度。

对于引脚的部分代码如下:

5e02f0d22583d30a1ab77ea54a5e123d

53cf5ba4b84c9a95827ed74470f534a9

现有的所写代码仍存在部分缺陷。

  1. 多输入输出元件的信号传播:译码器有多个输出,数据分配器有多个输出,而在作业中需要正确生成和传播所有的输信号。
  2. 三态门的高阻态处理:这一处的难点主要表现在控制端为低电平时输出无效,需要正确处理,否则将影响后续元件的输入就绪状态判断。

对于三态门内部的计算转换如下:

fbaef990055113b737d65d60edc98fc9

  1. 电路拓扑计算顺序:这一部分在笔者的观念中为最难的一部分,它需要迭代计算直到所有信号稳定,同时处理组合逻辑的依赖关系。

第三次作业:

作业要求:在前一次的基础上添加以下功能:

1、增加子电路;

2、增加程序异常输入的检测。

设计:在全部作业中属于最难。

类图:

7ce489c7185ceebfd7d4680ac0080290

2188585f3382811653b0051b8b15d9f2

对于这一次作业的分析主要如下:

难点较多,主要有构架设计的难点,异常检测难点,细节难点,接下来根据该顺序一一讲解如:

  1. 组合模式的应用:将子电路和基本元件统一处理

在这一点之下,需要注意的有:

  1. 如何设计统一的Component抽象类,即能表示基本逻辑门,又能表示子电路
  2. 子电路需要封装内部元件和连接关系,对外表现为一个元件
  3. 引脚映射:子电路的输入引脚对应内部某个元件的输入,输出引脚对应内部某个元件的输出

部分代码如下:

682e2fb1592f0d6d13948cae6662451c3a7f722dc5bd4f258786748d082cf8e7f6e0a78956151778ec98fc43259cdd72

  1. 子电路的递归处理:
    1. 子电路可能嵌套引用其他子电路
    2. 信号传播需要在不同层级间传递、
    3. 元件命名冲突:子电路内部元件编号可能与主电路或者其他子电路相同

解决的代码如下:

e660877f96ff1cebff62b055dc28245c

3.多异常优先级处理

这一次的作业题目定义了5种异常,按优先级排序:

include more than one input (最高)

include none input

include none output

input and output sequence error

input signal conflict (最低)

其中存在的难点:

  1. 需要在解析连接信息时同时检测多种异常
  2. 按优先级输出第一个检测到的异常
  3. 多条连接信息都异常时,只处理第一条

部分代码如下:

04889c15c313635cf25e2cf5b97917dc

6a7c12176080fc9b807179458f0f6764

4.信号冲突检测

其中的难点:

  1. 需要记录每个输入引脚被哪些输出引脚驱动
  2. 一个输入引脚不能连接多个输出引脚
  3. 必须在所有连接信息解析完成后才能完整检测

5.引脚类型判断

在第一次作业中,只有输入和输出引脚。而第二次作业引入了控制引脚,这一次作业需要支持子电路。

其中的难点:

  1. 子电路的引脚类型需要从其内部映射关系推断
  2. 同一个引脚在子电路内部可能是输出,在外部表现为输入

6.计算顺序

子电路内部的元件可能有依赖关系,主电路和子电路之间也有依赖关系。

难点:需要先计算子电路内部,再计算主电路,但如果子电路依赖主电路的输入,需要传参

改进建议:

一、架构改进

1. 引入工厂模式创建元件

2. 使用访问者模式处理输出

二、异常处理改进

1.统一异常体系

2.分离解析和验证

三、性能改进

1.信号传播优化

2.缓存计算结果

总结

一、学习收获

1. 面向对象设计能力提升

    1. 深刻理解了继承和多态在电路模拟中的应用
    2. 掌握了抽象类的设计方法和模板方法模式
  1. 设计模式实践
    1. 组合模式:统一处理基本元件和子电路
    2. 工厂模式:简化元件创建
    3. 访问者模式:分离算法与数据结构
  2. 复杂问题分解能力
    1. 将三次作业分解为递进式的功能模块
    2. 学会了处理引脚映射、信号传播等复杂逻辑
  3. 异常处理思维
    1. 理解了异常优先级的重要性
    2. 学会了设计完整的验证框架

二、需要进一步学习的内容

1.设计模式深化

(1)责任链模式:处理多级异常检测

(2)观察者模式:实现信号变化的自动通知

2.算法优化

(1)拓扑排序算法的实现

(2)循环依赖检测算法

3.测试方法

(1)单元测试框架的使用

(2)边界条件测试设计

4.并发编程

(1)考虑多线程环境下的信号传播

(2)线程安全的缓存设计

三、心得体会

这三次作业让我深刻体会到软件工程不仅仅是写代码,更重要的是设计。从第一次的简单逻辑门,到第三次的子电路和异常检测,每一步都在考验我们对系统架构的理解。

特别是第三次作业,当需要同时处理子电路嵌套和异常检测时,我发现好的架构设计可以极大地降低实现难度。如果一开始就按照组合模式设计,后续的扩展会顺畅很多。

未来展望:希望能在后续的学习中,将这套电路模拟系统进一步完善,添加更多的设计模式支持,并考虑将其扩展为通用的数字电路仿真工具。

posted @ 2026-06-24 15:25  user231017  阅读(1)  评论(0)    收藏  举报