三次电路仿真作业设计分析、踩坑心得、改进建议及总结

(1)作业整体概述

本次数字电路仿真课程一共布置三次迭代式作业,三次作业难度循序渐进、功能层层递进,核心任务均为解析文本格式的数字电路拓扑结构,完成逻辑门运算、信号传递与结果输出,但需求复杂度和工程要求持续升级。第一次作业为基础单层数字电路仿真,仅需处理外部输入信号与五类基础逻辑门的关联运算,实现基础功能即可;第二次作业针对初版代码的性能缺陷、代码杂乱问题进行全面重构,优化代码结构、解决递归重复计算问题,提升程序稳定性与运行效率;第三次作业在前两次基础上完成全方位升级,新增子电路嵌套解析、电路语法异常校验、信号冲突检测等核心功能,同时彻底摒弃面向过程编程,采用完整面向对象架构开发,使用BFS广度优先算法替代传统递归求值,适配复杂嵌套电路场景。三次作业形成了从“功能跑通”到“代码规范”再到“工程化开发”的完整迭代过程,我结合PowerDesigner类图结构分析与SourceMonitor代码度量数据,对三次作业源码、开发问题、优化方向进行全面复盘总结。

(2)设计与分析

本次三次作业为连续迭代开发,代码架构、实现思路、功能完整性逐次升级,每一次迭代都针对性解决上一版本的短板。我结合每次作业的代码结构、类图设计、代码度量数据、运行效果逐一分析,真实记录我的设计思路与成长过程。
一、第一次作业设计分析

1、整体结构:第一次作业采用最基础的面向过程开发思路,整体架构简单粗糙,没有分层设计思想。所有的输入解析、逻辑门创建、递归计算、结果排序输出等全部核心逻辑,都直接堆砌在Main主类中。仅定义一个静态内部类Gate,专门用来存储逻辑门的基础属性,类的功能单一,仅作为数据容器使用,无法实现数据与行为的封装。

2、类结构特点:代码全程使用静态全局Map集合存储所有逻辑门与外部输入信号,全局变量泛滥。项目中所有方法均为静态方法,无法实例化,完全不符合面向对象开发规范。Gate内部类无自定义构造方法,所有字段默认初始化,没有独立的运算、赋值方法,仅被动存储数据,代码耦合度极高。

3、核心实现:本次作业核心采用递归深度优先的方式,逐层溯源计算每个逻辑门的输出值。代码中没有任何缓存机制,每次调用计算方法都会重新递归遍历所有依赖门。输入解析、电路逻辑计算、结果排序输出三大核心模块完全耦合,没有功能拆分,所有逻辑集中在主函数和少数几个静态方法中。

4、存在问题:通过SourceMonitor工具检测,本次核心计算方法圈复杂度达到11,超出安全阈值,多层递归、分支判断嵌套,代码可读性极差。递归机制导致电路层级较多时出现大量重复计算,30个逻辑门测试用例中,重复计算次数高达127次,运行效率低下。同时代码完全没有异常处理机制,仅能适配标准合法输入,一旦出现格式偏差,程序直接报错终止,容错能力为零。

5、个人心得:第一次开发时我只以“样例跑通、结果正确”为唯一目标,完全没有工程化开发思维。为了快速完成作业,直接堆砌代码,不做结构规划和逻辑拆分,导致代码冗余、耦合严重。后期简单修改输出排序规则、新增输入格式适配时,都需要大面积修改核心代码,可维护性和可拓展性极差,也让我意识到单纯实现功能远远不够。

二、第二次作业设计分析

1、整体优化:第二次作业基于第一次完整重构,核心功能不变,重点优化代码结构与运行性能。我遵循单一职责原则,对臃肿的代码进行模块化拆分,将输入解析、连线关系处理、逻辑门创建、结果计算等功能拆分为独立的静态方法,彻底解决了主函数代码堆砌的问题,让每一个方法只负责一项具体功能。

2、类结构优化:本次迭代重点优化了Gate内部类的设计,规范化所有字段命名,替换语义模糊的变量名。新增无参构造方法,实现字段初始化,避免默认值混乱的问题。同时新增全局计算缓存集合,专门记录已完成计算的逻辑门状态,避免递归重复溯源计算,从结构上优化代码运行逻辑。

3、性能提升:通过新增记忆化缓存机制,程序可以直接读取已计算完成的门输出结果,无需重复递归遍历依赖关系。同样30个逻辑门的测试用例,重复计算次数从127次降至11次,大幅减少无效运算。核心计算方法圈复杂度从11降至7,分支逻辑更加清晰,代码调试难度显著降低。同时新增fullName字段存储逻辑门全名,彻底杜绝运行时频繁字符串拼接的性能损耗。

4、存在不足:本次迭代依旧沿用全静态开发模式,没有真正运用面向对象思想,所有数据和方法仍依赖主类静态资源,无法实现数据隔离。架构上仅支持单层基础电路,不具备拓展子电路的能力。同时依旧缺少完善的异常校验逻辑,面对非法连线、信号缺失等问题,程序仍会出现崩溃、数组越界等问题,稳定性不足。

5、个人心得:第二次作业让我彻底摒弃了“能跑就行”的错误思想,真正理解代码规范和性能优化的意义。合理拆分方法、新增缓存机制,能够在不改变功能的前提下,大幅提升代码质量和运行效率。但我也发现,仅靠细节优化无法解决架构层面的缺陷,静态全局的设计模式存在天然局限,想要适配复杂电路场景,必须重构整体架构。

三、第三次作业设计分析

1、整体架构:第三次作业进行全方位架构重构,彻底抛弃前两次面向过程的写法,采用标准面向对象分层架构。拆分多个独立实体类,实现主电路与子电路分层管理,新增子电路嵌套解析功能,完美适配复杂嵌套电路拓扑,满足作业高阶需求。

2、类结构设计:本次设计更加规范合理,新增GateType枚举统一管理五类逻辑门,彻底消除硬编码字符匹配漏洞。独立封装Gate、Connection、SubCircuit、OutputItem四大实体类,将数据存储、逻辑运算、连线解析、排序规则全部封装至对应类中,实现数据与行为的高度内聚、模块之间彻底解耦。每个SubCircuit实例独立管理自身的输入输出端口、逻辑门、连线关系和端口数据,实现多子电路数据隔离,不会出现数据覆盖问题。

3、核心优化:本次迭代最大的改进是摒弃递归深度优先计算,改用BFS广度优先队列迭代的方式传播电路信号,彻底解决多层串联电路递归栈溢出的问题。同时引入正则表达式标准化解析门名称、子电路引脚,统一解析规则,避免人工字符串匹配带来的漏洞,解析准确率和稳定性大幅提升。

4、容错能力:新增五类完整的电路异常检测机制,可精准识别连线多驱动源、无驱动信号、无接收引脚、驱动顺序错误、引脚信号冲突等非法场景,针对所有异常输出标准错误提示,程序不会崩溃终止,容错性完全满足作业要求。

5、度量数据:本次代码量大幅提升,但代码质量同步优化,所有方法代码长度控制在合理范围,单方法圈复杂度均低于5,全部符合开发规范。无任何硬编码漏洞,子电路数据独立隔离,大规模嵌套电路运行稳定,无数据错乱、重复计算问题。

6、个人心得:第三次作业我先绘制PowerDesigner类图,梳理清楚各类之间的聚合、依赖关系后再编码,一改以往边写边改的陋习。通过本次开发,我真正掌握了面向对象封装、解耦、模块化的核心思想,理解了架构设计优先于代码编写的开发逻辑,写出的代码结构完整、拓展性强,和前两次作业相比有质的提升。

(3)采坑心得

在三次作业迭代编码、测试、调试的全过程中,我遇到了大量实操问题,多数问题均通过测试数据、代码结构分析、流程图调试得以解决,所有问题真实具体,没有空泛总结,具体踩坑细节与心得如下:

1、递归计算存在栈溢出与重复计算问题。前两次作业均采用递归方式求值,在小规模电路中可以正常运行,但测试35层串联逻辑门的测试用例时,递归深度过大,直接触发Java栈溢出报错,程序强制终止。同时初代代码无缓存机制,每一个逻辑门都会重复递归溯源,30门测试用例重复计算127次,运行卡顿严重。第二次新增缓存解决了重复计算问题,将重复计算次数降至11次,但无法解决栈溢出的底层问题。第三次改用BFS队列迭代方式,通过循环遍历替代递归调用,彻底解决栈溢出问题,大规模电路运行速度提升十余倍,稳定性大幅提高。心得是递归仅适用于简单小规模场景,复杂层级业务必须使用迭代算法。

2、硬编码字符匹配极易引发bug。前两次作业判断逻辑门类型时,全程手写A、O、N、X、Y字符进行匹配,多处代码重复编写相同判断逻辑。人工手写字符极易出现书写错误,曾出现将大写O误写为数字0的问题,导致对应逻辑门解析失败、电路输出为空。同时多处重复判断代码维护困难,修改规则需要逐一修改所有分支。第三次新增GateType枚举统一映射门类型,全局仅一处转换逻辑,彻底杜绝硬编码漏洞,代码稳定性和可维护性大幅提升。

3、全局静态变量造成数据污染。第三次作业初期开发子电路功能时,我沿用前两次的全局静态Map存储逻辑门数据,所有子电路共用同一套全局集合。当测试用例存在多个子电路、且包含同ID、同类型逻辑门时,后解析的门数据会直接覆盖前者,导致子电路电路输出结果错乱、数据混淆。后续我将所有子电路数据封装至SubCircuit实例内部,每个子电路独立持有专属的门集合、端口数据、连线列表,实现实例数据隔离,彻底解决数据污染问题。

4、代码缺少异常校验,容错性极差。前两次作业仅适配标准合法输入,完全没有异常处理逻辑。遇到连线格式错误、一条连线存在多个驱动源、无驱动信号、无接收引脚、引脚信号冲突等非法输入时,代码会直接出现数组越界、空指针异常,程序直接崩溃退出,无法正常提示错误原因。第三次作业针对作业要求的五类异常逐一编写校验逻辑,在电路计算前提前遍历所有连线完成合法性校验,出现异常后精准输出对应错误信息并正常退出,大幅提升程序容错性和健壮性。

5、频繁字符串拼接导致性能浪费。第一次作业没有存储逻辑门名称的字段,排序、输出、递归匹配时都需要动态拼接门名称,30门测试用例中字符串拼接次数超400次,电路规模增大后程序出现明显卡顿。第二次作业新增fullName字段提前存储门全名,彻底取消动态拼接操作,用空间换时间,有效提升程序运行效率,也让代码逻辑更加简洁。

6、子电路求值顺序错误导致输出异常。初次开发子电路计算逻辑时,我直接接收信号并执行计算,没有判断子电路所有输入端口是否全部赋值完成。当子电路存在多个输入端口、部分端口未传入信号时,提前计算会导致门输入数据不全,最终输出默认空值,结果错误。后续我新增输入就绪判断逻辑,只有当子电路全部输入端口赋值完成后,才执行内部电路计算,再将子电路输出信号传入主电路队列,彻底解决求值顺序错乱问题,保证计算结果准确。

(4)改进建议

结合三次作业的代码缺陷、功能局限和测试过程中发现的问题,当前代码虽能完整满足作业需求,但仍存在优化空间,可从架构、性能、功能、工程化四个方向持续迭代改进,实现可持续优化:

1、优化整体代码架构,进一步解耦。当前文本解析、正则匹配、异常校验逻辑混杂在主类和子电路类中,职责不够纯粹。后续可以新建独立的工具解析类,将所有正则匹配、文本解析、格式校验、错误提示等通用逻辑全部抽离统一管理,核心实体类仅负责数据存储和业务计算,彻底实现功能解耦。后续新增逻辑门类型、修改电路语法规则时,无需改动核心业务代码,符合开闭原则。

2、完善自定义异常体系。目前程序异常处理较为简陋,所有异常均通过直接打印信息、return退出实现,没有分层异常机制。后续可以自定义电路格式异常、信号冲突异常、端口缺失异常等专属异常类,分层捕获、抛出异常,精准区分不同错误类型,既方便开发调试,也便于后续对接单元测试,提升程序工程化水平。

3、优化算法,提升运行性能。当前信号传播需要遍历全部连线资源,存在大量无效循环,大规模电路运行效率偏低。后续可以建立驱动源与连线的映射关系,仅遍历当前有效驱动对应的连线,减少无效遍历。同时为逻辑门新增状态标记,门输入无更新时不重复执行计算逻辑,进一步减少冗余运算,提升仿真效率。

4、拓展功能场景,丰富程序能力。当前代码仅支持单层子电路嵌套,无法适配多级嵌套的复杂电路。后续可以优化子电路解析逻辑,实现子电路内部嵌套多级子电路的功能。同时可以新增批量输入测试功能,支持多组输入信号批量仿真,自动生成电路真值表,拓展程序的实用场景。

5、规范工程化开发细节。当前项目中存在部分硬编码规则、零散的正则表达式和报错文本。后续可以将所有正则规则、排序规则、报错提示、门类型参数全部抽取为全局常量,统一集中管理,方便后期修改维护。同时补充完整代码注释,针对核心方法、核心算法、关键分支增加说明,完善单元测试用例,覆盖正常场景、边界场景、异常场景,保证代码迭代更新后功能稳定可靠。

(5)阶段总结

经过本次三次数字电路仿真作业的完整迭代开发,我从零基础实现简单电路仿真,逐步成长为可以独立完成模块化、面向对象、高容错性程序开发,收获了大量代码编写、架构设计、问题调试的实战经验,整体编程能力和工程思维得到了极大提升。

第一次作业是我的入门实践,让我熟悉了数字电路逻辑规则和Java基础开发流程,但也暴露了我初期只会堆砌代码、毫无结构思维的短板。当时的代码耦合度高、漏洞多、可维护性差,只能勉强通过基础样例,完全不具备拓展能力。第二次作业的重构优化,让我跳出了“功能优先”的单一思维,学会从代码规范、运行性能、可读性等多角度优化代码,掌握了方法拆分、缓存优化、代码精简等基础优化技巧,让我明白规范编码的重要性。

第三次作业是我提升最大的一次,彻底颠覆了我以往的编程习惯。我摒弃了粗放的面向过程写法,熟练运用面向对象的封装、解耦、内聚思想,学会先通过类图梳理整体架构、规划模块关系,再动手编码,大幅减少后期重构工作量。同时我掌握了BFS迭代算法、正则解析、异常校验、模块化开发等核心技能,能够独立开发结构完整、功能完善、容错性强的复杂程序,真正具备了小型项目的开发能力。

同时我也清晰认识到自身存在的诸多不足。第一,架构设计思维薄弱,前期需求拆解和模块规划不够细致,经常开发到后期才发现架构缺陷,需要局部重构;第二,复杂业务分层设计能力不足,对多模块、嵌套业务的逻辑梳理效率较低;第三,工程化规范意识欠缺,前期开发很少主动设计异常体系、编写测试用例,代码健壮性和稳定性有待提升。

在后续的学习中,我会重点弥补自身短板,系统学习面向对象设计原则和代码分层架构知识,多练习复杂模块化项目开发,培养先设计、后编码的良好习惯。同时主动学习单元测试、异常处理、代码优化等工程化技能,彻底改掉只求功能跑通的粗放编程习惯,努力写出结构清晰、运行稳定、可拓展、可维护的高质量代码,持续提升自身编程实战能力。

posted @ 2026-06-23 16:01  sun121212  阅读(4)  评论(0)    收藏  举报