作业集4-6数字电路仿真系统阶段性总结
一、前言
作业 4、5、6 这三次作业,都是围绕数字电路仿真系统一步步迭代开发的。整套任务紧扣课堂所学内容,功能逐步升级:从最基础的逻辑门电路仿真,到复合型电路拓展,最后实现子电路封装和完整的异常报错功能。三次作业的代码可以互相复用,知识点前后衔接紧密,需求也是一点点叠加的,完全符合迭代开发和面向对象的设计要求。整套作业题量安排合理,难度层层递进,既练习了类设计、类之间的关系、代码封装,还有单一职责、开闭原则这些编程知识点,同时结合了数字电路的知识,既能练编程,也巩固了专业课内容。
分开来看三次作业的学习重点:
作业4是电路仿真的基础版本,主要练习搭建实体类、运用单一职责原则,完成基础门电路封装、元件拓扑排序、信号判断和简单的字符串解析。整体逻辑简单,类之间关联不多,也不用处理异常,重点就是练习基础的面向对象编码。
作业5在作业 4 的代码上继续拓展,新增了多种复合元件、引脚划分功能,还加入了独立的输入校验模块,也重点考察了类的组合、聚合等关系。相当于从基础门电路升级到译码器这类复杂电路,主要锻炼我们拆分代码、做好程序防护、优化代码健壮性的能力。
作业6是最终完整版系统,新增了子电路封装、端口映射、多级异常提示、拓扑合并等不少功能,还规范了代码权限、全局语法校验,并且要求不能使用 Lambda、Stream 这类简化写法。这份作业更侧重模块之间的联动、拓扑算法,以及代码规范和工程化思维。
再说说题量:三份作业的工作量和学习进度基本匹配但我觉得题目还是太难了和当前学习进度不符。作业4内容最少,只需要搭建5个基础类,实现元件运算、拓扑排序、电路连通判断这些简单功能;作业5在此之上增加了引脚、复合元件、输入校验相关代码,功能变多了一些;作业6是三份里工作量最大的,不仅新增了子电路、异常处理、端口映射等核心模块,还重构了原有逻辑、补充了各类报错规则、限制代码写法,不管是模块数量、代码量还是业务逻辑复杂度,都是最高的。三份作业都要求遵守单一职责、开闭两大设计原则。
难度方面,三份作业难度一路上升,整体感觉跟不上课堂节奏,常常课上还没学透,作业难度就提上来了。作业4难度最低,只要会基础的类封装、List 集合和队列拓扑逻辑就能完成;作业5难度中等,难点在于分清类的关联、组合、聚合关系,还要理清引脚结构、做好代码防护,编码前得先把类图和逻辑梳理清楚;作业6难度最高,不仅要理解子电路、端口映射、异常优先级这些复杂的业务规则,还有不少代码写法上的限制,还要重构遍历逻辑、做全面的边界校验,对代码规范、逻辑思维和调试能力要求都很高,我目前也没能拿到满分。
总的来说,这三次作业循序渐进,也让我慢慢从单纯写基础 Java 代码,过渡到能开发完整的工程化仿真系统。
二、设计与分析
(一)数字电路模拟程序-1
1.源码整体设计分析
本次作业一共划分5个核心Java类,严格贴合课程单一职责设计原则,无功能冗余、无跨职责代码耦合,类功能划分清晰。Element元件实体类:仅负责存储电路元件名称、元件类型、引脚数量、元件编号基础属性,封装私有成员变量,提供标准getter访问方法,不承担解析、运算、业务调度功能;InputParser输入解析类:仅负责控制台电路语句切割、元件参数提取、基础字符串解析工作;CircuitGraph拓扑构建类:独立完成电路邻接表创建、元件入度统计、拓扑队列搭建;CircuitCalculator信号运算类:作为核心业务类,独立完成门电路布尔运算、电路信号流转、空载电路判定;Main启动测试类:单独负责控制台用户输入读取、程序方法调用、结果格式化输出,实现输入输出与业务代码解耦。整体架构极简,完全贴合入门级面向对象开发要求。
2.SourceMonitor代码度量报表分析

作业4项目总计,总代码390行,有效执行语句264条,共6个类、平均每个类包含2.83个成员方法,单个方法平均11.53行语句;无冗余调试代码、无大量无效空行。项目整体平均嵌套深度2.83,全局最大嵌套层级7层,最大圈复杂度14,分支占比29.2%,总计136次方法调用;存在一定分支逻辑与嵌套层级,但核心算法逻辑直白易懂,没有过度复杂的多层嵌套循环,基础逻辑清晰,代码执行流畅、内存占用低。核心方法为 CircuitCalculator.calcSignal () 电路信号运算方法,运算流程直观,适配基础逻辑门电路仿真业务需求;项目暂无注释内容,代码分层结构规整,可读性尚可,便于后续调试与维护。
3.PowerDesigner UML类图分析

根据绘制完成的PowerDesigner类图可知:CircuitGraph拓扑类与Element元件类为依赖关系,拓扑构建类调用元件参数完成邻接表搭建;CircuitCalculator运算类与Element元件类为聚合关系,电路元件可以脱离运算调度类独立存在,符合聚合关系“整体与部分可分离”核心特征,类间关系贴合课堂UML教学要求。
4.个人设计心得
作业4是电路迭代作业的基础版本,前期编码误区十分明显:最开始编码时将字符串解析、拓扑排序、信号计算、控制台输入全部写在Main主类中,形成臃肿万能类,代码杂乱、后期修改困难。经过课堂知识点复盘后重新拆分类结构,先规划每一个类的专属职责、再逐类编写代码,重构后代码结构一目了然。本次作业让我巩固单一职责核心:一个类只完成一项业务功能,不仅代码可读性提升,同时极大降低后续迭代、BUG修改难度,为作业5、作业6代码迭代打下架构基础。
(二)数字电路模拟程序-2
1.源码整体设计分析
本次作业完全复用作业4成熟架构,新增Position引脚位置类、InputValidator输入校验类2个实体与工具类,项目总类数量达到8个,全程延续单一职责与开闭原则,不改动作业4底层实体代码,采用增量迭代开发模式。新增Pin引脚类:仅封装控制引脚、输入引脚、输出引脚分类属性,专属实现引脚偏移定位、引脚顺序匹配功能;InputValidator独立校验工具类:全局统一负责元件格式、数字参数、连接语句合法性拦截,实现校验代码复用;新增CompoundElement复合元件类:完成译码器、三态门、数据选择器专属属性封装、差异化输出逻辑绑定;原有Element基础元件类新增引脚分区字段;原有CircuitDispatcher调度类,专职完成元件筛选、引脚排序、电路连接匹配调度。整体模块拆分更贴合真实组合电路硬件业务。
2.SourceMonitor代码度量报表分析

作业5项目总代码687行,有效执行语句484条;项目共7个类,平均每个类包含3.43个成员方法,单个方法平均16.42行语句,方法粒度拆分适中,无过度冗长或碎片化方法。项目全局最大圈复杂度27,整体平均嵌套深度3.04,最大嵌套层级7层,分支占比28.5%,总计259次方法调用;核心电路运算、拓扑排序逻辑复用作业4成熟代码,代码复用率高,无冗余调试代码与无效空行。本次新增引脚解析、输入格式校验相关功能并做完整封装,模块划分清晰,工程化结构相较作业4明显优化;项目暂未添加注释内容,但整体分层架构规整,核心业务逻辑直白易懂,多层嵌套仅局部存在,不存在难以维护的高危复杂分支,适配拓展后的多引脚复合逻辑门电路仿真业务需求。
3.PowerDesigner UML类图分析

本次类图完成全部类间关系更新:新增Pin引脚类与CompoundElement复合元件类为组合关系,引脚是电路元件固有组成部分,元件销毁则引脚同步销毁;CompoundElement元件类与电路连接关系为聚合关系,元件可脱离电路拓扑独立存在;CircuitGraph拓扑类与复合元件类为双向关联关系。组合、聚合、依赖三类关系划分精准,和课本UML类间关系定义完全匹配,架构设计满足题目评分要求。
4.个人设计心得
作业5核心难点就是区分电路元件与引脚的组合、聚合关系,编码初期我仅凭字面理解编写代码,类间耦合混乱、引脚生命周期绑定错误,直接导致类图画法、业务逻辑双双失分。后续先画UML类图、敲定类之间从属关系再开发代码,理清核心逻辑:引脚属于元件固有内部组件、不可单独拆分,属于组合;电路连接关系不属于元件固有属性、可自由解绑,属于聚合。同时独立InputValidator校验类的引入,实现了业务代码与校验代码解耦,程序可以拦截非法语句输入、避免程序崩溃,代码鲁棒性明显提升,也让我理解程序封闭性、高内聚低耦合的实际意义。
(三)数字电路模拟程序-4
1.源码整体设计分析
本次作业基于作业5完整架构迭代,新增SubCircuit子电路类、Port端口映射类、ErrorState异常计算器类,同时优化重构InputValidator全局校验类,项目总类数量达到12个,题目强制禁止继承、多态、Stream、Lambda语法,全部依靠组合、关联关系完成开发。SubCircuit子电路类内部组合端口、内部元件集合,独立封装子电路本体,子电路元件在内部实例化,不对外暴露内部元件修改入口;Port端口类极简封装内外映射参数,无外部修改接口;ErrorState异常工具类,不存储业务数据,专职完成五类异常优先级判定、报错信息输出、解析流程熔断;InputValidator完成功能迭代,新增空语句、参数越界、引脚冲突全域校验;CircuitGraph拓扑类新增主辅电路拓扑合并逻辑;调度类全部删除流式写法,纯手写集合遍历、原生排序算法,严格贴合题目语法约束。
2.SourceMonitor代码度量报表分析

作业6项目,总代码658行,有效执行语句391条;整个项目包含5个类,平均每个类有3.20个成员方法,单个方法平均20.56行语句,整体方法体量适中,核心业务方法承载的逻辑偏多。
项目全局最大圈复杂度15,平均嵌套深度2.84,最深嵌套7层,分支占比28.6%,一共220 次方法调用;高复杂度代码集中在子电路解析、端口映射、输入格式校验这几块核心功能里,里面有大量分支判断逻辑。
代码复用了作业4、5写好的基础门电路运算、拓扑排序核心逻辑,在此基础上新增了子电路嵌套解析、多层端口展开、输入合法性校验、多类复合元件运算功能,各个模块都做了完整封装。存储容器也做了优化,改用复合容器替代单纯线性遍历,砍掉了很多低效循环,程序运行效率比之前作业提升不少。
整体代码架构分层清晰,基础门电路、子电路拓展、拓扑运算、结果打印模块互相解耦,能够支撑多层嵌套子电路、多类型拓展逻辑门的复杂组合电路仿真需求。项目没有编写注释,但模块划分规整,工程化规范性相较前两次作业有明显进步。
3.PowerDesigner UML类图分析

类结构新增多项核心关系:SubCircuit子电路与Port端口为强组合关系;ErrorState异常工具类依赖全局电路实体获取连接、元件数据;主电路CircuitGraph与SubCircuit子电路为关联关系。所有类严格恪守单一职责,子电路封装、端口映射、异常校验、拓扑运算、输入校验模块完全解耦,类间依赖清晰,无多余耦合关联,满足作业6架构评分标准,但是还是不够完美只有69分。
4.个人设计心得
作业6是三次作业中业务、架构、编码约束最难的一次,新增子电路封装、多级异常报错、跨端口信号映射三大模块后系统复杂度翻倍。开发过程中我深刻体会到单一职责原则在复杂项目中的价值:模块数量大幅增加后,各司其职的类结构可以快速定位BUG、拆分调试逻辑。同时我系统掌握了模块化电路封装、电气信号冲突、电路异常校验专业课原理,理解工程软件异常优先级、模块隔离设计的核心意义。本次迭代也让我意识到:前期架构设计越规范,后期叠加复杂业务、联动多模块时,代码改动量越小、系统越稳定。同时实在是检测点太多而且很难过所以我只弄到了69分,但是在有设计提示后也是到达了85分
三、采坑心得
(一)作业4核心踩坑:字符串截取越界、拓扑排序逻辑漏洞
本次作业失分核心BUG为元件字符串括号参数截取下标越界问题:解析A(4)1、O(2)2格式元件时,手写字符遍历截取引脚参数,未做边界判定,读取空字符串直接类型转换报错,元件编号解析错乱、拓扑邻接表构建失败。初期调试时我随意修改截取下标,出现时对时错、测试得分波动极大:部分基础样例修复通过,边界极值样例直接元件匹配错位扣分。经过逐行断点调试后总结规律:固定括号区间截取参数、单独拆分元件编号与引脚数值,封装独立解析方法即可修复。本次踩坑让我牢记Java字符串解析细节,手写切割逻辑容错率低,边界判断缺一不可,细微字符串处理问题就会导致整体程序失分。
(二)作业5核心踩坑:引脚分区颠倒、类间组合聚合混淆
作业5最大难点为引脚三类分区排序、类间关联错综复杂,初期我未提前绘制UML类图、直接上手编码,出现三大问题:控制引脚、输入引脚、输出引脚读取顺序颠倒、元件与引脚生命周期不绑定、外部类可以直接修改引脚私有属性,违背代码封闭性原则。同时复合元件代码过多导致BUG定位困难,修改一处引脚参数联动引发多处运算报错,调试效率极低。后续调整开发流程:先梳理元件引脚从属关系、手绘类图、敲定组合/聚合/关联三类关系、规划类的私有权限,再编写业务代码,不仅代码一次性符合题目架构要求,封闭性、封装性全部达标,调试耗时缩短一半。我也总结经验:多类电路项目绝对不能边想边写,理清类关系、硬件结构是开发第一步。
(三)作业6核心踩坑:输出格式、组合封装、异常优先级等问题
第一,输出格式与样例不匹配:题目异常文字、子电路输出前缀、报错换行格式要求严苛,我初次运算完成后直接输出原始日志,未格式化处理,大量测试用例格式错误失分,只能对照样例逐行微调输出语句、反复比对测试数据,依靠多次试错完成格式适配。
第二,组合关系封装违规失分:最初设计时,子电路外部直接传入端口对象、对外提供内部元件getter方法,外部可以随意修改子电路内部元件、端口参数,破坏题目强制要求的组合关系规则。题目规定端口、内部元件属于子电路内部组件,必须在子电路构造器内部new创建,不对外暴露成员对象、不提供修改接口。该问题属于面向对象设计逻辑错误,不属于代码BUG,修改后关闭外部对象访问入口、固化组合生命周期,才满足评分标准。
第三,异常优先级顺序颠倒:题目固定五大异常优先级,我按照代码解析顺序依次判定报错,高等级异常被低等级异常覆盖,核心测试点全部驳回扣分。
第四,子电路端口映射键值反向,电路信号双向流转失败,拓扑合并运算失效,反复调试后修正映射绑定逻辑才通过部分例。整体复盘:作业6扣分大多不是代码语法错误,而是类设计规范、题目隐性约束、业务规则、输出格式四类细节问题,也印证电路仿真系统对代码严谨性、规范性要求极高。
四、改进建议
(一)现有代码通用优化建议
第一,容器迭代优化:三次作业局部初期使用固定长度数组存储元件、引脚、连接数据,数组长度固定、扩容繁琐、代码冗余度高,后续全部替换ArrayList、HashMap动态集合,自动适配数据体量,删减数组下标判定、扩容冗余代码,简化整体编码逻辑。
第二,异常体系完善:现有程序仅做输入格式、业务规则校验,未捕获空指针、类型转换、集合运算异常,新增try-catch全局异常捕获机制,提升程序容错率。
第三,算法与精度优化:手写拓扑排序、异常判定算法可优化循环边界、减少无效遍历,提升程序运行效率;电路浮点信号运算存在小数精度丢失问题,舍弃double浮点直接运算,使用工具类完成信号数值计算,解决电路仿真数据精度偏差问题。
第四,职责二次拆分:作业4、作业5解析逻辑混杂在主调度类中,可统一迁移至独立解析工具类,运算类只负责电路信号计算、拓扑迭代,解析类专职语句切割、参数提取,进一步贴合单一职责,提升代码复用性。
(二)业务功能迭代优化建议
完善输入校验边界规则:在InputValidator工具类中新增引脚载重、元件数量联动校验,新增单电路引脚余量预判、元件参数超限拦截,解析阶段提前预判非法参数,而非加载电路后再提示报错,优化程序交互逻辑,贴合真实电路编译前置校验流程。
贴合专业课业务优化:现有代码仅完成课堂基础电路仿真,后续可增加时序电路环路检测、多层子电路嵌套、电路运行日志输出功能,贴合数字电路课本时序电路、模块化电路标准。
(三)个人编码与学习改进
加强拓扑算法、状态机异常算法手写练习,摆脱集合工具依赖,夯实底层手写算法能力;强化UML类图绘制训练,快速梳理多类项目从属关系;提升代码调试能力,减少盲目试错调试,学会断点定位、参数日志排查;夯实封装、组合聚合、开闭原则理论知识,做到理论和代码编码统一。
(四)课程、作业、课堂教学改进意见
1.课堂学习方面
上课单纯听口头讲解我很难集中注意力,也记不住知识点。希望老师讲课能多结合课本和PPT里的标准类图、代码案例,一边对照图例和实例一边讲解,再多带我们动手实操演示。图文结合的方式更容易理解,课后我也能对着资料复盘复习。
2.作业安排方面
这次电路相关的作业业务逻辑复杂,涉及的类也比较多,调试起来特别费时间。希望后续作业可以适当降低难度,或是延长提交截止时间。我梳理逻辑、编写和调试代码的速度偏慢,经常因为时间紧张仓促提交,导致不必要的失分。
3.配套资源方面
恳请老师每次布置作业时,同步提供对应的测试用例,涵盖正常数据、边界数据以及异常数据这几类。有参考样例能帮我找准格式和业务要求,不用盲目反复试错,也能大大减少调试的工作量。
4.课堂测试方面
课堂测试我常常因为答题时间不够,明明会做的题目也来不及完成、丢了分数。我清楚自己知识点掌握得还不够扎实,思考速度偏慢,希望之后课堂测试能适当延长作答时间。
五、阶段性综合总结
做完这三次数字电路迭代作业,我既练会了Java面向对象代码编写、UML类图绘制,也吃透了数字电路专业课知识,两边都有不小收获。编程方面,我从一开始只会写杂乱的基础代码,慢慢弄懂了单一职责、开闭设计原则,也能分清关联、聚合、组合三种类间关系,学会了实体类封装、私有权限设置、集合容器使用,还自己手写拓扑算法、完成全局输入校验,熟悉了迭代开发的思路;同时也会用SourceMonitor查看代码复杂度、用PowerDesigner画类图,养成了先画类图梳理结构、再写代码、最后调试改bug的做题习惯。专业业务方面,顺着三次迭代,一步步弄懂了基础逻辑门、复合元器件、引脚划分、子电路封装、电路拓扑运算、多级异常报错整套电路仿真业务,把电路知识和代码开发结合到了一起。同时我也明白,电路仿真对逻辑和格式要求极高,不光代码能运行就行,一点点格式写错、参数算错、类的封装没做好,整个程序就会报错、测试点全部不通过,也慢慢改掉了随意写代码的毛病,编程变得更加严谨。
对于没过测试点的作业6:
我本次最后一轮迭代作业6一开始只拿到69分,在后面给设计提示后得到85分,并没有拿到满分,存在大量测试点未全部通过、部分功能边界逻辑出错的问题。班里也有不少同学和我一样,没能全部通过测试用例、作业未拿满分。结合本次扣分情况复盘,我丢分主要集中在异常优先级判定出错、子电路端口映射绑定失误、输出格式未严格对标样例、组合封装规范不达标这几个问题上,并不是代码核心功能跑不通,都是细节审题、架构规范、题目隐性约束没吃透导致失分。同时开发过程中我心态也比较急躁,前期急于写完代码实现功能,没有先梳理子电路架构和异常优先级规则,也没有分步调试单个模块,写完整体代码后才批量排错,调试难度大幅增加,耗费大量时间还没能修复全部测试点。也让我明白Java面向对象迭代作业不光看代码能不能运行,类间关系、封装规则、输出格式、异常优先级、题目硬性语法约束,全部都是得分关键点,自身浮躁的开发习惯、审题粗心、模块拆分能力不足,都是本次作业失分、分数偏低的核心原因。
当然我自身短板也特别明显,首先面对类很多的复杂项目,我很难快速理清各个类之间的关系,架构梳理很慢;其次我只会基础遍历、基础拓扑简单算法,代码写得冗余、运行效率一般;而且我调试能力很差,不会断点调试,全靠反复改代码、试测试点排错,费时又费力;课本上的理论知识点背得很熟,但真正动手写代码就容易出错;外加这次题目业务规则多、文字量大,我审题速度慢,做题耗时很久,整体开发节奏特别拖沓。
后续我也打算针对性补齐短板,多复盘三次作业的类图,吃透类间关系;多手写算法精简代码,减少冗余语句;刻意练习断点调试,告别盲目试错;对照课本标准代码仿写,统一代码格式;提前读懂题目需求,提升审题速度。总体来说,这三次作业难度偏大、循序渐进,完美贴合课堂知识点,虽然做题过程很累、调试很久,但实实在在锻炼了面向对象编程能力,也为后续Java学习打下了基础。另外我自身算法储备太少,只会基础代码,后续也要多练习复杂算法,提升代码质量,改善自己读题慢、调试弱、类关系梳理不清的问题。

浙公网安备 33010602011771号