第二次总结
一、前言
本次作业集(第4~6次)围绕“数字电路模拟程序”进行迭代开发,从基础门电路到子电路、异常处理,逐步完善一个可运行的电路仿真系统。
知识点:面向对象设计(组合模式)、电路信号传播算法、异常检测、输入解析、子电路封装。
题量:三次作业共实现九种基本门电路(与、或、非、异或、同或),新增子电路定义与引用、五种异常检测,代码量约600~800行。
难度:逐步递增。基础门电路较简单,子电路引入组合模式,信号传播需递归迭代;异常检测需处理多种优先级冲突,解析复杂度提升。
通过这三次作业,深入理解了组合模式在分层结构中的应用,掌握了信号传播算法(拓扑排序+迭代),并强化了异常处理和输入解析的能力。
二、设计与分析
2.1 整体架构(类图)
采用组合模式,将基本门电路(Gate)和子电路(SubCircuit)统一为抽象组件 Component,主电路 Circuit 管理所有组件和连接。

2.2 核心设计解析
(1) 组合模式(Composite Pattern)
Component 抽象类定义统一接口:evaluate()、isReady()、renderOutput()、getOutputPins()。
Gate(叶子节点)实现基本逻辑门,输入引脚固定,输出引脚唯一。
SubCircuit(复合节点)包含子组件和内部连接,对外暴露输入/输出引脚,内部递归计算。
心得:组合模式使得主电路可以无差别地对待基本门和子电路,简化了信号传播和输出收集逻辑。
(2) 信号传播算法
采用迭代传播(类似拓扑排序),直至所有信号稳定:
将外部输入值写入目标元件的 values 映射。
循环评估所有元件:
每个元件读取其输入引脚的值,计算输出并存入自己的 values。
将输出值通过连接列表传播到后续元件的输入引脚。
若某次循环没有任何新值产生,则结束。
心得:该算法能处理组合逻辑环路(虽题目未要求,但可扩展),且实现简单,调试方便。
(3) 子电路信号映射
子电路内部使用内部引脚名(如 A、C)存储信号。
对外暴露外部引脚名(如 C1-A、C1-C)用于主电路连接。
在 evaluate() 中,外部输入先写入内部名,内部输出再映射回外部名。
心得:这种内外分离的设计清晰,避免了命名冲突,也方便子电路复用。
(4) 异常检测(按优先级)
在 Circuit.addConnection() 中依次检查:
多个输出引脚(0号引脚数量 > 1)→ include more than one input
无输出引脚且第一个不是有效源 → include none input
无目标引脚(连接信息只有源)→ include none output
第一个不是源(顺序错误)→ input and output sequence error
目标引脚冲突(同一目标被多个源驱动)→ input signal conflict
心得:优先级明确,实现时需注意:外部输入(无-)和子电路引用(如C1-A)也应视为有效源。
三、采坑心得
3.1 NumberFormatException 异常
问题:在解析连接信息时,对 A 这样的外部输入直接调用 Integer.parseInt() 导致异常。
![]()
解决:先判断 token 是否包含 '-',若不包含,则视为外部输入,不计为输出引脚。
测试:样例4(连接无输入)通过。
3.2 子电路输出空白
问题:子电路内部元件计算正确,但主电路无法获取输出值。
原因:子电路的外部输出引脚(如 C1-C)未与内部输出值关联。
解决:在 SubCircuit.evaluate() 末尾,将内部输出引脚值复制到外部名("C"+id+"-"+inner),存入 values。主电路连接即可识别。
3.3 信号传播不完整
问题:外部输入直接赋值给子电路,但子电路内部连接可能未被触发。
解决:在 Circuit.run() 中,先处理所有输入到目标的直接赋值(不经过连接),然后进入迭代传播。迭代中,每个元件评估后立即传播输出,确保级联更新。
3.4 排序混乱
问题:输出顺序不符合要求(A,O,N,X,Y排序,同类型按编号)。
解决:在 collectOutputs() 中先收集所有输出字符串,然后按元件类型和提取的编号排序。提取编号时,注意子电路前缀 Cid- 需要剥离。
四、改进建议
异常恢复:目前一旦检测到异常立即终止,可改为收集所有异常后一并输出,提高调试效率。
信号传播优化:当前迭代可能多次重复计算,可采用事件队列(事件驱动)仅更新受影响的元件,提升性能。
子电路嵌套支持:当前支持一层子电路,可扩展为嵌套子电路(子电路内部再包含子电路),需修改 findComponentByPin 递归查找。
时序逻辑扩展:可增加寄存器、时钟等元件,支持时序电路模拟。
可视化接口:增加输出为图形(如波形图)或交互式调试功能。
五、总结
通过本次作业集,我收获颇丰:
设计模式实践:组合模式的应用使我深刻理解了“整体-部分”结构在递归场景下的优势。
信号传播算法:迭代传播虽然简单,但足以处理组合逻辑,为后续时序电路打下基础。
异常处理思维:按优先级检测异常,增强了防御性编程的意识。
代码组织能力:分离解析、逻辑、输出模块,使代码清晰易维护。
仍需进一步学习:
设计模式:如访问者模式(用于不同元件的差异化处理)。
并发模拟:数字电路本质上是并行系统,如何用多线程模拟更真实。
测试驱动开发:为每种元件编写单元测试,确保逻辑正确性。
本次作业不仅是编程训练,更是一次系统设计的实战,为后续复杂系统开发积累了宝贵经验。

浙公网安备 33010602011771号