作业集4~6的总结性Blog
前言
三次迭代作业基础信息汇总表
| 作业版本 | 核心新增知识点 | 总测试用例规模 | 个人得分 / 满分 | 整体难度梯度定位 |
|---|---|---|---|---|
| 版本1(基础门电路) | 二进制逻辑运算、信号单向传播、基础词法解析、元件工厂创建、拓扑信号传递 | 6组样例,34个基础测试点 | 100/100 | 入门级:线性拓扑、无多引脚控制、无复合元件,业务逻辑单一 |
| 版本2(组合器件扩展) | 三态门、译码器、数据选择器 MUX、数据分配器 DEMUX;区分控制引脚 / 数据输入引脚;多输出引脚器件差异化输出格式;高阻无效态处理 | 10 组样例,34 个测试点,多组合电路 / 复杂电路用例 | 72/100 | 进阶级:多类型引脚、多输出器件、分支拓扑,输出格式分支逻辑复杂,多处用例答案错误、非零退出 |
| 版本3(子电路 + 异常校验) | 组合设计模式 Composite、子电路嵌套封装、全局 / 局部两层信号域、5 类连接异常优先级校验、引脚冲突检测、分层信号传播 | 8 组样例,43 个测试点,分单子电路 / 多子电路 / 异常三大类用例 | 73/100 | 高阶:分层拓扑、跨层级信号映射、异常检测优先级、子电路隔离计算,大量多子电路用例答案错误 |
(1)阶段整体学习目标说明
课程迭代设计目标:从单一叶子逻辑元件→多引脚组合器件→Composite 复合子电路,逐步模拟真实数字电路分层设计,同时配套输入语法校验、电路拓扑仿真、信号传播算法三大工程能力训练。
(2)自身完成情况总述
版本 1 完全通过全部测试点,证明基础逻辑门、信号传播、词法解析的基础架构设计无致命缺陷;版本 2、版本 3 存在大量复杂电路、多器件、多子电路测试用例答案错误,少量程序非零退出,暴露分层信号域隔离、多输出器件编码、子电路跨端口映射、仿真迭代收敛四大核心架构缺陷,也是本次复盘重点。
(一)设计与分析
本节分别对三轮迭代的源码架构、类结构、业务流程进行拆解,结合 PowerDesigner 类图、业务流程图、自身代码实现逻辑进行优缺点分析,结合测试得分数据佐证架构设计带来的优劣影响。
迭代 1:基础逻辑门仿真程序(满分 100)
1.1.1 整体分层架构设计
迭代 1 采用四层分层解耦架构,分层边界清晰,各层单向依赖,无循环耦合:
1.抽象接口层:ILogicCore统一规范所有逻辑元件行为,定义引脚赋值、输出计算、就绪判断、元件标识、编号排序等通用方法,实现元件行为标准化;
2.叶子元件实现层:与门、或门、非门、异或门、同或门分别实现接口,内部独立维护自身引脚存储、赋值状态、输出缓存;
3.仿真核心层:CircuitSystem承载全局输入信号、元件注册表、扇出连接映射表,封装信号迭代传播、元件注册、引脚信号匹配全流程;
4.工具服务层:InputParserService独立负责文本输入解析,OutputService负责元件排序与标准化输出,将输入处理、输出格式化与仿真核心完全解耦。
1.1.2 plantUML 类图解读

类图核心关系说明:
ILogicCore作为顶层抽象接口,五个基础门类全部实现该接口,属于实现关系;
CircuitSystem聚合ILogicCore实例、输入信号 Map、扇出连接 Map,持有全局电路全部状态;
InputParserService依赖CircuitSystem完成元件自动创建、引脚连接注册;
OutputService无状态工具类,仅接收元件列表完成排序、输出打印,无状态依赖。
该架构核心优势为开闭原则适配性极强,后续新增逻辑门仅需新增ILogicCore实现类,仿真、解析、输出四层代码无需任何修改,这也是迭代 1 全部 34 个测试用例一次性通过的核心底层支撑。
1.1.3 仿真业务执行流程

完整执行链路:逐行读取输入→Parser 解析 INPUT 全局信号 /[] 连接语句→自动实例化对应逻辑门、注册引脚映射→CircuitSystem 循环迭代传播信号直至无电平变更→OutputService 按元件类型、编号升序排序→逐行打印有效元件输出。
信号传播采用变更标记循环收敛算法,而非固定遍历轮次,能够自适应任意深度串联电路,彻底解决多级门信号无法逐层传递的问题,从根源规避拓扑深度带来的仿真失真。
1.1.4设计亮点与预埋缺陷
设计亮点:
(1)接口隔离,元件行为统一标准化,上层仿真层无需感知门类型;
(2)输入、仿真、输出三层完全解耦,单一模块修改不会影响其他业务;
(3)迭代收敛仿真算法无硬编码限制,适配任意单层电路拓扑。
预埋架构缺陷(为迭代 2、3 失分埋下隐患):
(1)ILogicCore接口仅适配单输出引脚、无控制引脚、输出格式统一的基础门,未预留多输出、无效高阻态、差异化输出字符串的扩展方法;
(2)全局仅存在单一信号存储 Map,无分层域隔离机制,无法支撑后续子电路局部仿真环境;
(3)元件创建逻辑分散在 Parser 内部,存在大量 if-else 分支,不符合工厂模式设计思想,新增元件时解析层需要同步修改代码。
迭代 2:多类型组合器件扩展程序(得分 72/100)
1.2.1架构调整内容
基于迭代 1 的接口进行破坏性扩展,修改ILogicCore接口,新增getOutputStr()差异化输出方法、hasValidOutput()有效输出判断方法,用于适配译码器、多路选择器、三态门的特殊输出规则;新增TriStateGate三态门、Decoder译码器、Mux数据选择器、Demux数据分配器四类复合器件实现类;保留单层Circuit全局仿真容器,未引入分层信号域设计。
1.2.2 类结构与业务逻辑缺陷分析

从类图可以直观发现本次迭代架构设计的妥协与短板:
(1)原有统一接口被强行扩展,各器件getOutputStr()输出格式化逻辑分散在各自实现类中,无统一工具封装,不同器件输出规则重复编码,极易出现格式 bug;
(2)全局仅一套连接映射表、一套信号缓存,控制引脚、数据引脚、输出引脚的区分逻辑完全写死在器件内部assignPin方法中,无统一引脚类型枚举;
(3)信号传播采用固定 20 轮迭代循环,未沿用迭代 1 的变更标记收敛算法,属于为快速开发简化逻辑,直接导致复杂多级电路信号未稳定就终止仿真。
结合 PTA 测试结果,该架构缺陷对应明确失分用例:
(1)固定 20 轮迭代:case8、case20、case23 复杂多级电路答案错误;
(2)译码器二进制高低位计算逻辑写反:case8 译码器样例输出编号完全颠倒,0 分;
(3)引脚数字转换无异常捕获:case28、case30 出现 NumberFormatException,程序非零返回,直接判 0 分;
(4)Demux 输出字符填充顺序错误:case10 分配器输出字符颠倒,部分边界用例失分。
1.2.3 迭代 2 开发心得
本次迭代暴露出增量开发的典型误区:仅在原有代码基础上新增类、扩展接口,不重构底层仿真核心架构,旧架构的局限性会随着业务复杂度提升持续放大。单一全局信号域无法承载多输出、多控制引脚器件的差异化状态,分散式输出格式化代码缺少统一校验标准,调试、维护成本极高;同时为节省开发时间放弃成熟的收敛循环算法,采用固定轮次简化逻辑,看似缩短开发周期,实则引入大量难以定位的仿真逻辑 bug,最终测试通过率大幅下降。
1.3 迭代 3:子电路分层与异常校验程序(得分 73/100)
1.3.1 Composite 组合模式架构落地
本次严格遵循题目给出的组合模式 UML 图完成架构改造,引入两层核心抽象:
(1)Component顶层抽象:对应设计模式中的 Component,定义元件通用计算、引脚就绪、输出获取行为;
(2)Leaf 叶子节点:AndGate、OrGate、NotGate 等基础逻辑门,对应模式中的叶子组件,无内部子元件;
(3)Composite 复合节点:SubCircuit子电路类,内部聚合基础元件、局部连接映射、子电路输入输出端口,可嵌套多层子电路;
新增Pin实体类统一封装所有引脚标识,包含子电路编号、元件名称、引脚数字三元属性,彻底区分顶层引脚、子电路内部引脚、子电路端口引用;新增连接语句校验逻辑,按题目规定优先级检测五类输入异常。

此图为设计建议类图

从类图对比可见,本人代码完整贴合 Composite 模式分层思想,SubCircuit作为复合容器持有内部全部基础元件,独立维护局部连线与局部信号映射,理论上支持任意层数子电路嵌套;异常校验模块独立抽取check()方法,严格按照题目给定异常优先级顺序判断,因此全部异常类测试用例(case30~case43)全部满分通过。
1.3.2 致命架构缺陷与对应失分用例
虽然分层设计思路符合需求,但分层仿真域的同步逻辑存在根本性漏洞,直接导致单子电路、多子电路类大量用例判错(case6/8/9/10/11/14/19/20/23/26/28/29 全部 0 分),核心缺陷共四点:
(1)全局与局部信号单向同步:仿真循环仅将子电路局部计算结果写入全局信号 Map,顶层全局更新后的电平无法回传给子电路重新计算,多层嵌套子电路无法完成二次迭代收敛;
(2)子电路端口批量信号分发缺失:子电路 INPUT、OUT 端口仅做一对一字符串映射,未遍历扇出连接批量分发端口信号,内部元件存在输入缺失;
(3)仿真循环固定 100 轮,未复用变更标记收敛机制,深层嵌套子电路内部信号传递不完整;
输出字符串拼接存在多余空格,输出格式与样例不匹配,格式类判错。
1.3.3 迭代 3 开发心得
Composite 组合模式能够完美匹配子电路分层设计需求,但分层仿真域双向数据同步是该架构实现的核心难点。仅完成类结构分层远远不够,必须配套全局、局部仿真环境的双向刷新、统一迭代收敛算法;本次开发重心全部放在异常校验、类结构改造上,忽略多层域数据同步逻辑调试,导致异常模块满分、核心子电路仿真大面积失分,开发优先级分配存在严重偏差。
(二)采坑心得(数据、测试用例、源码结构支撑)
三轮迭代踩坑分为基础调试坑、组合器件扩展坑、子电路分层架构坑三类,所有坑点均绑定对应测试用例得分、代码底层逻辑、复现场景,杜绝空泛描述。
2.1 迭代 1 基础调试踩坑
(1)坑点 1:单次遍历信号无法传递多级串联电路
现象:最初仿真逻辑仅单次遍历扇出表,多级与门串联用例输出全部为 0,样例 4、5 测试不通过;
代码根源:无循环收敛逻辑,仅传递原始输入信号,逻辑门计算后的输出电平无法二次赋值给下游引脚;
解决方案:增加布尔标记循环,本轮存在电平变更则持续迭代,直至无信号变化;
感悟:数字电路属于有向图拓扑,信号具备逐级传递特性,单次遍历仅能处理深度为 1 的电路,迭代收敛是仿真程序必备基础算法。
(2)坑点 2:元件名称字符串硬截取导致实例化错误
现象:A (2) 1、A (2) 2 两个与门被识别为同一个元件,编号截取下标固定;
代码根源:使用固定下标 substring 截取括号内输入数、门编号,未使用正则匹配结构化文本;
解决方案:替换正则表达式精准匹配元件标识符、参数、编号;
感悟:结构化文本解析禁止硬编码字符串下标,正则匹配能够适配可变长度标识符,降低解析 bug 概率。
2.2 迭代 2 组合器件核心踩坑(72 分,10 + 用例失分、2 用例程序崩溃)
(1)坑点 1:译码器地址高低位计算颠倒,case8 0 分
现象:输入编码 00,预期输出引脚 0,程序输出引脚 3;
代码根源:遍历地址数组顺序从低位向高位计算二进制值,与题目硬件 74LS138 译码器引脚定义完全相反;
复现场景:3-8 线译码器控制引脚正常工作、输入编码 00;
感悟:硬件器件引脚高低位顺序必须严格对照题目硬件图,不能依靠主观直觉编写编码转换逻辑,新增硬件器件必须单独编写小样例单元测试。
(2)坑点 2:固定 20 轮迭代,复杂多级电路仿真失真,case20、case23 0 分
现象:多级 MUX 串联电路输出电平随机波动,与预期不符;
代码根源:放弃迭代 1 成熟的变更标记循环,简化为固定 20 轮遍历,部分深度超过 20 层的电路信号未完全传递就终止仿真;
感悟:开发简化逻辑会带来不可逆的仿真缺陷,基础收敛算法不能随意替换,任何简化操作都需要配套全量测试验证。
(3)坑点 3:输入解析无数字转换异常捕获,case28、case30 非零退出
现象:测试用例包含非法引脚编号字符串,执行parseInt直接抛出未捕获异常,程序提前终止,PTA 判定非零返回;
代码根源:引脚数字转换无 try-catch 异常处理,输入鲁棒性不足;
感悟:输入解析层属于程序入口,必须全量捕获数值转换、分割、匹配各类异常,保证程序不会因非法输入崩溃。
(4)坑点 4:Demux 输出字符填充顺序错误,分配器边界用例失分
现象:sel 控制编码选中输出引脚 2,预期第三位字符为有效电平,程序第二位显示有效电平;
代码根源:sel 索引与输出数组下标映射反向;
感悟:多输出器件的格式化输出逻辑独立、繁琐,需要单独拆分测试用例逐引脚校验,不能直接集成全量测试。
2.3 迭代 3 子电路分层核心踩坑(73 分,多子电路用例大面积 0 分)
(1)坑点 1:全局与局部信号单向同步,多层子电路计算失真,case8、26、28 全部 0 分
现象:顶层全局输入电平修改后,子电路内部元件输出无变化;
代码根源:仿真循环仅将子电路局部信号写入全局,不会把全局最新电平回传给子电路重新执行 propagate 传播;
感悟:分层复合架构下,全局域、局部域必须双向同步,每一轮仿真所有子电路都需要重新加载全局最新信号,完成局部传播与元件计算。
(2)坑点 2:子电路端口信号批量分发缺失,单子电路内部元件输入不全,case6 0 分
现象:子电路 INPUT 端口绑定顶层信号,但内部逻辑门引脚无赋值,判定输入未就绪直接忽略输出;
代码根源:仅保存端口映射关系,未遍历扇出连接批量分发端口电平;
感悟:子电路输入输出端口本质是顶层与局部引脚的桥接器,桥接逻辑需要完整遍历所有下游引脚,不能仅存储一对一映射。
(3)坑点 3:输出字符串多余空格,格式不匹配判错,case2 样例失分
现象:预期输出C1-N1-0:1,程序输出C1-N1-0 :1,多出空格;
代码根源:输出拼接逻辑手动添加空格,无统一格式化工具约束;
感悟:所有输出字符串规则统一抽离工具类封装,避免手写拼接带来的格式偏差。
(4)坑点 4:子电路局部传播仅单次遍历,无收敛循环,case9、10 单子电路失分
现象:子电路内部多级门串联输出电平错误;
代码根源:局部 propagate 仅单次遍历连线,未复用全局的变更标记收敛循环;
感悟:全局、局部仿真环境必须复用同一套信号传播算法,保证单层、分层电路仿真逻辑完全一致。
2.4 三轮迭代共性踩坑总结
架构层面核心问题:增量开发时倾向在原有代码上叠加功能,不愿重构底层仿真引擎,旧架构的局限性随业务复杂度持续放大,是迭代 2、3 大量失分的根本原因;
编码规范问题:差异化业务逻辑(输出格式化、引脚映射、编码转换)分散在各类实现中,缺少统一工具类封装,重复编码极易产生细节 bug;
开发流程短板:无单元测试习惯,新增器件、分层逻辑后直接运行全量测试用例,微小逻辑缺陷批量堆积,定位调试成本极高;
算法取舍误区:为简化开发放弃成熟、通用的迭代收敛算法,采用固定轮次等简化方案,短期节省时间,长期引入难以修复的仿真逻辑漏洞。
(三)可持续改进建议
结合三轮迭代暴露的架构、编码、工程流程缺陷,从底层仿真引擎、器件分层、子电路 Composite 架构、工程规范、异常校验五个维度提出可落地、适配后续迭代 4 开发的可持续改进方案。
3.1 底层仿真引擎统一重构
抽离通用SignalSimulator仿真引擎类,封装统一的变更标记 propagate 收敛方法,顶层电路、每个子电路独立持有一个仿真实例,全局、局部仿真逻辑完全复用,彻底消除局部单次遍历、固定轮次等失真问题;
设计SignalDomain信号域抽象类,隔离顶层域、子电路局部域,提供双向同步接口,顶层电平变更可一键同步至所有子电路局部域,解决单向同步漏洞;
彻底移除所有固定迭代轮次代码,全场景统一使用 “电平变更标记” 循环收敛,自适应任意深度、任意层数电路拓扑。
3.2 器件层规范化重构
新增GateFactory器件工厂类,统一根据元件标识符生成对应器件实例,消除 Parser 内部冗长 if-else 分支,新增器件仅需在工厂完成注册,符合开闭原则;
抽离OutputFormatter输出格式化工具类,封装基础门、三态门、译码器、MUX、Demux、子电路元件全部输出规则,统一过滤无效输出、标准化字符串拼接,杜绝手写格式偏差;
新增PinParser引脚解析工具,统一封装正则匹配、异常捕获、子电路标识拆分逻辑,所有输入、连接语句调用统一解析方法,消除硬编码下标、裸数字转换异常。
3.3 Composite 子电路架构优化
SubCircuit实现顶层Component接口,与基础逻辑门统一调度,仿真引擎无需区分叶子 / 复合元件,兼容多层嵌套、子电路重复引用;
独立封装PortBridge端口桥接器,自动完成顶层引脚与子电路内部引脚的批量信号分发,完整遍历扇出列表,解决端口信号遗漏问题;
增加子电路缓存池,重复引用同一编号子电路仅实例化一次,降低大规模多层电路的内存占用,提升仿真运行效率。
3.4 工程化开发规范优化
代码分包分层:按照职责拆分 entity 引脚实体包、gate 器件实现包、sim 仿真引擎包、parse 输入解析包、util 通用工具包、exception 自定义异常包,消除单文件类堆积,代码可读性大幅提升;
搭建自定义异常体系:创建解析异常、引脚冲突异常、器件未定义异常等细分业务异常,替代通用裸 try-catch,报错信息精准可读,快速定位输入语法错误;
引入单元测试模块:针对每一类器件、单子电路、多子电路、各类异常场景编写独立测试用例,新增功能前先完成单元测试验证,避免全量测试批量报错;
新增仿真日志工具:打印每轮电平变更、子电路计算状态、引脚赋值记录,调试复杂分层电路时快速定位信号丢失节点,缩短 bug 定位时间。
3.5 输入异常校验模块优化
当前异常校验逻辑集中在主流程中,后续抽离独立CircuitValidator校验器类,统一封装连接语法、引脚多驱动冲突、输入输出顺序校验逻辑,支持迭代 4 新增更多异常类型时仅扩展校验方法,无需修改主仿真流程,校验逻辑与仿真业务解耦。
(四)阶段综合性总结
4.1 阶段学习收获
经过三轮数字电路仿真迭代开发,本人在面向对象设计、离散系统仿真、结构化文本解析三大核心领域获得完整实践落地经验:
设计模式落地实践:熟练掌握接口隔离原则、工厂模式、Composite 组合模式,能够根据业务分层需求设计叶子 - 复合嵌套架构,理解模块化工程软件分层设计核心思想;
离散系统仿真算法:掌握有向图拓扑信号迭代收敛算法、分层仿真域数据同步机制,能够区分单层、多层电路仿真的实现差异;
结构化文本处理:熟练使用正则完成自定义语法解析,掌握多优先级异常校验、非法输入鲁棒处理的实现思路;
缺陷复盘思维建立:能够依托 PTA 测试用例得分、运行截图反向定位底层架构、业务逻辑缺陷,摒弃只追求功能实现、忽视测试结果的开发思维,学会以测试数据驱动代码优化迭代。
4.2 现存能力短板与后续研究方向
复盘三轮作业失分根源,本人存在四点明显能力短板,是后续重点学习研究方向:
大型项目架构重构能力不足:开发时习惯增量叠加代码,缺少重构底层通用引擎的意识,旧架构限制新业务扩展;后续学习分层软件重构方法论,练习从单一模块拆解为通用引擎的改造思路;
单元测试开发意识薄弱:开发流程为先完成完整代码,再跑全量测试,微小逻辑缺陷累积后难以定位;后续系统学习 JUnit 单元测试框架,建立测试先行的开发习惯;
多层级容器数据同步逻辑设计薄弱:复合模式下全局、局部双向状态同步极易出现漏洞,后续多练习嵌套容器、分层数据映射类编程;
异常体系设计不规范:仅使用通用 Exception 捕获所有错误,报错信息模糊;后续系统学习 Java 自定义异常体系,实现分层、细分业务异常捕获。
4.3 长期学习规划
针对本次复盘梳理的全部缺陷,在后续迭代 3 时序电路、迭代 4 子电路扩展开发中落地改进方案:优先完成通用仿真引擎重构、工程分包改造、单元测试模块搭建,从底层架构解决分层信号同步、仿真失真、输出格式偏差等历史 bug;同时在开发流程中强制新增功能先编写单元测试,避免再次出现大面积测试用例失分,将本次复盘总结的架构优化、编码规范、开发流程改进方案完整落地实践,持续提升面向对象工程开发能力。

浙公网安备 33010602011771号