作业2
数字电路模拟程序三次作业集总结 Blog
基于 PowerDesigner 建模 + Java 实现 + SourceMonitor 代码质量分析
前言
本次作业集 Four、Five、Six 对应数字电路仿真三期开发任务,围绕基础逻辑门、分层级联电路、译码器 / 复合子电路三大业务阶段,完成从独立器件仿真、多引脚信号级联到复合子电路模板、电路连接解析仿真的完整工程训练。三次作业统一采用 PowerDesigner 完成 UML 类图建模先行、Java 面向对象编码落地,难度呈阶梯式上升,完整覆盖抽象类继承、组合模式、容器映射、引脚信号传输、输入电平校验、逻辑运算、自定义组件、异常捕获等核心 OOP 知识点。整体迭代路径:独立逻辑门功能可用 → 分层电路架构规范解耦 → 复合子电路模板化仿真安全校验,完整落地需求分析→UML 模型设计→代码开发→指标质量检测→功能测试→问题复盘架构优化的标准化软件工程开发流程。
一、设计与分析(源码 + PowerDesigner 类图 + SourceMonitor 代码质量报表)
作业集 Four(一期):基础分立逻辑门模拟系统
核心功能:基础门电路(与 / 或 / 非 / 异或 / 三态门)实例化、单器件电平输入、独立逻辑运算、引脚电平输出、非法电平拦截校验
PowerDesigner 类图(截图占位说明)
截图位置:

类图结构说明
Component:顶层抽象组件父类,统一管理引脚、名称、引脚操作抽象方法
叶子器件子类:NotGate/AndGate/OrGate/XorGate/TriStateGate,继承 Component 并重写 compute 运算方法
Pin:引脚实体,存储所属组件、引脚 ID、电平值、连接引脚列表
Level:全局电平常量(高电平 HIGH、低电平 LOW、非法电平 INVALID)
GateFactory:门电路工厂类,统一创建各类逻辑门实例
Main:程序入口,控制台输入交互、器件初始化与运算输出
关联关系:GateFactory聚合多个Component门器件;每个Component持有多个输入 / 输出Pin引脚对象。
SourceMonitor 代码质量报表(对应 Four.java)
报表位置:

表格
指标项 数值
代码总行数 309 行
可执行语句 194 行
类与接口总数 12 个
平均每类方法数 10.17
平均单方法语句数 0.00
分支语句占比 17.0%
注释行占比 1.6%
最大圈复杂度 0
平均圈复杂度 0.00
最大代码嵌套深度 4
平均嵌套深度 1.67
分析与心得
第一次严格执行先 PowerDesigner 建模、后编码的开发流程。通过抽象父类 Component 统一规范所有器件的引脚、运算接口,提前理清继承、聚合关系,规避开发中频繁修改类结构。代码分支少、圈复杂度为 0,逻辑线性清晰,可读性优秀,但仅支持独立单门器件,无引脚连线、多级级联能力,整体扩展性薄弱,仅能完成单器件静态运算。
作业集 Five(二期):多引脚级联分层电路仿真系统
核心功能:多输入引脚绑定、引脚信号互相连接、多级电路信号逐级传递、多输入门(Mux/Mux 译码器)、引脚数量合法性校验、单节点短路异常拦截、信号有序传输调度
PowerDesigner 类图(截图占位说明)
截图位置:

类图结构说明
Component抽象父类保留,新增复合器件:Demux/Decoder/Mux多路分配、译码、选择器件
Pin引脚扩展connections列表,支持多引脚互相绑定连线
Circuit顶层电路容器,统一管理全部组件、引脚映射关系
SignalDispatcher信号调度工具类,逐级遍历电路更新各级引脚电平
InputValidator独立校验类,校验引脚数量、电平范围、重复非法连线
Main扩展电路初始化、批量信号输入、分步仿真输出
关联关系:Circuit聚合多个Component;门电路、多路器件通过Pin双向绑定实现信号级联,输出引脚电平自动传递至下级输入引脚。
SourceMonitor 代码质量报表(对应 Five.java)
报表位置:

表格
指标项 数值
代码总行数 293 行
可执行语句 380 行
类与接口总数 13 个
平均每类方法数 4.00
平均单方法语句数 4.87
分支语句占比 15.8%
注释行占比 5.5%
最大圈复杂度 24
平均圈复杂度 2.60
最大代码嵌套深度 6
平均嵌套深度 1.95
分析与心得
业务升级为多级级联电路后,PowerDesigner 类图成为清晰的开发框架。通过分层拆分器件实体、引脚连线、信号调度、输入校验四大模块,实现高内聚低耦合架构。引入Map存储引脚 ID 与引脚实例映射,大幅提升引脚查找、信号传递效率;信号传输增加层级排序,保证电平更新稳定有序。圈复杂度小幅上升至平均 2.6,全部处于可控安全范围,代码修改、新增器件难度低,可维护性良好。
作业集 Six(三期):复合子电路模板与完整电路解析仿真系统
核心功能:复合组件 Composite、子电路模板 SubcircuitTemplate、原始连线 RawConnection、文本电路语法解析、批量引脚信号传播、时序冲突检测、非法电路结构安全判定、完整电路图一键仿真输出
PowerDesigner 类图(截图占位说明)
截图位置:

类图结构说明
Component顶层抽象,拆分两大分支:Leaf独立门器件、Composite复合容器组件
SubcircuitTemplate子电路模板,预存内部器件、原始连线、输入输出引脚映射
RawConnection/Connection两层连线模型:原始文本连线、运行时引脚绑定连接
Main内置语法解析器 Pattern,解析文本电路描述、实例化子电路、批量传播电平
CircuitSimulator仿真核心,递归遍历复合组件、逐级传播引脚电平、校验电路合法性
关联关系:Composite聚合多个子 Component(叶子门 / 其他复合组件);Main持有模板库、输入值映射、原始连线列表;仿真器依赖完整顶层 Composite 完成全电路递归运算。
SourceMonitor 代码质量报表(对应 Six.java)
报表位置:

表格
指标项 数值
代码总行数 695 行
可执行语句 526 行
类与接口总数 8 个
平均每类方法数 4.12
平均单方法语句数 13.79
分支语句占比 32.5%
注释行占比 7.6%
最大圈复杂度 51
平均圈复杂度 6.94
最大代码嵌套深度 9+
平均嵌套深度 3.25
分析与心得
复杂复合电路、子电路模板、文本语法解析属于高复杂度专业仿真场景,必须依靠模型先行设计。组合模式、子电路模板、双层连线模型全部在 PowerDesigner 类图标注约束关系,开发阶段几乎未出现引脚映射、递归运算、解析逻辑错误。电路仿真、电平传播、语法解析逻辑完全封装独立仿真类,与基础器件实体解耦;虽然整体圈复杂度、代码行数大幅提升,但严格遵循单一职责拆分,在复杂业务下同时兼顾仿真严谨性与代码可读性、健壮性。
二、采坑心得(数据逻辑、电路流程、测试校验、类结构设计)
- 门电路引脚电平未实时刷新(作业集 Four)
问题:调用 feed 输入引脚电平后,组件 compute 运算读取旧电平,输出结果不变
测试数据:与门输入引脚 0、1,修改输入后输出仍为初始 0
根因:Pin 仅存储电平,Component 运算时未主动重新读取引脚最新状态
类图缺陷:未标注「引脚值变更自动触发组件重算输出」约束规则
解决方案:每次修改 Pin 电平后,主动调用所属 Component 的 compute () 刷新输出
心得:建模阶段必须明确实体状态变更触发规则,避免静态数据滞后,硬件仿真对状态实时性要求极高 - 多级电路信号传输顺序混乱,输出随机(作业集 Five)
问题:两级门电路级联,相同输入多次运行输出结果不一致
测试场景:非门输出接入与门输入,仿真结果随机翻转
根因:电路容器仅无序 List 存储组件,遍历顺序不固定,后级门提前读取未更新完成的引脚电平
解决方案:为每个 Component 增加层级序号,信号调度器按层级升序逐级更新电平
心得:时序、顺序类硬件业务规则,需要同时在 UML 类图、代码逻辑双重落地约束 - 非法引脚参数、超量输入导致程序直接崩溃(作业集 Five)
问题:输入引脚编号负数、单门输入引脚超过上限、电平输入 2/-1,程序异常退出
约束标准:电平仅允许 Level.HIGH/LOW/INVALID,基础门最大输入引脚 4 根
解决方案:独立 InputValidator 校验类,在器件创建、引脚赋值前循环拦截非法参数,返回明确错误提示
心得:硬件仿真属于强约束系统,必须前置输入校验,杜绝非法参数进入运算流程 - 子电路模板引脚映射错位,解析逻辑公式偏差(作业集 Six)
问题:文本电路解析时,子电路输入输出引脚映射颠倒,译码输出全部判定错误
测试数据:标准 3-8 译码子电路文本输入,输出通道与预期完全错位
根因:PowerDesigner 建模时未标注模板引脚映射双向绑定关系,解析代码颠倒输入输出映射
解决方案:对照类图中 SubcircuitTemplate 引脚映射关系逐行核对解析代码,修正双向绑定逻辑
心得:带模板、复用机制的复杂系统,必须完整建模实体间双向关联,再编写解析、映射逻辑 - 复合组件递归仿真未提前检测短路冲突(作业集 Six)
问题:电路存在引脚自环短路,仿真持续递归运算,无终止告警,输出无效电平
解决方案:CircuitSimulator 增加短路、循环连接检测逻辑,递归仿真前遍历全部连接,发现违规电路直接终止仿真并输出告警
心得:数字电路仿真属于强安全约束系统,电路结构异常必须早检测、早拦截,避免死循环与无效运算
三、改进建议(长期可持续优化方向) - 代码架构结构优化
抽取全局公共工具类,统一封装电平转换、引脚查找、错误日志输出逻辑,消除三期作业大量重复工具代码
使用策略模式封装不同器件运算逻辑(基础门 / 多路选择器 / 译码器),单例模式管理全局电路仿真调度器
自定义电路专属异常(IllegalPinException、CircuitShortException、InvalidLevelException)替代粗暴System.exit(),实现分层优雅异常捕获与提示 - 仿真功能扩展
增加本地 JSON 文件持久化,完整保存顶层电路、子电路模板、引脚输入配置,支持读取复用仿真方案
完善控制台多级交互菜单,支持新增 / 删除器件、撤销引脚连线、重置全部电平、单步分步仿真调试
实现自动时序优化算法,自动检测电路竞争冒险,调整信号传播延迟消除输出毛刺 - 代码质量标准化提升
引入 JUnit 单元测试,全覆盖逻辑门运算、译码输出、子电路模板解析、短路冲突、输入校验核心测试用例
替换原生控制台打印,接入日志框架分级输出调试、告警、仿真结果信息,区分运行日志与错误日志
将电平阈值、引脚上限、电路语法正则等常量抽离外部配置文件,消除代码硬编码,便于修改硬件参数 - PowerDesigner 建模流程优化
完整落地 CDM 概念模型→LDM 逻辑模型→PDM 物理模型完整建模链路,可自动生成电路配置存储数据库表,实现电路持久化存储
新增 UML 时序图,完整展示文本解析、子电路实例化、信号逐级传播、仿真运算全流程调用链路
补充组件状态图,描述 Component 空闲、运算中、短路异常三种运行状态切换逻辑
四、整体总结
本阶段掌握核心开发能力
熟练使用 PowerDesigner 完成 UML 类图分层建模,贯彻先设计、后编码的标准工业开发思想,能够通过建模提前规避大部分结构缺陷
夯实 Java 面向对象核心技术:抽象类、继承多态、组合模式、工厂模式、单一职责原则、工具类分层、Map/List 容器有序遍历、自定义异常体系
吃透数字电路仿真完整业务知识:基础逻辑门运算、多级器件引脚级联、多路选择 / 译码器件、复合子电路模板复用、文本电路语法解析、短路 / 时序冲突安全判定规则
具备完整工程化开发闭环能力:需求建模、分层编码、SourceMonitor 量化质量检测、批量功能测试、基于测试数据定位逻辑缺陷、复盘迭代优化架构
后续待深入学习方向
竞争冒险消除、时钟时序延迟、自动最优布线等数字电路高级仿真算法
PowerDesigner 完整建模链路与数据库持久化方案对接开发
工厂、策略、单例等设计模式大规模落地,搭建规范、易扩展的企业级大型仿真项目架构
课程教学优化建议
增设前期 UML 类图设计评审环节,建模阶段修正实体关联、业务约束缺陷,大幅减少后期代码返工
提供标准化电路测试用例集(单门、多级级联、子电路模板),方便学生自测、对比仿真输出结果
增加小组协同建模任务,多人分工设计复合电路、子电路模板,提升团队需求沟通、协同设计能力
循序渐进引入设计模式重构三期作业代码,帮助学生直观理解分层解耦、可扩展工程规范,弱化一次性堆砌代码的开发习惯

浙公网安备 33010602011771号