Java面向对象的程序设计作业集4-6总结

一、前言

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

1.1 知识点覆盖
image
1.2 量化指标对比
image
1.3 难度感受

作业四:入门基础仿真开发,核心难点为电路连线无序输入适配、多输入逻辑门求值、器件有序输出,需要解决连线先定义、器件后定义导致的求值失效问题,依托迭代循环完成电平传递。

作业五:全面重构代码架构,舍弃作业4过程式写法,改用抽象父类+子类多态开发,新增多输出、带控制引脚器件,核心难点为递归求值防环路、译码器电平逻辑适配、差异化格式输出,面向对象改造工作量较大。

作业六:回归底层电路逻辑迭代开发,兼容四五全部器件功能,新增子电路隔离域、全套报错机制,难点为全局/局部信号隔离同步、连线四条规则校验、同源引脚冲突检测,代码耦合度升高,异常分支极多,调试耗时最长。

二、设计与分析

2.1 作业 4:基础逻辑门单层仿真系统

核心指标:最大圈复杂度:6(正常)、注释率:16.2%(良好)
image

类图核心关系
5a6177120773b8924d39585c0e6eb03b

Main:程序入口类,负责读取控制台输入、启动仿真流程;

Gate:基础逻辑门类,封装类型、编号、输入引脚、输出电平基础属性;

CircuitManager:电路管理类,全局存储输入电平、器件集合、连线映射关系;

ParseUtil:正则解析工具类,拆分输入指令、器件语句、连线语句;

SimUtil:仿真工具类,迭代扫描器件、判断引脚就绪、计算门电路电平;

SortUtil:排序工具类,按照规定类型、编号升序排序,规范输出格式。

设计心得

优点:采用迭代冒泡仿真,适配任意顺序连线输入,解决引脚悬空、先连线后定义器件求值报错问题;工具类拆分清晰,各司其职,符合单一职责原则;正则封装复用性高,适配多输入逻辑门解析。

缺点:全程使用全局Map存储数据,耦合度偏高;采用大量if分支判断门电路逻辑,新增器件需要改动核心计算代码,不符合开闭原则;无输入校验,非法格式输入直接程序终止。

2.2 作业 5:多功能器件面向对象仿真系统

核心指标:最大圈复杂度:7(正常)、注释率:15.8%(良好)
image

类图核心关系
ca0647c443e24b5e067c3654314d7f88

Device:顶层抽象父类,定义求值、获取引脚抽象方法,封装通用器件属性;

五大子类:GateBasic基础门类、GateTri三态门类、GateDec译码器类、GateMux选择器类、GateDemux分路器类,重写compute求值方法;

CircuitManage:优化电路管理类,新增环路栈集合,管控递归求值流程;

OutPrint:独立输出类,区分普通器件、译码、分路差异化打印格式。

设计心得

优点:依托继承多态拆分器件逻辑,新增器件只需新建子类,无需改动核心仿真代码,满足开闭原则;递归求值效率优于迭代扫描,搭配栈集合规避组合逻辑环路死递归;区分控制引脚与数据引脚,贴合真实硬件电路逻辑。

缺点:未做引脚多源驱动冲突校验,电平直接覆盖;无连线语法校验,非法连线会直接报错崩溃;译码器、分路器计算逻辑耦合在子类内部,方法冗余,拆分度不足。

2.3 作业 6:子电路分层+全局异常仿真系统

核心指标:最大圈复杂度:13(偏高)、注释率:2.1%(极差)
image

类图核心关系
684574fc4d6a39e4ba20a6cc1b63f973

SubCircuit:独立子电路类,隔离局部输入、局部器件、局部连线,打造独立电路域;

Simulator:总调度类,统筹子电路解析、顶层电路解析、信号同步、错误判定;

ConnCheck:独立连线校验类,实现四条连线语法校验、引脚冲突检测;

Device子类:完全复用作业5器件子类,兼容全部原有电路逻辑。

设计心得

优点:实现电路分层模块化,子电路可被顶层调用复用,贴合工程模块化思想;搭建完整报错体系,区分语法错误、信号冲突错误,按题目格式输出ERROR;全局、局部信号双向同步,实现跨层级引脚电平传递;统一全部器件输出格式,规范输出排版。

缺点:Simulator调度类代码臃肿,整合解析、校验、仿真、输出全流程,单一方法职责过多;前期开发偷懒缺失代码注释,后期调试难度大;子电路无缓存机制,每次调用都会重新完整求值,运行效率偏低;仅支持单层子电路,无法多层嵌套调用。

三、常见问题与修复

1. 无序连线器件求值失败

问题:作业4输入顺序随意,先写入连线、后定义器件,导致引脚源数据为空,器件无法计算输出电平。

修复:设计循环迭代重试机制,每一轮遍历就绪器件,多轮冒泡更新电平,直到无新电平更新后停止仿真。

心得:电路仿真输入顺序不可固定,不能依赖固定输入格式,必须适配无序输入,这是电路仿真基础核心要点。

2. 组合逻辑环路递归栈溢出

问题:作业5器件自闭环连线,递归求值无限调用自身方法,直接栈溢出程序崩溃。

修复:新增求值栈集合,记录正在运算的器件,递归检索到栈内器件直接判定环路,终止递归返回空电平。

心得:递归高效但自带风险,但凡存在依赖调用逻辑,必须增加环路、死循环拦截机制。

3. 引脚多源驱动信号冲突无提示

问题:同一输入引脚被两条不同电平连线驱动,旧电平直接被覆盖,程序无报错,仿真结果失真。

修复:作业6新增引脚注册表,存入引脚已有电平,赋值前比对电平,不一致直接判定冲突,输出指定ERROR信息。

心得:硬件电路引脚不支持多源驱动,仿真代码必须贴合硬件物理规则,补齐容错校验逻辑。

4. 子电路端口电平无法互通

问题:顶层赋值子电路端口,子电路局部信号域无法读取全局端口电平,内部器件全部悬空无法求值。

修复:仿真子电路前置全局电平拷贝逻辑,把顶层Cx-端口电平同步写入子电路局部信号集合,实现跨域信号互通。

心得:分层电路必须做好域隔离,同时配套手动信号同步逻辑,全局、局部容器不能共用。

5. 连线首尾顺序校验文案颠倒

问题:连线输出源后置报错文字写反,输入输出提示文案和错误类型不匹配。

修复:重构校验分支语句,四类错误文案一一对应判定逻辑,逐行测试校验输出文案。

心得:异常输出文案必须贴合题目给定格式,细微文字错误都会导致测试点失分。

6. 代码注释缺失可维护性差

问题:作业6赶进度未添加任何注释,分层、校验逻辑复杂,隔段时间无法读懂自有代码。

修复:补充类功能注释、核心方法注释、分支逻辑注释,补齐关键步骤说明,提升代码可读性。

心得:面向对象开发不止实现功能,代码可读性、可维护性同等重要,注释是工程开发必备习惯。

四、改进建议

4.1 架构层面:彻底分层解耦

现有Simulator大类职责冗余,可拆分六层独立类,彻底落实单一职责原则,优化整体架构:
image

4.2 代码层面:针对性优化

1. 方法拆分:拆分Simulator臃肿方法,拆分校验、解析、仿真独立方法,把最大圈复杂度降低至8以内;

2. 性能优化:新增子电路电平缓存,端口电平无改动时,直接复用历史计算结果,避免重复运算;

3. 架构优化:引入工厂模式创建器件,彻底删除switch器件分支判断,适配后续新增硬件器件;

4. 异常优化:封装全局异常类,统一管控报错信息,严格贴合题目固定ERROR输出格式,不额外拓展冗余输出。

4.3 规范性优化

补齐作业6全量类、方法注释,把整体注释率提升至15%以上;统一全局变量、方法命名格式;编写简易边界测试用例,自测悬空引脚、环路连线、冲突引脚极端场景,提升代码鲁棒性。

五、总结

5.1 课程收获

四次到六次电路迭代作业,完整吃透Java面向对象核心知识点,完成从过程式编程到面向对象建模的思维转变。第一,建模能力提升,可以把逻辑门、子电路、连线、引脚等硬件概念,抽象为Java类、属性、方法,实现现实硬件数字化建模;第二,熟练运用SOLID设计原则,作业4落实单一职责,作业5落实继承多态开闭原则,作业6落实分层模块化设计;第三,工程思维养成,开发不再只求功能通过,兼顾代码耦合度、可读性、容错性、扩展性,学会迭代优化旧代码。

posted @ 2026-06-24 20:50  饶浩晖  阅读(1)  评论(0)    收藏  举报