第二次blog作业
随着三次 pta 电路仿真作业迭代开发,逐步拓展功能,收获的知识分为四大块:
- 核心语法与基础特性。如:基础数据类型、分支循环流程控制、字符串正则处理、ArrayList/HashMap 集合容器;
- 面向对象核心。如:类与对象、封装私有化、静态工具成员、抽象继承多态、类组合 / 组合模式;
- 实用编程技能。如:控制台输入输出、自定义 Comparator 排序、数字电路业务逻辑封装、布线冲突异常与边界校验;
- 工程化基础。如:解析 - 建模 - 校验 - 仿真分层代码结构、器件常量统一管理、统一注释与输入输出格式规范。
Complexity Metrics(复杂度分析)
因为下面要用到复杂度分析,所以先在此给出一些相关概念。
我们需要使用的主要是方法和类的复杂度分析。
方法的复杂度分析主要基于圈复杂度的计算。圈复杂度是一种表示程序复杂度的软件度量,由程序流程图中的 “基础路径” 数量得来。
1.Max Complexity(最大圈复杂度):即单个方法的最高圈复杂度,用来表示方法中最复杂分支路径的数量,范围在
[1,∞)之间,值越大则该方法的逻辑分支越多,越难以测试和维护,其数值直接决定了需要的最少测试用例数。
2.Max Depth(最大嵌套深度):即方法中条件 / 循环语句的最深嵌套层数,用来表示程序逻辑的层级复杂度,范围在
[1,∞)之间,值越大则代码的 “缩进层级” 越深,越容易出现逻辑混乱和阅读障碍,也间接反映了代码的结构化程度。
3.Avg Complexity(平均圈复杂度):即类或项目中所有方法的圈复杂度平均值,用来表示整体代码的复杂度水平,范围在
[1,∞)之间,值越大则整体代码的维护成本越高,也反映了项目整体的代码质量和设计水平。
第一次作业
作业要求
基础逻辑门元件构成电路
代码规模
Files 1
Lines 272
Statements 242
Classes 7
Avg Stmts/Method 2.18

类图

Main:程序入口主类,负责读取输入、调用解析、仿真、校验、输出全流程调度
数据载体类
Pin:封装引脚数据,存储电平、信号源、下游负载,提供电平计算、失效刷新方法
Component:抽象顶层器件父类,统一存储器件类型、编号、引脚集合,定义计算输出、打印信息抽象方法
AndGate/OrGate/NotGate/XorGate/XnorGate:继承 Component,封装对应基础逻辑门运算规则
工具类
ComponentFactory:静态工厂工具,根据器件名字符串生成对应门实例
Circuit:电路管理载体,存储全局输入引脚、所有器件,提供输入解析、信号仿真、排序打印功能
复杂度分析

Max Complexity 为 8,而行业要求为 <=10,所以这是一个非常安全的范围
Max Depth 为 5,而行业要求为 <=3~4,说明存在深层嵌套代码,需要拆分方法优化,提升代码可读性
Avg Complexity 为 3.14,说明整体代码逻辑普遍偏简单,没有过度复杂的分支结构
踩坑心得
1:基础独立器件逻辑可靠,但信号传播模型存在缺陷
单独逻辑门运算完全正确,一旦出现多级串联、多分支负载就出错,说明引脚invalidate()失效连锁刷新、递归电平取值逻辑有漏洞,下游引脚电平不会同步更新。
2:忽视边界与非法布线校验
边界用例大面积失分,代码未提前拦截非法场景:单输入引脚被多个输出驱动、无信号源引脚、悬空高阻引脚,没有做前置异常判定,非法电路直接进入仿真导致输出错乱。
3:分层电路深度迭代仿真逻辑不完善
多层级联电路依赖循环迭代刷新电平,循环终止条件判断粗糙,多级信号无法传递到最末端,最终输出电平滞后、计算结果错误。
4:多负载引脚处理逻辑考虑不全
当一个输出引脚连接多个输入负载时,仅更新首个目标引脚电平,剩余负载引脚未同步加入失效列表,分支电路输出和预期不符。
5:输入鲁棒性不足,特殊格式输入未兼容
边界测试包含特殊空格、空连线、零输入器件、子电路跨端口引用等场景,文本解析模块缺少容错处理,读取器件 / 引脚信息错乱。
改进方法
1:修复引脚失效刷新逻辑,保证多分支、多级电路所有下游电平同步更新
2:新增布线冲突前置校验,提前拦截多源驱动、无效连线等边界错误
3:完善仿真循环终止条件,确保多层级联信号完全传递到位
4:优化输入解析,兼容空行、特殊格式等边界输入
5:拆分深层嵌套代码,抽离独立工具方法,降低代码嵌套深度
6:分层自测,逐类用例调试,打印引脚电平日志方便排错
第二次作业
作业要求
1、包含多输入输出的组合电路元件如数据选择器;
2、元件引脚类型除输入、输出之外,增加控制引脚,如三态门。
代码规模
Files 1
Lines 465
Statements 475
Classes 12
Avg Stmts/Method 3.14

类图

Main:程序入口主类,负责读取输入、调用解析、仿真、校验、输出全流程调度
数据载体类
Pin:复用原有引脚数据结构,兼容三态高阻无效电平
Component:抽象父类升级,支持多输出引脚返回结果
AndGate/OrGate/NotGate/XorGate/XnorGate:复用作业 1 基础门
TriStateGate/Decoder/Mux/Demux:新增复合器件,继承 Component,封装三态、译码、选择、分配器控制逻辑
工具类
ComponentFactory:扩展工厂分支,支持新增复合器件创建
Circuit:兼容旧解析逻辑,拓展多输出器件差异化打印、多引脚控制仿真逻辑
复杂度分析

Max Complexity 为 3.6,而行业要求为 <=10,所以这是一个非常安全的范围
Max Depth 为 2.7,而行业要求为 <=3~4,嵌套层级符合行业标准,代码可读性良好
Avg Complexity 为 3.14,说明整体代码逻辑普遍偏简单,没有过度复杂的分支结构
踩坑心得
1:独立基础元件全部通过,单一逻辑门运算、引脚基础封装逻辑无漏洞,基础功能稳定可靠。
2:简单级联、元件组合场景出现报错:少量简单电路输出结果计算错误,说明多器件信号传递、分支负载刷新存在缺陷。
3:复杂电路、多层组合用例出现非零返回程序异常退出,电路规模变大后缺少异常捕获,非法布线、多级信号递归时直接崩溃,鲁棒性不足。
4:边界场景容错缺失,多引脚联动、多器件串联时未做循环终止、冲突校验,复杂拓扑极易触发程序异常。
改进方法
1:完善引脚电平失效刷新逻辑,保证多分支下游引脚同步更新,修复简单电路计算错误。
2:全局增加 try-catch 异常捕获,对非法连线、递归过深等场景拦截,避免程序非零退出。
3:新增布线前置校验,提前检测多源驱动、悬空引脚等冲突,阻断非法拓扑进入仿真流程。
4:给仿真迭代循环增加最大迭代阈值,限制递归深度,防止多层电路死循环、栈溢出。
5:分层调试,先单门、再两级联、最后复杂电路,分步打印引脚电平定位信号传递 bug。
第三次作业
作业要求
1、增加子电路;
2、增加程序异常输入的检测。
代码规模
Files 1
Lines 405
Statements 396
Classes 9
Avg Stmts/Method 10.65

类图

Main:程序入口主类,负责读取输入、调用解析、仿真、校验、输出全流程调度
数据载体类
Pin:完整保留引脚信号链路、多源冲突检测基础数据
CircuitNode:组合模式抽象顶层,统一器件与子电路对外引脚查询接口
Component(继承 CircuitNode):所有独立器件叶子节点,包含基础门、复合门
SubCircuit(继承 CircuitNode):子电路容器载体,存储子电路编号、对外端口、内部所有器件,实现电路嵌套复用
工具类
ComponentFactory:全量器件静态创建工具
ErrorChecker:异常校验工具,分级检测布线冲突、非法连线、多源驱动等边界错误
MainCircuit:顶层总电路管理,存储全局输入、全部子电路,整合文本解析、错误校验、信号仿真、标准化输出流程
复杂度分析

Max Complexity 为 10.65,而行业要求为 <=10,略微超出安全阈值,部分方法分支逻辑偏复杂,需要拆分简化。
Max Depth 为 6,而行业要求为 <=3~4,存在多层嵌套的金字塔式代码,嵌套层级过深,可读性较差,需要拆分子方法降低嵌套深度。
Avg Complexity 为 3.44,说明整体代码逻辑普遍偏简单,仅少数方法分支过多,不存在全域复杂分支结构。
踩坑心得
1:基础单 / 多子电路、多级嵌套电路存在批量答错,说明子电路端口映射、内外引脚信号互通逻辑存在漏洞,内部元件与外部连线的电平同步更新不完整。
2:多子电路组合场景错误集中,子电路之间互相引用时,端口寻址、信号溯源计算逻辑失效,跨电路负载刷新遗漏。
3:异常校验模块部分单异常用例答错,说明异常优先级判断、错误信息匹配、冲突引脚判定规则存在遗漏,部分非法布线未被正确识别拦截。
4:边界容错不足:子电路空端口、跨层多层引用、多异常叠加场景,解析或仿真流程计算结果出错,鲁棒性较差。
改进方法
1:修复子电路端口信号传递逻辑,统一内外引脚失效刷新流程,保证子电路内外电平同步更新。
2:完善多子电路寻址逻辑,修正跨子电路端口引用解析规则,遍历全部跨电路下游负载。
3:补全异常校验判定分支,严格按题目优先级顺序检测布线冲突,覆盖全部非法输入场景。
4:拆分深层嵌套的子电路解析、仿真方法,降低代码嵌套深度,简化多层级信号递归逻辑。
5:分层单元测试:先单种子电路,再多子电路组合,最后异常边界用例,分步打印端口电平定位计算 bug。
最后总结
经过三次逐层递进的数字电路仿真 PTA 作业练习,我收获很多编程知识与实操经验。我熟练掌握基础 Java 语法与面向对象编程思想,能区分数据实体类、工具类,理清继承、组合类之间的关系。学会使用集合容器存储引脚、器件数据,掌握工厂模式创建不同逻辑器件,能完成文本解析、信号仿真、自定义排序、布线异常校验等功能,同时规范输入输出格式,代码编写、bug 排查能力明显提升。
完成作业时,我也发现自身存在不少短板。多层级联、多子电路场景的信号传递逻辑容易出错,边界、非法布线场景考虑不全。代码复杂度偏高,嵌套层数过深,不擅长拆分方法简化逻辑,代码优化能力不足。后续我会多分层调试测试用例,吃透电路信号传播逻辑,完善边界处理,精简嵌套代码,补齐短板。
写作业过程中,身边同学也出现不少共性问题。很多人出现类名、变量拼写、括号分号等基础语法错误,直接编译失败;文本解析没有兼容空行、特殊格式,读取数据错乱;没有拆分功能,把解析、仿真、校验全部写在同一个方法,代码结构混乱;引脚失效刷新逻辑不完善,多级电路输出计算出错;异常校验分支缺失,无法识别多源驱动等非法连线;不遵守题目输出格式规范,即便逻辑正确也拿不到满分。
针对这门课程学习,我提出几点简单建议。老师讲课通俗易懂,知识点讲解清晰。希望课堂多结合本次电路作业例题,重点讲解大家高频出错的信号仿真、子电路嵌套、布线校验逻辑,帮我们提前避开误区。课下布置简短小练习巩固面向对象、组合模式知识点,实验课多留现场调试代码的时间。作业输入输出格式、异常判定标准可以讲解得更细致,减少反复修改的时间。也希望多增加师生交流机会,遇到复杂电路仿真难题可以及时沟通解决。

浙公网安备 33010602011771号