OO课程的第二单元——数字电路模拟程序
第二单元——数字电路模拟程序
通过第二单元的学习,我学到了很多:
- 继承与多态:
- 理解为什么使用抽象类
- 掌握方法重写(@Override)
- 接口设计:
- 接口的定义和使用
- 面向接口编程的好处
- 组合模式:
- 递归结构的设计
- 透明性和安全性的权衡
下面我将对作业内容进行分析和总结
前言
三次作业集知识点概览
作业 核心知识点 新增内容 难度
第一次 继承、多态、抽象类 基础逻辑门元件构成电路 ★★☆
第二次 接口设计、引脚类型 多输入输出元件、控制引脚 ★★★☆
第三次 组合模式、异常处理 子电路、异常输入检测 ★★★★★
题量与难度分析
三次作业呈现明显的递进式难度增长:
第一次作业(基础层):题量适中,主要考察面向对象基础。需要实现5种基本逻辑门,重点是理解继承体系的设计。
第二次作业(进阶层):题量增加,新增4种复杂元件(三态门、译码器、数据选择器、数据分配器)。难点在于引脚映射和信号传播。
第三次作业(挑战层):题量最大,引入子电路和异常检测两大功能。需要运用组合模式重构代码,处理复杂的异常优先级。
第一次作业:
作业要求:基础逻辑门元件构成电路
设计思路:基础门元件——链接——电路
整体思路清晰且较为简单。
类图:
现阶段类图设计较为简单,且对各部分的要求较低,相关类较为复杂的有抽象类的元件,以及主函数涉及的函数:
元件基类如下(Component抽象类是整个设计的核心)
主函数内部所拥有的较为复杂的函数如下:
链接:
以及输入输出的函数:
设计心得:
- 使用抽象类统一管理引脚状态,避免代码重复
- isReady()方法实现了输入就绪检测,为信号传播奠定基础
- 模板方法模式(getOutput())确保计算顺序正确
第二次作业:
作业要求:
在第一次的基础上添加以下两个内容:
1、包含多输入输出的组合电路元件如数据选择器;
2、元件引脚类型除输入、输出之外,增加控制引脚,如三态门。
设计:
在第一次的基础上添加控制引脚,三态门,译码器,数据选择器,数据分配器,结构较先前更为复杂
类图如下:
在这一次的作业中难点较多,如下:
- 引脚编号映射复杂:不同元件的引脚编号规则不一致,译码器、选择器、分配器的引脚分配特殊等增加了改作业的难度。
对于引脚的部分代码如下:
现有的所写代码仍存在部分缺陷。
- 多输入输出元件的信号传播:译码器有多个输出,数据分配器有多个输出,而在作业中需要正确生成和传播所有的输信号。
- 三态门的高阻态处理:这一处的难点主要表现在控制端为低电平时输出无效,需要正确处理,否则将影响后续元件的输入就绪状态判断。
对于三态门内部的计算转换如下:
- 电路拓扑计算顺序:这一部分在笔者的观念中为最难的一部分,它需要迭代计算直到所有信号稳定,同时处理组合逻辑的依赖关系。
第三次作业:
作业要求:在前一次的基础上添加以下功能:
1、增加子电路;
2、增加程序异常输入的检测。
设计:在全部作业中属于最难。
类图:
对于这一次作业的分析主要如下:
难点较多,主要有构架设计的难点,异常检测难点,细节难点,接下来根据该顺序一一讲解如:
- 组合模式的应用:将子电路和基本元件统一处理
在这一点之下,需要注意的有:
- 如何设计统一的Component抽象类,即能表示基本逻辑门,又能表示子电路
- 子电路需要封装内部元件和连接关系,对外表现为一个元件
- 引脚映射:子电路的输入引脚对应内部某个元件的输入,输出引脚对应内部某个元件的输出
部分代码如下:
- 子电路的递归处理:
- 子电路可能嵌套引用其他子电路
- 信号传播需要在不同层级间传递、
- 元件命名冲突:子电路内部元件编号可能与主电路或者其他子电路相同
解决的代码如下:
3.多异常优先级处理
这一次的作业题目定义了5种异常,按优先级排序:
include more than one input (最高)
include none input
include none output
input and output sequence error
input signal conflict (最低)
其中存在的难点:
- 需要在解析连接信息时同时检测多种异常
- 按优先级输出第一个检测到的异常
- 多条连接信息都异常时,只处理第一条
部分代码如下:
4.信号冲突检测
其中的难点:
- 需要记录每个输入引脚被哪些输出引脚驱动
- 一个输入引脚不能连接多个输出引脚
- 必须在所有连接信息解析完成后才能完整检测
5.引脚类型判断
在第一次作业中,只有输入和输出引脚。而第二次作业引入了控制引脚,这一次作业需要支持子电路。
其中的难点:
- 子电路的引脚类型需要从其内部映射关系推断
- 同一个引脚在子电路内部可能是输出,在外部表现为输入
6.计算顺序
子电路内部的元件可能有依赖关系,主电路和子电路之间也有依赖关系。
难点:需要先计算子电路内部,再计算主电路,但如果子电路依赖主电路的输入,需要传参
改进建议:
一、架构改进
1. 引入工厂模式创建元件
2. 使用访问者模式处理输出
二、异常处理改进
1.统一异常体系
2.分离解析和验证
三、性能改进
1.信号传播优化
2.缓存计算结果
总结
一、学习收获
1. 面向对象设计能力提升
- 深刻理解了继承和多态在电路模拟中的应用
- 掌握了抽象类的设计方法和模板方法模式
- 设计模式实践
- 组合模式:统一处理基本元件和子电路
- 工厂模式:简化元件创建
- 访问者模式:分离算法与数据结构
- 复杂问题分解能力
- 将三次作业分解为递进式的功能模块
- 学会了处理引脚映射、信号传播等复杂逻辑
- 异常处理思维
- 理解了异常优先级的重要性
- 学会了设计完整的验证框架
二、需要进一步学习的内容
1.设计模式深化
(1)责任链模式:处理多级异常检测
(2)观察者模式:实现信号变化的自动通知
2.算法优化
(1)拓扑排序算法的实现
(2)循环依赖检测算法
3.测试方法
(1)单元测试框架的使用
(2)边界条件测试设计
4.并发编程
(1)考虑多线程环境下的信号传播
(2)线程安全的缓存设计
三、心得体会
这三次作业让我深刻体会到软件工程不仅仅是写代码,更重要的是设计。从第一次的简单逻辑门,到第三次的子电路和异常检测,每一步都在考验我们对系统架构的理解。
特别是第三次作业,当需要同时处理子电路嵌套和异常检测时,我发现好的架构设计可以极大地降低实现难度。如果一开始就按照组合模式设计,后续的扩展会顺畅很多。
未来展望:希望能在后续的学习中,将这套电路模拟系统进一步完善,添加更多的设计模式支持,并考虑将其扩展为通用的数字电路仿真工具。
浙公网安备 33010602011771号