三次 Java 数字电路模拟程序作业分析

(1)前言
三次数字电路模拟作业层层迭代,核心考察 Java 面向对象设计思想、分层抽象、组合模式、异常处理,同时强化 Java 基础语法与工程化编码思维,其内容包括:
1.单一职责原则:门元件、解析器、计算器、输出器、子电路各司其职,每个类仅承担一类功能;
2.类间关系:继承、接口、组合、聚合、依赖、关联综合运用;区分叶子元件(基础逻辑门)与组合元件(子电路);
3.Java 基础语法:Scanner 多行输入处理、字符串分割、正则匹配、HashMap 信号存储、ArrayList 集合、循环迭代仿真电路信号传递;
4.业务仿真算法:电路迭代仿真、二进制译码、多路选择、分配逻辑、子电路递归计算、信号冲突校验;
5.数据合法性与异常校验:连接线路格式异常、引脚信号冲突、输入输出顺序错误、空线路等多优先级异常检测;
(2)设计与分析
第一次作业:
作业要求:
实现 5 种基础逻辑门:与门、或门、非门、异或门、同或门;解析全局输入信号、引脚连 线,迭代仿真电路信号传播;按与、或、非、异或、同或顺序输出有效门输出,同类型按编 号升序,输入不全的门直接忽略。所有门输出引脚固定为 0,输入引脚从 1 连续编号;一 个输入引脚仅能接收一路信号。
实现方式:
1.抽象父类Gate统一封装元件名称、编号、输出值;
2.五类门继承Gate,各自重写计算逻辑,独立实现与、或、非、异或、同或运算;
3.全局使用Map<String,Integer>存储所有引脚实时电平;
4.分类存储所有门,同类按编号升序排序,过滤输出无效元件。
复杂度分析:
第一次作业的复杂度分析如下:
屏幕截图 2026-06-24 140116

屏幕截图 2026-06-24 140123

屏幕截图 2026-06-24 140130

类图:
第一次作业的类图如下:
ele-1

设计解释:
本次代码共 6 个核心类,严格遵循单一职责:
Gate:抽象父类,封装所有门公共属性、输出引脚统一方法;
五类门子类:仅负责自身逻辑运算,无输入解析、输出打印逻辑;
Tools:工具类,负责元件字符串解析构造、编号排序、结果打印;
Main:程序入口,负责读取输入、解析连线、迭代仿真、分类输出。
第二次作业:
作业要求:
在作业 1 基础上扩展 4 类复合器件:三态门 S、译码器 M、数据选择器 Z、数据分配器 F;新增控制引脚概念,引脚编号区分控制、输入、输出;不同器件输出格式差异化:
1.三态门控制端为 0 号引脚,控制电平为 0 时输出无效;
2.译码器不输出电平,仅输出值为 0 的输出引脚编号;
3.数据分配器输出字符串,无效位填充-;
4.新增元件命名规则:M (n) 译码器、Z (n) 多路选择器、F (n) 多路分配器,n 代表控制引脚数量;
5.输出顺序更新:与、或、非、异或、同或、三态门、译码器、数据选择器、数据分配器。
实现方式:
1.重构架构,使用接口CircuitElement定义统一电路元件规范,所有元件实现接口;
2.抽象父类BasicElement封装通用引脚映射、信号读取、计算标记;
3.新增TriStateGate/Decoder/Mux/Demux四类器件,独立实现控制引脚校验、编码转换、多路选择分配逻辑;
复杂度分析:
第一次作业的复杂度分析如下:
屏幕截图 2026-06-24 140214

屏幕截图 2026-06-24 140221

屏幕截图 2026-06-24 140228

类图:
第一次作业的类图如下:
ele-2

设计解释:
本次重构完全拆分基础门与复合器件,解决作业 1 架构扩展性不足问题:
1.接口标准化:统一compute()计算、getOutput()获取输出方法;
2.分层隔离:基础门、三态门、译码器、多路器件各自独立类,单一职责;
3.差异化输出逻辑封装在打印阶段,元件仅存储计算结果,不负责输出格式;
4.信号池全局统一管理,控制引脚、输入引脚、多输出引脚复用同一套信号存储逻辑。
第三次作业:
作业要求:
在基础五门逻辑上,新增功能:
1.子电路复合组件:支持提前定义子电路模板,主电路可复用子电路;子电路拥有独立输入、输出端口,内部元件输出带子电路编号前缀;采用组合模式,子电路视为复合电路单元;
2.全链路异常检测:按优先级捕获线路异常,输出第一条最高优先级异常,终止程序;
3.约束校验:同一输入引脚不能接收多路信号,触发信号冲突异常;
4.子电路递归计算,支持多层嵌套引用;输出遍历所有子电路内层门,按固定顺序打印。
实现方式:
1.抽象统一接口CircuitUnit,同时适配基础门与子电路,实现组合模式;
2.BaseLogicGate类:实现基础五门逻辑,不可包含子单元;
3.SubCircuitUnit类:内部存储子电路输入输出端口、内部连线、内层所有电路单元,支持递归仿真、递归收集输出结果;
4.CircuitTextParser类:单独承担文本解析、子电路预加载、线路异常校验、元件自动创建;
5.ResultOutputHandler输出工具类:统一分组、自然排序、格式化输出;
复杂度分析:
第一次作业的复杂度分析如下:
屏幕截图 2026-06-24 140310

屏幕截图 2026-06-24 140316

屏幕截图 2026-06-24 140322

类图:
第一次作业的类图如下:
ele-3

设计解释:
本次作业引入经典组合模式,解决子电路复用、多层嵌套问题,架构具备极强扩展性:
1.职责完全拆分:解析器只处理文本与异常、单元只做信号计算、输出器只格式化打印;
2.组合模式解耦:主电路无需区分普通门还是子电路,统一调用runCalc()、gatherResult();
3.异常逻辑集中:所有线路格式、信号冲突校验全部封装在解析器,仿真阶段无需重复判断;
(3)踩坑心得
第一次作业:
1.电路迭代仿真循环提前终止:最初仅遍历一次连线与门,没有循环迭代更新;多级级联门无法传递信号,后置门输出全为空。
修复:使用do-while循环,标记本轮是否有电平更新,无变化时再退出仿真。
2.元件编号排序逻辑错误:直接按字符串字典序排序,A(2)10排在A(2)2前面,编号大小错乱。
修复:提取括号后纯数字,按数值升序排序。
3.引脚信号覆盖丢失:同一输出驱动多个输入引脚时,未批量赋值,仅给第一个目标引脚写入电平,其余引脚无信号。
修复:遍历连线所有目标引脚统一赋值。
4.输入不全的门未过滤:未判断引脚是否全部存在有效电平,直接计算输出,出现无效数值参与输出。
修复:门计算时校验全部输入引脚,存在空引脚则保留 output=-1,打印时跳过。
第二次作业:
1.控制引脚校验遗漏:三态门、译码器忘记校验控制引脚电平,控制端无效时仍计算输出,输出错误电平。
修复:计算逻辑优先判断控制引脚有效性,不满足直接 return,输出置空。
2.译码器:分配器多输出引脚未回填信号池 复合器件多路输出仅存储在自身,未更新全局 signalMap,后置级联元件无法读取多路输出电平。
修复:计算完成后循环遍历所有输出引脚,写入全局信号映射。
3.多输出格式打印混乱:译码器要求输出编号、分配器输出带-字符串,统一按元件-引脚:电平打印,与样例不符。
修复:分类判断元件类型,差异化输出格式。
4.编号提取正则匹配缺陷:带括号元件截取数字时正则错误,无法正确提取编号,排序错乱。
修复:拆分括号前后字符串单独解析数字。
第三次作业
1.子电路模板复用信号互相污染:直接复用模板对象,多个引用共用同一个信号池,子电路之间电平串扰。
修复:引用子电路时深度复制模板,新建独立子电路实例。
2.线路异常优先级判断失效:同时存在多种线路错误时,未按题目给定优先级判定,输出低优先级错误。
修复:校验方法按异常优先级顺序依次判断,匹配到第一条错误直接返回。
3.输入引脚多路信号冲突漏检:未记录所有已绑定输入引脚,两条连线驱动同一引脚时未捕获冲突异常。
修复:解析连线时记录所有目标输入引脚,重复出现直接抛出冲突错误。
4.异常触发后未直接终止程序:检测到线路异常后仍继续仿真计算,同时输出错误提示与元件结果。
修复:解析阶段捕获异常后直接输出提示,main 方法 return 终止流程。
(4)改进建议
1.优化仿真迭代性能 当前每轮全量遍历所有连线、所有元件,大型电路迭代效率低;可增加信号变更标记,仅重新计算电平发生变化的元件,减少无效计算轮次。
2.完善空值判空,杜绝空指针崩溃 读取引脚信号、查找子电路、匹配元件时增加判空;子电路不存在、引脚无信号时返回默认无效值,避免空指针异常。
3.优化子电路复用逻辑,减少内存开销 当前每次引用子电路完整复制内部所有元件,多层复用会大量重复创建对象。
4.标准化输出,封装固定格式模板 将九类元件、子电路、译码器、分配器输出格式封装为独立方法,避免打印阶段大量 if-else 分支,降低格式写错概率。
5.增加引脚编号范围校验:输入引脚超出元件定义数量、控制引脚缺失、子电路端口不存在时,补充对应异常提示;区分 “输入不全忽略元件” 和 “线路格式错误终止程序” 两种处理逻辑。
(5)总结
三次数字电路作业采用迭代递进的开发思路,从简单实体类继承到接口标准化,再到组合模式实现复合组件,完整走完一套中小型面向对象工程的设计流程,锻炼 Java 开发能力。
在基础语法层面,熟练掌握接口、抽象类、继承、集合、字符串处理、循环仿真算法,理清输入输出处理各类坑点。
在面向对象设计层面,循序渐进理解单一职责、组合、依赖等类间关系,掌握组合模式的适用场景,学会拆分复杂业务、分层解耦,让代码具备良好扩展性,后续新增时序元件、子电路多层嵌套、异常类型无需大规模重构。
在问题调试层面,学会分层定位 bug:信号错乱优先排查仿真迭代逻辑、输出格式错误单独校验打印工具、异常漏判梳理校验优先级,不盲目修改代码。
后续学习中,我将基于本次组合模式经验,系统学习工厂、策略、单例等常用设计模式;对现有代码进行重构,抽离重复逻辑、消除冗余分支;完善全局异常体系;优化仿真算法性能,提升代码可读性与可维护性,将面向对象设计思想落地到每一段程序开发中。

posted @ 2026-06-24 19:33  hlllllll  阅读(2)  评论(0)    收藏  举报