数字电路模拟程序 作业集 4~6 总结博客

一、前言

本次作业集 4、5、6 围绕数字电路仿真程序完成迭代开发,是面向 Java 面向对象编程、组合逻辑电路模拟的综合性实践任务,三次作业循序渐进、难度逐步提升,整体聚焦逻辑门器件建模、电路信号传输、复杂组合器件拓展三大核心方向。
从题量来看:作业集 4 为基础版数字电路仿真,仅实现五类基础逻辑门(与门、或门、非门、异或门、同或门),包含基础输入解析、引脚连线、电平运算、结果输出等基础题型,共覆盖基础用例 10 组左右;作业集 5 在基础门电路之上,新增三态门、译码器两类带控制引脚的组合器件,拓展了引脚分类(控制脚、输入脚、输出脚)规则,样例数量增至 10 组,增加了控制逻辑判断、多引脚区分等考点;作业集 6 为最终迭代版本,继续补充数据选择器、数据分配器两大器件,完善九类完整数字电路元件体系,同时强化格式校验、引脚排序、特殊输出规则、无效器件过滤等细节要求,总计 8个测试用例,覆盖正常输入、缺引脚、控制无效、多级连线、特殊输出格式等场景。

从难度梯度分析:

作业集 4(入门难度):核心难点为字符串解析、引脚信号传递、基础逻辑运算,主要考察 Java 集合使用、字符串分割、面向对象简单建模,语法门槛低,侧重业务逻辑理解;
作业集 5(较高难度):引入控制引脚概念,区分控制脚 / 输入脚 / 输出脚,新增器件多状态判断(三态门高阻态、译码器使能条件),难点在于引脚编号映射、多类型引脚数据存储、状态有效性判断;
作业集 6(高难度):九类器件全部落地,不同器件引脚规则、输出格式、编码逻辑各不相同,叠加器件命名解析、多级信号迭代、无效输出过滤、同类器件排序等约束,同时对代码规范性、鲁棒性、边界用例处理要求极高,是三次作业中综合难度最大的一次。
这次作业不断完善逻辑,不断迭代,而且电路的概念于现在的我们而言有些陌生,所以此系列的作业对我来说是一个挑战,因为要去理解学习一个未知的东西。
整体来看,三份作业形成了完整的学习链条:从最简单的基础逻辑运算,到带控制端的组合器件,再到全套数字组合电路模拟。不仅锻炼了 Java 代码编写、字符串处理、面向对象设计的能力,也结合了电路知识,属于理论和代码结合的综合实践任务。

作业集 4(基础逻辑门)

核心流程:读取所有输入内容 → 提取并创建所有逻辑门 → 解析外部电平与引脚连线 → 循环更新引脚信号 → 计算每个门电路的输出 → 排序后打印结果。
代码重点在字符串分割、集合使用和五种基础逻辑运算。当时为了省事,所有器件共用一套输入引脚逻辑,只能满足基础门使用,没法适配带控制端的元件。

SourceMonitor

屏幕截图 2026-06-12 204046

SourceMonitor图片数据分析

代码总行数: 250 行 行数适当,没有使用过于复杂的逻辑
有效执行语句: 202 条 器件分支、引脚刷新、电平迭代占用大部分语句,符合多器件仿真需求
分支占比: 33.2% 译码器、多路选择器、三态门差异化判断导致分支偏多,算是为了贴合业务
注释占比: 0.4% 仅保留极少量必要注释,所以代码的阅读性不高,这一点要改
类总数 : 4 个 枚举、器件实体、连线实体、主入口,四层结构清晰,无多余冗余类 ,而且一个功能一个类代码阅读性强,也满足单一原则
单类平均方法数: 3.25 功能拆分均衡,没有把全部逻辑堆在主类中,封装意识到位
单方法平均语句 : 13 行 方法长度可控,阅读、修改、排错都比较方便
这次用 SourceMonitor可从数据能直观看出我代码设计的优缺点。优点是方法拆分做得比较均衡,平均每个方法只有 13 行语句,调试 bug 时定位逻辑块很快;4 个类各司其职,没有把所有变量和运算全塞在 Main 主类里,做到了基础的封装。
但也暴露了明显短板:分支占比达到 33.2%,九类器件全靠大量 if-else 区分,代码可读性会随器件增加持续下降;所有代码都放在一个类里面,阅读性差,但此为使用平台要求,所以不做解读。

PowerDesigner

屏幕截图 2026-06-12 200214

PowerDesigner图片分析

下图是基于 PowerDesigner 绘制的项目整体 UML 类图,整套程序依托 Main 主类搭建,包含类型枚举、器件实体、连线实体三大内部模块,所有仿真流程封装为静态工具方法,清晰展示了外部输入、连线、逻辑器件三层数据的存储与从属关系。

踩坑心得

这类规则型题目,读题远比编码重要,引脚顺序、判断条件、输出格式差一个字符,结果就全错;而且一定要了解所有概念之后再做题,不要只顾着输出结果看,有时候输出结果对了,结果也不一定对。

改进建议

1.我打算用 Map 优化器件查询,动态终止电平循环,抽取重复代码,以此提升运行效率。
2.我会增加器件查重、输入异常捕获的逻辑,并提前预加载所有器件,避免出现报错、重复输出的问题。

作业集 5 新增三态门、译码器版本

在LogicUnit中新增控制引脚数组、控制引脚数量两个核心属性,区分控制脚、输入脚、输出脚;
补充三态门、译码器的器件创建逻辑、引脚映射逻辑、运算逻辑;
新增器件有效性判断:三态门控制脚为低电平时输出高阻(无效),译码器不满足使能条件时全部输出无效。

SourceMonitor

屏幕截图 2026-06-12 204131

SourceMonitor图片数据分析

文件数: 2 为适应适应平台
总行数: 657 新增三态门、译码器、MUX、DEMUX 四类器件,业务逻辑大幅扩充
有效语句: 613 多器件引脚判断、二进制编码、差异化输出逻辑增加大量执行语句
分支占比: 35.2% 器件类型判断分支进一步增多,圈复杂度小幅上升
方法调用数: 190 流程拆分更细,分层调用变多,代码复用性提升
注释占比: 0.2% 注释占比反而减小,不利于阅读
类总数: 8 拆分基础门、控制型器件、工具类,类分层更细致
单类平均方法: 5.75 每个类职责更完整
单方法平均语句: 11 方法拆分更细碎,单段逻辑更短,调试更容易
这是完整九类器件版本的代码度量数据,相比初版我拆分了更多类,拆分小方法便于调试,但器件判断分支占比达 35.2%,复杂度偏高,且几乎无注释不利于阅读。后续我会用多态简化分支,少量补充注释,精简冗余调用。

PowerDesigner

屏幕截图 2026-06-12 202506
枚举 GateType:完整包含 9 类器件标识,覆盖三次作业全部电路元件,用于区分器件运算逻辑。
核心实体 LogicUnit:新增控制引脚、多输出引脚数组与配套 get/set 方法,重载两套构造器,兼容基础门与带控制端组合器件,封装完整引脚读写操作。
连线实体 WireConn:存储信号源与目标引脚列表,封装数据读取方法,负责电路信号传递。
主类 Main:维护全局器件、连线、外部输入集合,封装输入解析、引脚刷新、电路迭代运算、结果打印全流程静态方法,内部承载枚举、两大实体类.

踩坑心得

1.分不清控制引脚与输入引脚,赋值时全部写进输入数组,三态门、译码器控制端电平一直无效,样例本该无输出却正常打印,大量用例失分。后来我按引脚编号区间区分两类引脚,分别赋值才修复。
2.译码器使能条件写反,误把 S1=1 写成 S1=0,所有译码测试用例全部报错,只能逐字对照题目文档修正判断逻辑。

改进建议

1.引脚赋值逻辑没有做类型区分,容易混淆控制引脚和输入引脚,我会单独封装引脚分配工具方法,按引脚区间自动分类赋值,避免判断遗漏。
2.迭代修改底层逻辑后没有回归测试,容易破坏旧功能,今后修改核心代码后会完整跑一遍所有旧测试用例。

作业集 6(全套组合器件)

最后补齐两类多路选择 / 分配器件,这两种器件都需要把控制引脚的电平组合成二进制编码,再根据编码选择通路。

SourceMonitor

屏幕截图 2026-06-12 203929

SourceMonitor图片数据分析

文件数 : 3 依旧为适应平台
总行数 : 1148 补齐 MUX、DEMUX 器件,完善边界、输出过滤逻辑,代码体量大幅扩充
有效执行语句: 1047 新增编码拼接、差异化打印、无效器件过滤等大量业务逻辑
分支占比 : 32.9% 新增器件后我拆分了部分判断逻辑,分支占比小幅回落,复杂度略有改善
方法调用次数: 402 大量重复逻辑抽取为公共方法,代码复用程度显著提升
注释占比: 0.4% 注释占比依旧偏低
类总数: 13 拆分工具类、细分器件相关实体,单一类职责更纯粹
单类平均方法: 6.15 每个类承载完整配套操作,不再将功能全部堆积在主类
相比作业 5,我重构了多层嵌套的引脚赋值逻辑,消除了深度嵌套,最大嵌套深度从 41 降到 6,大幅降低代码阅读与调试难度;拆分部分器件判断分支,分支占比、平均圈复杂度相比作业 5 出现回落,代码复杂度得到缓解。

PowerDesigner

image
枚举 GateType:
包含 5 种基础逻辑门常量:AND_GATE、OR_GATE、NOT_GATE、XOR_GATE、XNOR_GATE延续前面的两次作业电路零件
核心实体 LogicUnit:
存储器件编号、输入引脚数组、输出结果、器件名称、子电路标识;
连线实体 WireConn:
记录信号源引脚、目标引脚列表、原始输入文本。
子电路实体 Subcircuit:
存储子电路 ID、内部器件、连线、内外输入输出映射
主类 Main:
全局维护器件、连线、子电路、外部输入集合;封装器件创建查找、输入解析、引脚刷新、逻辑运算、打印输出全套静态方法,所有枚举、实体都作为内部类依附主类,适配单文件提交要求。

踩坑心得

1.器件名称解析逻辑改错:之前为了临时调试删掉了A(2)1这类带括号名称的分割代码,导致带括号格式的器件无法创建,大量用例直接零分。后来只能恢复最初的括号解析逻辑,也意识到底层解析代码不能随意改动,修改后必须全量复测。
2.分配器输出顺序出错:数据分配器引脚遍历循环写反,输出字符串顺序颠倒,调整为从下标 0 正向遍历后,输出格式才达标。

改进建议

1.我不会再随意修改底层名称解析、引脚映射这类基础逻辑,改动后完整跑一遍所有测试用例做回归验证。
2.提前统一封装二进制编码、引脚遍历工具方法,避免出现高低位颠倒、输出顺序错乱这类重复踩坑问题。

总结

三份作业是一套完整的数字电路仿真迭代项目,从作业 4 仅实现 5 种基础逻辑门,到作业 5 新增带控制引脚的三态门、译码器,最终作业 6 补齐多路选择、分配器,完成九类器件全套功能。
最开始我只追求代码跑通,没有长远的设计思路;随着不断踩坑、对照 UML 类图老师给的提示和样例调整,我慢慢学会拆分代码结构、复用公共逻辑,工程规范性持续提升。

依旧要学习的地方

1.前期架构建模能力:第一次作业实体类未预留拓展字段,后续迭代改动量巨大。我需要学习需求预判、UML 建模,写代码前提前规划可拓展的实体结构,适配后续功能迭代。
2.面向对象进阶(继承与多态):目前全靠大量 if-else 判断器件类型,分支复杂度居高不下。我需要系统学习抽象类、方法重写,用多态替代条件分支,优化器件运算逻辑,降低代码圈复杂度。
3.通用工具方法封装思维:引脚赋值、二进制编码、器件校验逻辑重复编写,频繁踩格式、顺序错误。我要练习通用工具类封装,把重复逻辑抽离复用,统一处理边界问题。

posted @ 2026-06-12 21:14  樊陈云  阅读(4)  评论(0)    收藏  举报