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

一、前言

本学期后期我连续完成了Java面向对象程序设计的作业集4、作业集5、作业集6三次作业。这三次作业主题统一,都是做数字逻辑门电路的仿真程序,从最简单的基础门电路,到复杂多输出器件,最后升级到支持子电路分层结构,整体难度是一步步提升的。让我从只会写简单类和对象,慢慢学会写结构清晰、能够迭代运行、可以分层管理的完整代码。

作业集4是最基础的版本,主要让我练习面向对象的封装、继承、抽象类和多态。题目只需要实现最基础的五种门电路:与门、或门、非门、异或门、同或门。整体逻辑比较简单,代码量不大,主要是熟悉不同门的计算方式,学会把不同门写成不同的子类,弄懂抽象类和抽象方法的使用规则。

作业集5在作业4的基础上做了大幅度升级。不仅保留了所有基础门电路,还新增了多种复杂器件,同时增加了 电路迭代刷新的功能。之前作业4只能跑一次逻辑,无法完成多级信号的传递,而作业5实现了循环的更新,让电路信号可以一直更新到稳定不变为止。这次作业的题量变多、边界情况变复杂,需要处理各种如特殊输入、空输入、引脚编号不匹配、输入未赋值等问题,整体难度明显高于作业4。

作业集6是三次作业中最难、代码量最大、功能最完善的最终版本。本次作业最大的变化是 新增了子电路功能,可以单独定义、独立运行、分层输出多个子电路。程序需要区分顶层电路和子电路,两者的数据互不干扰,各自独立。同时新增了错误检测、连线的合法性的判断、信号冲突检测、自动纠错等功能。整体代码结构非常庞大,逻辑分支非常多,是对前两次作业所有知识点的综合考察。

二、设计与分析

(一)作业集4代码设计与分析

作业集4是我第一次正式使用抽象类和继承写完整项目。本次作业的核心设计思路非常简单:把所有门电路的共同内容抽出来,做成一个父类Gate。所有门都有名字、类型、编号、输入引脚和输出结果,所以我把这些属性全部写在父类里。同时所有门都有计算逻辑,但是每种门的计算方式不一样,所以我在父类里写了一个空的抽象计算方法calc(),让每个子类自己实现计算规则。

我一共写了三个子类:与或门类、非门类、双输入异或同或门类。每个子类重写calc方法,实现自己的运算规则。主函数负责读取用户输入、解析门的名字、自动创建对应的门对象,最后统一计算并输出结果。

本次作业我的代码优点是结构清晰,不再像以前一样把所有代码写在主函数里。通过继承,我不用重复写每个门的共有属性,节省了大量代码。缺点也很明显:程序只能运行一次,电路信号不能多级传递,遇到复杂连线无法自动更新信号,只能满足最简单的电路场景。

这次作业让我真正理解了抽象类的作用:用来统一规范、统一方法名,让所有子类必须遵守同一套规则,方便统一管理所有对象。

(二)作业集5代码设计与分析

作业集5是对作业4的全面升级,我在保留原有结构的基础上,增加了迭代更新机制和多种新型器件。本次最大的改动是加入了 循环稳态仿真。原来作业4只会执行一次计算,电路中多级连线的信号无法一层层传递,导致复杂电路结果全部错误。作业5加入了do-while循环,只要电路中有任何信号发生变化,程序就会继续刷新,直到所有门的输出不再改变,电路达到稳定状态。

同时本次作业新增了很多复杂器件,部分器件拥有多个输出引脚、特殊计算规则。我在代码中增加了引脚标准化方法、引脚取值方法、类型判断方法,用来区分普通门、多输出门、特殊功能门。

本次代码结构比作业4复杂很多,主函数分成了输入解析、信号刷新、门计算、结果排序、分类输出多个模块。我也学会了使用比较器,将门电路按照编号从小到大排序输出,保证输出格式的规范。

(三)作业集6代码设计与分析

作业集6是我三次作业中写得最完整、改动最多、收获最大的一次。本次作业最大的更新就是 支持子电路功能。我新增了SubCircuit内部类,专门用来管理每一个子电路的数据,让每一个子电路都拥有自己独立的输入端口、输出端口、内部门、内部连线和信号数据。

在之前的作业4、5中,所有门全部放在一起,一旦出现同名的门就会出错,也无法区分顶层电路和局部电路。而作业6我把数据完全分层:顶层电路有自己的容器,每一个子电路也有自己独立的容器,互相不冲突、互不干扰,可以同时运行多个独立电路。

本次程序运行流程分为:读取子电路、读取顶层电路、顶层电路仿真、所有子电路独立仿真、分层排序输出。每一个功能我都单独写了一个方法,使得分工非常明确。

除此之外,我还增加了错误检测机制。可以检测连线写反、无效连线、信号冲突等错误,一旦检测到错误直接打印提示并终止程序,让程序变得更加优化,不会因为非法输入直接崩溃。

本次作业让我学会了 分层的思想、模块化的思想,知道了大型程序不能把所有数据写在一起,必须拆分模块、独立运行,这是我最大的收获。

三、采坑心得

三次作业我遇到了非常多的bug和问题,大部分问题都是非常容易踩的坑。
(一)作业4遇到的问题

  1. 字符串解析报错,程序运行崩溃

刚开始写作业4时,我直接强行截取字符串转数字,没有做判断。当输入的门名称格式不标准、缺少数字编号时,程序直接报数字转换异常并退出。我当时调试了很久才发现,用户输入不一定完全规范,所有字符串截取和数字转换都必须加容错判断。后面我添加了异常捕获,程序才可以正常处理各种输入格式。

  1. 多级电路结果全部为-1,无法更新

作业4最大的漏洞就是只能跑一次逻辑。比如第一个门输出结果需要传给第二个门,程序跑完第一轮就结束了,第二个门根本拿不到新信号,所有多级电路全部输出未知值。当时我一直以为是计算逻辑写错了,反复检查calc方法,最后才发现是没有循环刷新机制。这也让我明白电路仿真必须迭代更新。

(二)作业5遇到的问题

  1. 直接强制类型转换导致程序报错

作业5有很多特殊门子类,我一开始遍历所有Gate对象直接强转子类,结果普通门触发类型转换错误,程序直接终止。后来我才记住:必须先判断类型,再向下转型,不能随便强转。

  1. 引脚数量不够,数组下标越界

部分门的输入引脚编号很大,但初始化时列表长度固定,导致赋值时报错。我新增了动态扩容方法,自动补全空引脚数据,解决了下标越界问题。

  1. 循环死循环,程序卡死

最开始我只写了循环条件,没有最大循环次数限制,遇到环形电路会一直刷新、永远不停止。后面我设置了最大迭代上限,保证程序一定可以正常结束。

(三)作业6遇到的问题

  1. 顶层电路和子电路同名门冲突,数据错乱

这是我本次最大的坑。之前作业所有门放一起,名字必须唯一。作业6支持子电路后,顶层和子电路可以有同名门,但我一开始没有分层读取数据,导致程序永远只读取顶层门的数据,子电路全部错误。最后我通过单独设计子电路容器、分层取值、分层赋值,彻底解决了数据冲突问题。

  1. 子电路端口信号无法同步更新

最开始仿真时,顶层信号变了,但是子电路的输入端口永远不变,子电路全部输出-1。补充端口赋值逻辑后,子电路才能正常接收外部信号。

  1. 多条线路驱动同一个引脚,信号冲突

测试非法用例时,我发现两条连线同时驱动同一个引脚,程序不会报错,只会随机覆盖数值,结果完全错乱。我新增了全局驱动记录map,检测到重复驱动直接报错退出,保证电路逻辑合法。

  1. 子电路内部无法稳定,结果错误

一开始我只写了顶层循环,子电路内部没有循环,导致子电路多级信号传不完,结果一直错误。后来我单独给每个子电路写独立仿真循环,让子电路自己迭代到稳定,结果才完全正确。

  1. 输出顺序混乱

子电路原本用HashMap存储,输出顺序随机,不按编号从小到大。我将子电路转为List并自定义排序,实现按ID升序输出,格式完全符合题目要求。

四、改进建议

通过三次作业的不断迭代,我的代码已经可以完整实现所有功能,但依然存在可以继续优化、持续改进的地方。

第一,目前代码的工具方法太多、全部写在Main类中,未来可以单独新建工具类,把所有判断、解析、取值、格式化方法统一抽离出来,让主类更干净,符合模块化开发思想。现在所有静态方法全部堆积在Main中,代码看起来比较多且杂。

第二,目前所有报错信息只有简单提示,没有具体报错位置、报错线路、错误原因详情。后续可以优化报错系统,当检测到非法连线、信号冲突、格式错误时,精准提示用户哪一行输入错误、错误类型是什么,方便调试。

第三,当前程序最大迭代次数是固定数值,虽然可以防止死循环,但不够便捷。后续可以根据电路门的数量自动计算最大迭代次数,让小程序迭代更快、大电路迭代更稳定。

第四,目前新增器件需要手动添加类型判断、创建逻辑、输出逻辑。未来可以优化成配置式写法,统一管理所有器件类型,新增器件不用修改多处代码,提高代码扩展性。

五、总结

经过作业集4、5、6三次连续训练,我从一个只会写简单类和对象的初学者,慢慢掌握了Java面向对象编程的核心内容,真正弄懂了封装、继承、抽象类、多态的实际用处,不再只是背诵概念。

作业集4让我学会了基础面向对象写法,摆脱了面向过程的编程思维,懂得了用类封装事物的属性和行为。作业集5让我学会了循环迭代、稳态更新、类型转换、工具方法设计,能够处理复杂的业务逻辑和边界问题。作业集6让我学会了分层设计、模块化编程、数据隔离、错误处理,能够独立完成一个结构完整、功能完善的小型项目。

在三次作业中,我踩了大量的坑,比如类型转换异常、字符串解析错误、循环逻辑漏洞、数据冲突、分层混乱、输出格式错误等。每一次报错都让我更加理解Java代码的运行机制,也让我养成了写代码先考虑容错、先考虑结构、再写逻辑的好习惯。

同时我也发现自己的不足:代码拆分能力还不够强、工具方法过于集中、异常处理不够完善、面对复杂多层逻辑容易思路混乱。这些问题都是我后续需要继续学习和改进的地方。

总体来说,这三次作业是我本学期收获最大的编程训练,不仅巩固了课堂知识点,更提升了我的代码调试能力、问题排查能力、程序设计能力,为后续Java学习、以后项目的开发打下了非常扎实的基础。

posted @ 2026-06-23 23:24  孙晨皓  阅读(0)  评论(0)    收藏  举报