Java面向对象的程序设计作业集4-6总结
一、前言
本课程OOP课程作业围绕逻辑电路仿真系统完成三次迭代开发,依次完成作业4、作业5、作业6开发。三份作业循序渐进迭代升级,以作业4底层代码为基础,作业5、作业6迭代优化架构、新增功能,贴合课堂面向对象、继承多态、分层建模、异常校验核心考点,全程使用Java语言开发,贴合课程SOLID设计原则要求。
1.1 知识点覆盖

1.2 量化指标对比

1.3 难度感受
作业四:入门基础仿真开发,核心难点为电路连线无序输入适配、多输入逻辑门求值、器件有序输出,需要解决连线先定义、器件后定义导致的求值失效问题,依托迭代循环完成电平传递。
作业五:全面重构代码架构,舍弃作业4过程式写法,改用抽象父类+子类多态开发,新增多输出、带控制引脚器件,核心难点为递归求值防环路、译码器电平逻辑适配、差异化格式输出,面向对象改造工作量较大。
作业六:回归底层电路逻辑迭代开发,兼容四五全部器件功能,新增子电路隔离域、全套报错机制,难点为全局/局部信号隔离同步、连线四条规则校验、同源引脚冲突检测,代码耦合度升高,异常分支极多,调试耗时最长。
二、设计与分析
2.1 作业 4:基础逻辑门单层仿真系统
核心指标:最大圈复杂度:6(正常)、注释率:16.2%(良好)

类图核心关系

Main:程序入口类,负责读取控制台输入、启动仿真流程;
Gate:基础逻辑门类,封装类型、编号、输入引脚、输出电平基础属性;
CircuitManager:电路管理类,全局存储输入电平、器件集合、连线映射关系;
ParseUtil:正则解析工具类,拆分输入指令、器件语句、连线语句;
SimUtil:仿真工具类,迭代扫描器件、判断引脚就绪、计算门电路电平;
SortUtil:排序工具类,按照规定类型、编号升序排序,规范输出格式。
设计心得
优点:采用迭代冒泡仿真,适配任意顺序连线输入,解决引脚悬空、先连线后定义器件求值报错问题;工具类拆分清晰,各司其职,符合单一职责原则;正则封装复用性高,适配多输入逻辑门解析。
缺点:全程使用全局Map存储数据,耦合度偏高;采用大量if分支判断门电路逻辑,新增器件需要改动核心计算代码,不符合开闭原则;无输入校验,非法格式输入直接程序终止。
2.2 作业 5:多功能器件面向对象仿真系统
核心指标:最大圈复杂度:7(正常)、注释率:15.8%(良好)

类图核心关系

Device:顶层抽象父类,定义求值、获取引脚抽象方法,封装通用器件属性;
五大子类:GateBasic基础门类、GateTri三态门类、GateDec译码器类、GateMux选择器类、GateDemux分路器类,重写compute求值方法;
CircuitManage:优化电路管理类,新增环路栈集合,管控递归求值流程;
OutPrint:独立输出类,区分普通器件、译码、分路差异化打印格式。
设计心得
优点:依托继承多态拆分器件逻辑,新增器件只需新建子类,无需改动核心仿真代码,满足开闭原则;递归求值效率优于迭代扫描,搭配栈集合规避组合逻辑环路死递归;区分控制引脚与数据引脚,贴合真实硬件电路逻辑。
缺点:未做引脚多源驱动冲突校验,电平直接覆盖;无连线语法校验,非法连线会直接报错崩溃;译码器、分路器计算逻辑耦合在子类内部,方法冗余,拆分度不足。
2.3 作业 6:子电路分层+全局异常仿真系统
核心指标:最大圈复杂度:13(偏高)、注释率:2.1%(极差)

类图核心关系

SubCircuit:独立子电路类,隔离局部输入、局部器件、局部连线,打造独立电路域;
Simulator:总调度类,统筹子电路解析、顶层电路解析、信号同步、错误判定;
ConnCheck:独立连线校验类,实现四条连线语法校验、引脚冲突检测;
Device子类:完全复用作业5器件子类,兼容全部原有电路逻辑。
设计心得
优点:实现电路分层模块化,子电路可被顶层调用复用,贴合工程模块化思想;搭建完整报错体系,区分语法错误、信号冲突错误,按题目格式输出ERROR;全局、局部信号双向同步,实现跨层级引脚电平传递;统一全部器件输出格式,规范输出排版。
缺点:Simulator调度类代码臃肿,整合解析、校验、仿真、输出全流程,单一方法职责过多;前期开发偷懒缺失代码注释,后期调试难度大;子电路无缓存机制,每次调用都会重新完整求值,运行效率偏低;仅支持单层子电路,无法多层嵌套调用。
三、常见问题与修复
1. 无序连线器件求值失败
问题:作业4输入顺序随意,先写入连线、后定义器件,导致引脚源数据为空,器件无法计算输出电平。
修复:设计循环迭代重试机制,每一轮遍历就绪器件,多轮冒泡更新电平,直到无新电平更新后停止仿真。
心得:电路仿真输入顺序不可固定,不能依赖固定输入格式,必须适配无序输入,这是电路仿真基础核心要点。
2. 组合逻辑环路递归栈溢出
问题:作业5器件自闭环连线,递归求值无限调用自身方法,直接栈溢出程序崩溃。
修复:新增求值栈集合,记录正在运算的器件,递归检索到栈内器件直接判定环路,终止递归返回空电平。
心得:递归高效但自带风险,但凡存在依赖调用逻辑,必须增加环路、死循环拦截机制。
3. 引脚多源驱动信号冲突无提示
问题:同一输入引脚被两条不同电平连线驱动,旧电平直接被覆盖,程序无报错,仿真结果失真。
修复:作业6新增引脚注册表,存入引脚已有电平,赋值前比对电平,不一致直接判定冲突,输出指定ERROR信息。
心得:硬件电路引脚不支持多源驱动,仿真代码必须贴合硬件物理规则,补齐容错校验逻辑。
4. 子电路端口电平无法互通
问题:顶层赋值子电路端口,子电路局部信号域无法读取全局端口电平,内部器件全部悬空无法求值。
修复:仿真子电路前置全局电平拷贝逻辑,把顶层Cx-端口电平同步写入子电路局部信号集合,实现跨域信号互通。
心得:分层电路必须做好域隔离,同时配套手动信号同步逻辑,全局、局部容器不能共用。
5. 连线首尾顺序校验文案颠倒
问题:连线输出源后置报错文字写反,输入输出提示文案和错误类型不匹配。
修复:重构校验分支语句,四类错误文案一一对应判定逻辑,逐行测试校验输出文案。
心得:异常输出文案必须贴合题目给定格式,细微文字错误都会导致测试点失分。
6. 代码注释缺失可维护性差
问题:作业6赶进度未添加任何注释,分层、校验逻辑复杂,隔段时间无法读懂自有代码。
修复:补充类功能注释、核心方法注释、分支逻辑注释,补齐关键步骤说明,提升代码可读性。
心得:面向对象开发不止实现功能,代码可读性、可维护性同等重要,注释是工程开发必备习惯。
四、改进建议
4.1 架构层面:彻底分层解耦
现有Simulator大类职责冗余,可拆分六层独立类,彻底落实单一职责原则,优化整体架构:

4.2 代码层面:针对性优化
1. 方法拆分:拆分Simulator臃肿方法,拆分校验、解析、仿真独立方法,把最大圈复杂度降低至8以内;
2. 性能优化:新增子电路电平缓存,端口电平无改动时,直接复用历史计算结果,避免重复运算;
3. 架构优化:引入工厂模式创建器件,彻底删除switch器件分支判断,适配后续新增硬件器件;
4. 异常优化:封装全局异常类,统一管控报错信息,严格贴合题目固定ERROR输出格式,不额外拓展冗余输出。
4.3 规范性优化
补齐作业6全量类、方法注释,把整体注释率提升至15%以上;统一全局变量、方法命名格式;编写简易边界测试用例,自测悬空引脚、环路连线、冲突引脚极端场景,提升代码鲁棒性。
五、总结
5.1 课程收获
四次到六次电路迭代作业,完整吃透Java面向对象核心知识点,完成从过程式编程到面向对象建模的思维转变。第一,建模能力提升,可以把逻辑门、子电路、连线、引脚等硬件概念,抽象为Java类、属性、方法,实现现实硬件数字化建模;第二,熟练运用SOLID设计原则,作业4落实单一职责,作业5落实继承多态开闭原则,作业6落实分层模块化设计;第三,工程思维养成,开发不再只求功能通过,兼顾代码耦合度、可读性、容错性、扩展性,学会迭代优化旧代码。

浙公网安备 33010602011771号