pta04-06电路系统实验总结

2C7134062916FB431D21FDC3EAC927D8
---pta04

8FBD7E75D735805F56CA07E45891C93F
---pta05

9B6948C701BFF6D6C30992464B81BBD8
---pta06

面向对象数字电路模拟系统三次迭代作业总结

一、前言

本次课程连续完成三套数字电路模拟迭代PTA作业(oop4基础逻辑门、oop5新增带控制引脚组合器件、oop6子电路+异常校验),三次需求层层叠加、代码持续重构,完整走完小型模拟系统从基础功能到复杂扩展、容错校验的开发流程。
从最初仅实现五种基础逻辑门,到新增三态门、译码器、数据选择/分配器,最后引入子电路嵌套、全类型输入异常检测,需求不断扩充,代码架构也持续迭代优化。整个过程大量运用面向对象核心思想:接口、抽象类、继承、多态、工厂模式、组合模式,同时结合集合、循环迭代信号传播、自定义排序、输入文本解析等知识点,也踩了大量设计、逻辑、边界bug,让我直观理解SOLID设计原则的实际作用。
三次作业代码规模起伏变化,oop4基础版代码量最少,oop5新增元件后代码大幅膨胀,oop6引入子电路重构后精简冗余代码;复杂度、注释率、类数量随需求迭代动态变化,每一次迭代都在为上一版设计缺陷补全优化方案。

二、设计与分析

2.1 三次作业需求迭代对比

1. oop4(第一次迭代)
仅实现与、或、非、异或、同或五种基础逻辑门;无控制引脚、无多输出器件、无子电路、无异常报错;仅解析全局输入、引脚连线,迭代传播信号,按类型+编号排序输出有效元件输出电平。
核心难点:统一解析不同格式元件名(A(2)1/X1)、通过List存储引脚键值对、多轮循环完成信号传递、封装通用门计算逻辑。
2. oop5(第二次迭代)
在基础门之上新增4类器件:三态门、译码器、数据选择器、数据分配器;引入控制引脚,区分控制/输入/输出引脚,器件引脚编号规则重构;新增高阻无效状态、多输出引脚器件,输出规则差异化(译码器输出有效引脚编号、分配器用-标记无效引脚)。
架构升级点:统一抽象器件计算接口,新增器件工厂类,通过工厂统一创建不同类型门电路,避免大量if-else创建对象。
3. oop6(第三次迭代)
最大改动两点:支持子电路嵌套、完整异常输入检测;引入组合模式,子电路与普通逻辑门统一抽象为电路组件;增加多优先级异常判断,识别连线多输出、无输入、引脚信号冲突、顺序颠倒等错误;子电路可多层嵌套,输出需要携带子电路编号前缀。

2.2 代码指标分析

1. oop4基础版:代码行数少,仅21个类/接口,方法复杂度偏低;前期缺少注释,模块耦合度高,输入解析、信号传播、元件创建全部堆在Main主类,单一类职责过多。
2. oop5扩展版:新增四类器件,类数量上涨至26个,注释量大幅提升;引入工厂模式拆分元件创建逻辑,降低对象创建耦合;但引脚状态统一用null表达“无效/未连接/高阻”,语义混杂,调试困难,信号传播依靠固定次数循环暴力迭代。
3. oop6综合版:重构大量重复代码,代码行数回落至560行左右,类数量稳定;新增子电路、异常校验逻辑,单一方法复杂度飙升,输入解析、子电路递归处理、异常判断集中在主流程;复用组合模式统一管理普通元件与子电路,拆分引脚状态标识,区分“无信号”“高阻无效”两种状态。

2.3 整体类结构与UML设计思路

1. 顶层 Gate 接口:统一规范所有电路组件行为,定义获取编号、名称、计算输出的标准方法,所有门、子电路都实现该接口,满足多态调用。
2. 抽象父类 BaseGate :实现Gate接口,封装通用属性(编号、名称、输入引脚数量)、通用工具方法(根据引脚名查找对应电平),所有实体门继承此类,抽取公共逻辑,减少代码重复。
3. 实体逻辑门类:AndGate、OrGate、NotGate、XorGate、XnorGate,重写calculate方法实现各自逻辑运算;oop5新增SGate(三态)、MGate(译码器)、ZGate(选择器)、FGate(分配器),各自重写差异化计算输出规则。
4. Link连线类:存储信号源引脚、多个目标输入引脚,统一管理电路信号传递关系。
5. SubCircuit子电路类(oop6新增,组合模式Composite):同样实现Gate接口,内部持有独立元件集合、输入输出映射,可像普通门一样嵌入主电路,支持递归解析、递归计算信号。
6. Main主程序:负责文本输入解析、全局引脚电平存储、连线遍历传播信号、元件排序、异常检测、结果打印;封装工具方法:引脚值修改、元件冒泡排序、批量输出元件结果。

2.4 核心设计模式应用

1. 工厂模式(oop5引入)
新增器件后,通过GateFactory统一根据元件标识符创建对应门对象,新增器件仅需新增实体类+注册工厂,无需修改大量分支判断,符合开闭原则。
2. 组合模式(oop6子电路)
普通门为叶子组件,子电路为复合组件,二者实现同一Gate接口,上层信号传播、排序、输出逻辑无需区分普通元件与子电路,统一递归处理,完美适配子电路嵌套需求。
3. 抽象多态
所有门共用calculate统一计算接口,遍历元件集合时无需判断具体类型,直接调用方法即可获取输出,大幅简化信号计算循环代码。

三、三次迭代踩坑心得

(一)oop4 基础逻辑门阶段

1. 元件名字符串解析漏洞
最开始直接截取单个字符判断元件类型,未考虑A(2)1这种带括号输入数的格式,拆分引脚名称时频繁数组越界;后期改用indexOf截取括号内数字,才兼容两种元件命名规则。
2. 缺少空值判断,频繁空指针
引脚未接入信号时直接调用equals运算,程序直接崩溃;未做前置判空,所有门计算逻辑先校验引脚是否存在有效电平,不存在直接返回null忽略输出。
3. 信号仅传播一次,多级电路计算错误
最初只遍历一轮连线传递信号,多级串联门无法获取上游更新后的电平;改为循环迭代多轮,直到信号稳定,解决多级电路输出错误。
4. 排序逻辑冗余
每类门单独写遍历排序代码,后期封装通用冒泡排序方法,统一对List按编号升序排列。

(二)oop5 新增控制引脚组合器件阶段

1. null语义混淆,高阻态无法区分
用null同时代表“未接线”和“三态门高阻无效”,译码器、分配器输出判断逻辑混乱;优化后新增独立标识区分有效0/1、未连接、高阻无效三种状态。
2. 多输出器件输出格式不统一
基础门仅输出0号引脚,译码器、数据分配器输出规则完全不同,最初混写在同一打印方法中;拆分差异化打印分支,根据元件类型执行对应输出格式。
3. 固定循环迭代传播效率低
硬编码最大迭代轮次,极端长电路会计算不全,循环次数过多造成超时;但受限于知识储备,未使用拓扑排序优化,只能靠增加迭代次数兜底。
4. 控制引脚、输入引脚编号混淆
译码器、三态门引脚区分控制/输入/输出,最初直接按顺序硬编码引脚号,修改需求时全量改动;封装方法根据器件类型自动区分引脚功能。

(三)oop6 子电路+异常校验阶段

1. 子电路引脚映射匹配错误
子电路自定义输入输出别名(C2-A、C2-B),无法正确匹配内部元件引脚;新增映射表存储子电路别名与内部真实引脚对应关系,递归传递电平。
2. 异常优先级处理混乱
同一连线同时存在多条异常,最初不分优先级同时输出多条错误;按照题目给定优先级顺序依次判断,出现高优先级异常直接截断,仅输出第一条错误。
3. 输入引脚多信号冲突检测遗漏
未记录每个输入引脚绑定的信号源,多条连线驱动同一引脚时无法识别冲突;新增Map记录引脚对应的信号源,每次连线前校验是否已存在驱动源。
4. 子电路递归计算重复遍历
嵌套子电路会重复计算内部元件,造成输出重复;计算时标记已更新元件,避免重复运算。
5. 输入输出顺序判断逻辑出错
连线第一个元素为信号源,其余为目标输入,写反判断逻辑导致大量正常连线误报顺序错误;拆分第一个元素与剩余元素单独校验。

四、迭代改进建议

4.1 oop4基础版优化方向

1. 拆分单一Main大类,抽取InputParser输入解析类、CircuitManager电路管理类,主类仅负责调度,符合单一职责,避免上千行代码堆积。
2. 统一使用工厂模式创建门对象,消除大量if else分支判断元件类型。
3. 提前设计引脚状态枚举,不用null多语义混用,提前区分未连接、0、1三种状态,为后续扩展器件预留空间。
4. 增加注释,标注元件解析、信号传播核心逻辑,方便迭代修改。

4.2 oop5扩展器件优化方向

1. 放弃固定次数暴力循环传播信号,使用图论拓扑排序,按信号依赖顺序一次性计算,提升运行效率、杜绝迭代次数不足问题。
2. 封装引脚Pin独立类,单独存储引脚编号、类型、当前电平、连接状态,代替单纯List存储键值对,结构更清晰。
3. 统一输出打印接口,由各类门自行实现输出字符串方法,主程序无需大量if判断区分输出格式。

4.3 oop6子电路&异常校验优化方向

1. 单独封装异常检测工具类,统一处理所有连线错误校验逻辑,主流程代码更简洁。
2. 完善组合模式递归逻辑,统一顶层电路与子电路传播、排序、输出接口,消除重复递归代码。
3. 自定义业务异常类,区分冲突、格式错误、无输入等异常,代替零散字符串错误提示,方便后期拓展异常类型。
4. 增加输入文本预处理,提前过滤空行、多余空格,减少解析时的容错判断。

五、整体实验总结

三次数字电路迭代作业完整锻炼了面向对象程序设计能力,从简单实体继承到工厂、组合设计模式落地,让我明白抽象、封装、多态不只是理论概念,而是解决需求持续扩展的实用工具。
前期开发存在“先写代码后设计”的问题,每次迭代都要大量重构上一版代码;如果前期梳理好引脚结构、组件抽象、模块划分,能省去大量调试、重构时间。同时大量边界bug让我意识到完备的输入校验、空值判断、状态区分是程序稳定运行的关键。
本次作业综合运用集合、字符串处理、循环迭代、排序、递归、多态等知识点,同时结合数字电路硬件逻辑,实现软件模拟硬件电路运行。不足之处在于信号传播采用暴力循环,没有使用拓扑排序优化,代码复用性仍有提升空间。后续可以继续拓展时序电路、文件持久化存储电路、可视化电路绘图等功能,进一步完善项目。
通过不断重构、排错、迭代优化,我真正理解SOLID设计原则的实际价值,学会分层、分模块思考程序架构,不再写出高度耦合、难以修改的“一坨式”代码,编程思维得到明显提升。

posted @ 2026-06-24 22:36  ZestJadeLapse  阅读(2)  评论(0)    收藏  举报