25201503-付钰-PTA4-6作业总结

前言

在我看来,这三个题目集与上次的相比难度直线提升(可能是因为我数字逻辑比较差,理解题目比较困难,写起来就更困难了),而且题量也增加了许多。题目集4有8个类,主要考察了封装、继承、多态、抽象类与接口等知识点,题量有点多,我觉得有点难。题目集5有12个类,并且在考察原有知识点的基础上还新增了正则表达式的考察内容,题量增大,难度继续上升。题目集6共有5个类,要求对图论,集合框架熟练使用,并且对异常处理的要求更高了,整体综合性较强,题量较多,难度很大。


 

设计与分析

作业4

(1)作业要求

数字电路是一种处理离散信号的电子电路。与处理连续变化信号(如声音、温度)的模拟电路不同,数字电路只识别和运算两种基本状态:高电平(通常表示为“1”) 和 低电平(通常表示为“0”)。这正好与二进制数制系统相对应,使得数字电路成为所有计算机和数字系统的物理实现基础。请编程实现数字电路模拟程序:基础逻辑门元件构成电路。

(2)类图

image

 

(3)分析

image

 由图可知,作业4代码量最小,功能单一,包含1个接口,1个抽象类,5个门类(与、或、非、异或、同或)和1个主类,结构清晰,而且调用次数较少,逻辑简单,存在较深的嵌套(因为Main类中的解析循环)。它只支持简单的逻辑门运算,几乎没有复杂的控制流。

作业5

(1)作业要求

数字电路是一种处理离散信号的电子电路。与处理连续变化信号(如声音、温度)的模拟电路不同,数字电路只识别和运算两种基本状态:高电平(通常表示为“1”) 和 低电平(通常表示为“0”)。这正好与二进制数制系统相对应,使得数字电路成为所有计算机和数字系统的物理实现基础。请编程实现数字电路模拟程序:1、包含多输入输出的组合电路元件如数据选择器;2、元件引脚类型除输入、输出之外,增加控制引脚,如三态门。

(2)类图

image

(3)分析

image

 作业5相比作业4而言代码量增加了将近一半,类的数量增加至12个,职责划分更细。同时,它的调用次数翻倍,嵌套深度降低,逻辑复杂度有所上升。总而言之,作业5将原来的Main类拆分成了“解析”、“模拟”、“输出”等板块。虽然代码量增长,但代码结构更加清晰,可读性提升,体现了“高内聚、低耦合”的设计思想。

作业6

(1)作业要求

数字电路是一种处理离散信号的电子电路。与处理连续变化信号(如声音、温度)的模拟电路不同,数字电路只识别和运算两种基本状态:高电平(通常表示为“1”) 和 低电平(通常表示为“0”)。这正好与二进制数制系统相对应,使得数字电路成为所有计算机和数字系统的物理实现基础。本题目在“NCHUD-数字电路模拟程序-1”的基础上迭代,增加的功能参见题目中的标注。请编程实现数字电路模拟程序,1、增加带反馈的电路、时序电路元件,如D触发器、JK触发器;2、增加子电路;3、增加程序异常输入的检测。

(2)类图

image

(3)分析

image

 作业6代码量进一步增加,类的数量不增反降(只统计顶级公共类,将Connection、SubCircuitDef等作为内部类或数据容器合并到了Circuit中)。并且,因为引入了子电路展开、别名映射、缓存查找等复杂网络构建逻辑,它的调用次数暴增。它的每个方法平均语句较多,圈复杂度达到24(远超建议值10),说明存在一个非常复杂的方法(递归计算引脚值的computPin方法)。同时,它的平均复杂度较高,整体代码逻辑分支较多,嵌套深度再次上升。总之,作业6功能最强大但最复杂,新增了对子电路(SubCircuit)的定义、展开和信号传播支持,能够处理复杂的层级电路,存在较高的维护成本和潜在的Bug风险。


 

踩坑心得

作业4

在完成作业4的过程中,我遇到了许多困难。首先,我无法理解题意,不了解数字电路,对输入格式(元件定义、连接线、外部输入)和输出要求不清晰,需要通过上网查询逐步解读样例。其次,我的解析与数据建模存在问题:1.元件未显式定义:输入样例中只有连接线,没有单独一行来定义元件。程序仅解析元件定义行,导致componentList为空,输出为空。2.连接信息被覆盖:同一个输出引脚可能在多行连接中出现,使用fanout.put(outputPin,inputs)会覆盖之前的列表,导致部分连接丢失。而且,一开始的输出有格式问题最初输出为 元件名 输出值,但题目要求 元件名-0:输出值(例如 A(2)1-0:1)。

 

作业5

在完成作业5的过程中,我遇到了以下问题:第一,编译错误:1.变量名拼写错误,2.类型不匹配(如int与Integer比较)。第二,逻辑错误:1.输出有效标志管理。基类computeOutputs()先设置 outputValid=true,再调用compute(),而子类compute()中可能将其设为false,导致标志被覆盖,无效输出被错误地认为有效。2.传播计数器重复累加。同一输入引脚可能被多次赋值(例如扇出重复),导致计数器超过实际输入引脚数,使元件提前触发计算,或在未收到全部输入时误判为就绪。3.三态门无效处理。TriStateGate.compute()在控制端为0时仅设置outputValid=false并返回0,但computeOutputs()在outputValid=false时返回空Map,因此不会传播任何信号,符合要求。但若在computeOutputs()中返回空Map前未正确检查allInputsReady(),则可能提前计算。

作业6

在完成作业6的过程中,我遇到了许多逻辑问题和输入、输出问题。第一,逻辑错误:1.异常检测优先级顺序颠倒。题目规定的优先级为:①多个输出源(include more than one input)②无输入目标(include none input)③无输出源(include none output)④输入输出顺序错误⑤输入信号冲突原代码中checkExceptions()的检查顺序为:① → ③ → ② → ④,导致当同时出现“无输入”和“无输出”时,错误地报告了“无输出”(优先级低),从而未通过异常测试用例(如 case32、33、37、38 等)。2.子电路引脚映射不完整。expandSubcircuit中,对子电路内部连接的源和目标统一添加子电路前缀,但未正确处理:①子电路的输入引脚作为源时,应作为全局引脚参与外部连接,但sourceOfInput中并未主动建立其到外部信号的映射,完全依赖主电路连接。若主电路未连接该输入引脚,则计算时返回null,可能导致元件输出被忽略(可能影响部分多子电路用例)。②子电路的输出引脚作为目标时,建立了别名映射,但若输出引脚又被外部连接直接引用,可能因别名和sourceOfInput同时存在导致冲突或遗漏。3.元件编号提取出错。extractNumber在带前缀的元件名中提取数字时,可能因正则匹配\d+$错误提取到子电路编号1而非元件编号1(实际上这里提取的是1,但元件编号也是1,可能无影响)。但对于A(2)10和A(2)1,排序可能出错,因为extractNumber只取最后一个数字,可能误判。第二,输入输出问题:1.异常信息格式错误。2.子电路输出缺失。3.未连接的元件没有忽略。


 

改进建议

作业4

尽管过了作业4所有的测试点,但我的代码还有改进的空间。例如,Main类职责过重,可以拆分职责,将解析、模拟、输出分离到不同的类,引入Circuit类作为数据容器,存储组件和连接关系。其次,使用Map<String,Integer>统一表示引脚值,避免数组越界。同时,加入输入校验,检查输入是否完整、连接是否有环等,避免输入异常直接崩溃。

作业5

我的代码仍然存在一些需要改进的地方:1.Circuit类包含大量public getter/setter方法,暴露了内部数据结构,破坏封装,可以将components、fanout等设为private,提供行为方法而不是直接暴露集合。2.修复传播计数器重复累加问题。3.输出有效标志管理规范化。4.引入异常体系,定义CircuitException,在解析和模拟中抛出明确的异常,而不是返回-1或null。

 

作业6

 我的代码依旧存在一些不足:1.降低圈复杂度,拆分computePin,将“处理别名”、“处理顶层输入”、“处理门计算”、“处理源映射”分别提取为私有方法。2.修正异常检测的优先级顺序。3.完善子电路的引脚映射。3.修正引脚映射判断getPinType。4. 优化递归计算,防止栈溢出,使用显式栈替代递归,进行拓扑排序后按序计算。


 

 

总结

一、知识点掌握情况

完成三次数字电路作业后,我吃透了面向对象四大特性,熟练区分抽象类与接口,实践工厂、建造者等设计模式思路。同时,我学会了运用各类集合框架,掌握正则解析、异常校验,还借助图论、递归实现了时序反馈电路的信号计算。

二、设计原则的实践与反思

在开发中,我落实单一职责、开闭、依赖倒置等设计原则,拆分各类功能模块降低耦合。但我的代码仍存在缺陷:大量 switch 判断违背开闭原则,内部数据过度暴露,异常处理方式简陋,递归求值有栈溢出隐患,且全程缺少代码注释。

三、遇见的困难与成长

在我看来,最难的是从面向过程转为面向对象编程,反馈电路递归循环、异常检测优先级、子电路引脚映射都曾卡壳。反复调试排查问题后,我学会先画类图再编码,调试与代码分层能力大幅提升,也补齐了数字电路相关的基础知识。

四、未来改进方向

我后续会深耕各类设计模式,系统学习图论相关算法,学习 JUnit 单元测试、Git 版本管理,尝试用 Java 函数式编程简化集合操作,全方位提升工程开发能力。

五、心得感悟

三次电路模拟器开发一路充满挑战,也让我收获良多。前期啃懂陌生数字电路知识虽耗时,却为后续迭代筑牢根基。重构的价值、各类 bug 带来的经验教训,让我真正读懂面向对象的核心是梳理复杂业务的思维方式。完整走完需求、设计、编码、调错全流程,也让我明白编程不只是写代码,更要兼顾架构与代码质量,这段实践经历让我收获颇丰。

posted @ 2026-06-24 21:14  复数1  阅读(4)  评论(0)    收藏  举报