• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
鄢睿涛
博客园    首页    新随笔    联系   管理    订阅  订阅

电路逻辑仿真系统三次作业集(4、5、6)综合博客总结

写在前面
OO 课程第二单元电路仿真模块全部完成,三次作业围绕数字逻辑电路仿真系统迭代开发,功能逐层叠加,难度持续上升。经过这一单元的完整开发,我完成了如下几点学习目标:

1.熟练掌握 Java 面向对象封装、继承、抽象类、多态核心语法;

2.建立分层组件化设计思维,理解系统可扩展性的核心设计要点;

3.掌握拓扑依赖迭代求值、正则文本解析、子电路展开编译流程;

4.学会使用 SourceMonitor 完成代码复杂度度量,通过自动化对拍 + 人工造例完成测试;

5.理解复杂工程中耦合度、循环复杂度过高带来的维护灾难,掌握拆分优化思路。

Complexity Metrics(复杂度分析前置概念)

下文分析将统一使用软件工程标准代码度量指标,先明确指标定义:

方法层面三大核心指标:

1.ev (G) 本质复杂度:衡量代码结构化程度,取值 [1, v (G)],数值越高代表代码分支嵌套、逻辑跳转越混乱,代码 “病态程度” 越高;

2.iv (G) 设计复杂度:衡量当前方法与外部其他方法、类的调用耦合程度,数值越高代表耦合越强,代码复用、修改难度越大;

3.v (G) 循环复杂度:代表覆盖该方法所有执行路径最少需要的测试用例数量,if-else、循环、分支越多,v (G) 数值越高。

类层面指标:

WMC:类全部方法循环复杂度总和;

OCavg:类内所有方法平均循环复杂度,用于判断类整体臃肿程度。

下文将依次拆解三次电路仿真作业的需求、代码规模、类图、复杂度、公测互测 Bug、测试方案,最后总结设计缺陷与优化方案。
第一次作业

作业要求
实现基础数字逻辑电路仿真,仅支持五类基础门:AND、OR、NOT、XOR、XNOR。
输入包含两部分:全局 INPUT 信号赋值、全局连线数组;
核心流程:解析输入信号→解析连线绑定各门输入引脚→拓扑循环迭代计算所有门输出值→按照A>O>N>X>Y、同类型按 ID 升序输出所有有效门输出。
限制:无扩展器件、无嵌套子电路,仅单层门电路依赖关系。
实现方式
数据存储:使用HashMap<String, Integer>存储全局所有信号(输入信号 + 门输出引脚信号);
门实体封装:自定义Gate类存储门名称、类型、ID、输入引脚数量、各引脚绑定的信号源;
连线解析:遍历所有连线,反向绑定每个门对应引脚的输入信号来源;
求值逻辑:循环遍历所有门,若某门全部输入引脚信号就绪则计算输出,更新全局信号表,直到一轮遍历无新信号更新;
输出排序:自定义比较器,先按门类型固定顺序排序,同类型按 ID 从小到大输出。
代码规模

Screenshot 2026-06-24 142219

类图说明

4c47102ed3f26ea6760a8205a99e7a68

复杂度分析

Screenshot 2026-06-24 142157

高复杂度方法分析
getOrCreateGate():v (G)=9,ev (G)=4,是本次复杂度最高的方法。
原因:使用多段 if-else 分支匹配五类门命名规则(A (n) xx、O (n) xx、Nxx、Xxx、Yxx),每一分支内部截取括号、数字、ID,大量字符串截取逻辑堆叠,分支过多导致路径数量暴增;同时频繁创建 Gate 对象、操作 gateMap,iv (G) 耦合度偏高。
computeOutput():v (G)=6,包含五类门独立计算分支,大量 switch-case 判断,结构化程度一般。
Bug 分析
公测
公测无功能性错误,仅存在一处性能扣分:输出规则要求省略-1、1系数简化,代码未对-1、1做裁剪处理,输出字符串冗余,长度超标丢失部分性能分。
互测
互测被测出 1 处致命 Bug:多零值输入合并输出缺失。
场景:输入连线生成两个输出为 0 的门,排序输出逻辑仅判断单零值门,多零门场景直接跳过无任何打印。
根因:输出遍历逻辑中添加了out == 0短路判断,未考虑多个零值门需要全部输出。
互测 Hack 他人 12 次,绝大多数 Bug 集中在两点:
引脚数字解析未捕获数字格式异常,非法引脚号直接抛出程序崩溃;
拓扑求值循环仅执行一轮,多层门依赖无法迭代更新信号,后置门无法计算。
测试方法
正则自动生成测试用例:Python 构造符合门命名、连线规则的文本输入,覆盖多输入 AND/O 门、多层级依赖;
标准校验器:手写基础逻辑真值表,自动对比 Java 程序输出与标准真值;
人工边界用例:单门、多层嵌套、全 0 输入、全 1 输入、多零输出场景定向构造。
第二次作业
作业要求
在作业 4 五类基础门之上,新增四类专用数字器件:三态门 S、译码器 M、多路选择器 Z、多路分配器 F。
各类器件引脚定义、输入输出计算逻辑、输出文本格式完全独立;
新增抽象组件设计要求,所有器件统一提供输出信息接口;
依赖层级加深,存在基础门与专用器件互相嵌套求值场景。
实现方式
抽象顶层组件:定义抽象类Component,规定统一outputInfo()输出接口,所有器件继承该类;
子类拆分:
BasicGate:封装 A/O/N/X/Y 五类基础门;
TriStateGate:三态门独立引脚、计算逻辑;
Decoder:译码器,多控制引脚、多输出通道;
Multiplexer:多路选择器,根据控制位选择输入;
Demultiplexer:多路分配器,单输入映射多输出;
正则匹配:预编译多组 Pattern,分别匹配不同器件命名格式,自动创建对应子类对象;
信号读取工具getSignal():递归查询连线映射关系,跨器件读取前置信号;
求值循环:依次遍历所有 Component 实例,判断器件输入引脚是否全部就绪,就绪则调用自身 calc () 更新输出信号。
代码规模

Screenshot 2026-06-24 142607

类图

8e2c922d-75e0-4f2a-8de6-b82755c8de0f

复杂度分析

Screenshot 2026-06-24 142634

高复杂度方法分析
器件正则匹配创建逻辑:v (G)=16,ev (G)=6,iv (G)=12。
原因:依次使用 6 组正则 Pattern 分别匹配 A/O、N/X/Y、S、M、Z、F 器件,每一组正则完成分组捕获、数值解析、子类实例创建,大量顺序分支,同时频繁操作 components 全局 Map,与多个子类构造方法强耦合,iv (G) 显著升高。
outputResults () 输出排序方法:v (G)=8,多层 if 判断区分器件类型,分组后按 ID 排序,拼接输出字符串,分支较多。
Bug 分析
公测
公测无逻辑正确性 Bug,但性能分未拿满。
原因:译码器、多路分配器输出通道存在大量空值,未做压缩简化,输出文本过长;仅完成基础运算逻辑,未做输出格式精简优化。
互测

互测共暴露 4 处 Bug:

HashMap 信号查找失效:getSignal () 遍历连线时,找到目标信号后直接 break,未处理多源信号冲突场景,部分器件读取不到前置信号;

正则 matches () 误用:器件匹配使用 matches () 整串匹配,无法识别行内器件名称,正确方案应为 find () 局部匹配;

正则贪婪模式超时:多路器件正则未添加非贪婪量词,长输入文本出现 TLE,修改.*? 非贪婪后解决;

多路选择器控制位读取顺序颠倒:高低位倒置,选中输入通道完全错误。

本次互测未成功 Hack 其他同学程序,根因:Python 真值校验工具存在缺陷,多通道器件输出无法精准判断等价性,第三次作业重构测试工具。

测试方法

分层生成测试用例:先生成基础门电路,再嵌套三态、译码、多路器件,随机生成 2~4 层依赖;

数值代值校验:对每个器件输入 0/1 全部组合,枚举所有真值与程序输出比对;

异常用例:非法器件名、引脚越界、空连线、无输入器件定向测试。

第三次作业
作业要求
完全兼容作业 4、5 所有器件,新增子电路 Cxx 模块编译功能:
支持子电路自定义:子电路内部 INPUT、OUT 引脚、内部连线;
主电路中子电路实例自动展开,完成端口信号映射、内部连线替换;
新增语法校验:连线多输出、无输入、信号冲突、端口顺序错误,输出标准 ERROR 报错;
完整编译流水线:子电路预解析→连线展开替换→语法校验→拓扑求值→分类输出。
实现方式
新增 ZiDianLu 子电路类:存储子电路编号、内部输入端口、输出端口、内部连线;
预编译流程:
① 读取所有 Cxx 子电路定义,缓存内部端口与连线;
② 遍历主电路连线,递归替换所有子电路实例为底层器件连线;
③ 构建端口映射哈希表,子电路输入 / 输出引脚绑定全局信号;
语法校验模块:单独封装chuLiLianJie(),逐行校验连线语法,捕获所有错误并记录报错信息;
基础门统一封装 YuanJian 类,完成展开后电路拓扑迭代求值;
输出排序沿用 AONXY 固定顺序,同类型按门 ID 升序打印。
代码规模

Screenshot 2026-06-24 142826

类图

387d2bee-042e-48b7-8652-b4b0c7152c27

复杂度分析

Screenshot 2026-06-24 142838

高复杂度方法分析
zhanKaiZiDianLu () 子电路展开方法:v (G)=32,ev (G)=12,iv (G)=28,为本单元复杂度最高方法。
原因:多层循环嵌套,包含子电路端口映射、字符串替换、递归展开、重复信号去重、内部连线生成多段分支逻辑;方法内部频繁调用其他工具函数,依赖全局映射表,耦合度极高,代码逻辑分支极多,结构化程度差。
chuLiLianJie () 语法校验方法:v (G)=19,包含多组 if 判断连线合法性:多输出、无输入、端口顺序错误、信号冲突,每类错误单独分支,逻辑臃肿。
三次作业复杂度纵向对比
表格
指标 作业 4 均值 作业 5 均值 作业 6 均值
ev (G) 平均 1.83 3.09 4.30
iv (G) 平均 2.00 4.82 9.00
v (G) 平均 3.67 6.64 10.70
可以清晰看出:随着功能迭代,方法平均循环复杂度、耦合度持续升高,代码臃肿、分支泛滥问题逐步加重。
Bug 分析
公测
公测无功能性报错,但未拿满性能分。
原因:子电路展开后产生大量冗余中间信号,求值阶段未做信号合并;输出未压缩多余无效引脚,输出文本长度超标。
互测

本次互测代码未被测出 Bug,成功发现 3 份同学代码典型缺陷:

子电路端口数值范围判断错误,题目要求输入控制位≤10000,代码误写为 < 10000;

常数门全零输出无打印逻辑,直接跳过输出;

子电路展开后连线格式校验缺失,输出引脚顺序不符合题目规范。

前两处 Bug 均通过人工定向构造子电路测试用例发现,证明自动化随机用例存在盲区,人工边界用例不可替代。

测试方法

第三次代码体量、逻辑复杂度大幅提升,采用分层黑盒测试:

复用作业 4、5 器件生成器,嵌套多层子电路实例,随机生成 3~5 层嵌套电路;

数值校验:将所有信号带入 0/1 组合循环计算 100 组数值,对比真值;

语法错误专项测试:构造多输出连线、无输入连线、端口顺序颠倒、重复信号冲突等错误输入,校验报错文本是否标准。

结合三次作业复杂度报表、类设计缺陷,梳理可落地的可持续优化方案:

1. 高复杂度分支方法拆分优化

三次作业均存在超大单方法(子电路展开、器件创建、输出打印),单方法承载十余个分支,v (G) 居高不下。

改进方案:单一方法只负责单一职责,拆分细分函数。

例:器件创建逻辑拆分为createBasicGate()、createTriState()、createDecoder()独立方法,消除巨型 if-else;子电路展开拆分为端口映射、字符串替换、内部连线生成三个独立子函数,降低 ev (G) 与 v (G)。

2. 利用多态、工厂模式消除类型判断

作业 5、6 中大量 if/switch 区分器件类型,耦合严重。

改进方案:引入工厂模式,编写 GateFactory 工厂类,输入器件名称字符串,自动返回对应 Component 子类实例,将类型匹配逻辑收拢至工厂;所有运算、输出逻辑下沉至子类重写,主流程完全消除类型判断分支,大幅降低 iv (G) 耦合度。

3. 全局容器解耦,分层隔离数据

当前代码所有信号、子电路、器件全部使用全局静态 Map,方法之间共享全局变量,耦合度 iv (G) 极高。

改进方案:拆分编译流水线实体类:

CircuitParser:专门负责文本读取、子电路解析;

CircuitExpander:专门处理子电路展开映射;

CircuitChecker:语法校验模块;

CircuitCalculator:拓扑求值模块;

每个模块持有独立局部数据容器,仅通过方法参数传递数据,消除全局共享变量,降低类间耦合。

4. 信号存储结构优化

当前使用单层 HashMap 存储所有信号,多层查询、遍历效率低。

改进方案:区分原始输入信号、门输出信号、子电路中间信号,分层存储;新增信号冲突检测工具类,提前校验重复赋值,避免求值阶段逻辑异常。

5. 输出格式化统一封装

三次作业 print/output 方法复杂度长期偏高,大量 if 处理输出字符串简化。

改进方案:单独创建 OutputFormatter 格式化工具类,统一处理零值、1/-1 省略、多余通道裁剪、字符串拼接,所有器件仅传递原始输出数据,格式化逻辑集中管理,减少重复分支代码。三次作业完成了从简易脚本到分层仿真系统的迭代,暴露了前期架构设计缺陷。后续编码优先用抽象、接口、设计模式前置规划架构,同时补强算法、测试、异常处理能力,写出高可维护、可扩展的 Java 工程。

posted @ 2026-06-24 15:42  鄢睿涛  阅读(2)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3