NCHUD-数字电路模拟程序-Java三次作业总结

一、前言

1.1知识点覆盖

覆盖Java面向对象技术:抽象类、继承、多态、枚举类、方法重写与接口编程,依靠多态统一门电路计算;借助枚举封装元件标识,接口隔离通用输出行为。包含基础异常处理机制运用。严格遵循面向对象五大设计原则,严格执行单一职责原则;遵循开闭原则,同时依托里氏替换、依赖倒置、接口隔离。熟练运用 List、Map,依靠Pattern与Matcher正则分组解析输入。

1.2题量与难度分布

三次作业题量与难度递增。第一次作业难度较难,实现五类基础逻辑门仿真,侧重正则解析、基础继承与信号传递;第二次作业题量明显上涨,难度困难,类间继承与多态复杂度显著提升;第三次作业综合性最强,难度困难,新增子电路管理,以及多子电路处理,整体难度达到困难级别。

1.3 整体学习感受

经过三次作业,我对面向对象模块化设计、数字电路逻辑代码化实现有了更深的理解。在电路信号仿真与语法解析的过程中,我理清了不同逻辑元件的类职责划分。通过本次开发练习,我明白了严谨的架构设计能降低后续扩展与调试成本。同时,也发现了自己的许多不足,如面对困难时解决独自解决问题的能力尚且不足。另外,在Java语言学习当中还要许多细节知识没用掌握,后续想要逐渐学习补充,查漏补缺。

二、设计分析

2.1第一次作业

第一次作业源码SourceMonitor分析报表如下:
eb56f52f7852513d55e517e48a8c5de9

报表分析

总行数为 245 行,语句数达到 203 条,分支语句占比 24.1%,注释行占比仅 2.4%,注释补充不足;类与接口共 7 个,完成逻辑门抽象基类与五类基础门,平均每个类包含 3.57 个方法,单方法平均语句 6.24行;复杂度最高方法为readInput(),最大圈复杂度14,最大代码块深度6,平均块深度2.39,整体平均复杂度3.32,代码结构清晰,满足基础电路信号解析与运算需求。
第一次作业类图如下:
cbf62477961381995a92ee092707adf5

类图分析

本次作业以抽象父类Gate为抽象模板,五大基础逻辑门的继承。抽象类Gate封装所有门电路公共属性:元件名称、编号、输入引脚数量、输出引脚、引脚电平集合。AndGate、OrGate、NotGate、XorGate、XnorGate五个子类直接继承Gate。Main与各逻辑门为聚合关系。

心得

通过第一次基础数字门电路作业,我学会了将数字逻辑与面向对象结合设计。本次仅完成五大基础门电路功能实现,注释覆盖率偏低,后续迭代需要补充关键逻辑注释,提升代码可读性。

2.2第二次作业

第二次作业源码SourceMonitor分析报表如下:
63e9d9416f9ec2f572e74f8f5bb220a9

报表分析

行数上涨至550行,语句数345条,相较第一次代码量大幅扩充;分支语句占比20.3%,注释行占比提升至 6.5%,可读性优化;类与接口扩充至 16 个,类间继承与多态结构完善,平均每类 5.50 个方法,单方法平均语句降至2.09行,职责拆分更细化;复杂度最高方法为parseInput(),最大复杂度13,最大代码块深度7,平均块深度2.29,整体平均复杂度2.23。
第二次作业类图如下:
82b279c59691bcff5bccfeac2b3e6b66

类图分析

抽象类BasicElement,新增Element顶层接口,工厂模式ElementFactory统一元件实例化创建。保留原有五大基础门子类,新增TriStateGate(三态门)、Decoder(译码器)、Selector(数据选择器)、Allocator(数据分配器)子类;新增ElementType、Circuit、ConnectionTarget。Circuit与ElementFactory为组合关系。

心得

通过第二次作业,我学会了将复杂业务按元件类型细致拆分。本次新增三态门、译码器等四类元件后,类数量扩充至 16 个,同时注释占比提升至 6.5%,可读性提升,也让我明白前期架构分层越清晰,新增功能时代码改动量越小。

2.3第三次作业

第三次作业源码SourceMonitor分析报表如下:
644222c5eaa71d1ad842cb2caff56cd9

报表分析

行数为500行,语句数409条;分支语句占比升高至28.6%;注释行占比达到7.6%,注释量有所提升;类与接口8个,平均每类 3.75 个方法,单方法平均语句11.37行;复杂度最高方法为main(),最大圈复杂度 21,最大代码块深度7,平均块深度3.06,整体平均复杂度4.67,功能性与严谨性提升,但核心主方法太长,后续可继续拆分优化。
第三次作业类图如下:
33403ca090b278b89e840bd8bdf9d325

类图分析

新增CompositeCircuitDef子电路定义类,用于存储子电路编号、子电路内外输入输出别名、局部连接语句;新增Connection连接实体类;新增Context上下文管理类,管理当前子电路上下文、全局所有子电路定义、全局输入信号。新增FootType、GateType、endPort。子电路类与主Main为组合关系。原有门电路运算类无需改动。

心得

通过第三次作业,我学会了模块化与异常处理。我深刻意识到,复杂业务不能将全部在主方法中,后续需要异常校验、子电路独立子方法;这让我理解了软件模块化复用思想,合法输入与边界校验都要考虑,严谨能大幅减少运行时错误。

三、踩坑心得

3.1引脚信号多来源问题

问题:

第一次作业时,未对输入引脚做信号来源唯一性校验,不符合题目要求,电路运算结果完全错误。
测试样例:
INPUT: A-1 B-0
[A A(2)1-1]
[B A(2)1-1]
end
代码无冲突检测,最终输出结果随机。

解决方法:

创建hashMap,引脚全称为键,值为唯一绑定的输出源引脚。

心得:

简单的赋值问题,会直接影响整个电路逻辑运算结果,所有必须严格校验输入,避免后期调试难以修改调试。

3.2子电路引脚值拷贝而不是引用传递问题

问题:

第三次作业时,子电路输入别名只进行字符串值拷贝,主电路修改全局输入电平后,子电路内部引脚无法同步更新信号,子电路所有门电路始终读取初始默认值。

解决方法:

子电路输入输出别名引用全局固定信号容器,主电路电平修改实时同时修改子电路;实现主、子电路双向信号互通。

心得:

共享数据必须使用引用传递而非值拷贝。数据互通关乎代码能否正常运行,在编码过程中考虑问题应当仔细,思考数据之间的关联,减少后续修改难度。

3.3多异常叠加优先级判定顺序错误问题

问题:

第三次作业异常校验时,未按照题目规定优先级顺序校验,违背题目优先级规则,输出错误提示。
image

解决方法:

将五类异常按题目给定优先级,按照:多输入→无输入→无输出→顺序颠倒→引脚冲突的顺序依次校验。

心得:

业务异常处理必须严格遵循需求优先级规范,不能自主调整判断顺序。读题时应当仔细,严格遵循题目要求,从而书写正确代码,减少后续不必要改动。

四、改进建议

4.1输入解析部分优化

目前输入解析逻辑在主类方法中。后续计划封装独立输入解析工具类,统一封装元件命名正则、连接语句解析、子电路起止语句解析逻辑。

4.2扩展性优化

后续完善工厂方法模式,将每类元件的运算独立封装,后有功能扩展时仅需在这个基础上增加代码,而不是大幅修改代码,甚至完全抛弃原有代码逻辑。

4.3代码书写规范性

三次作业后部分核心方法存在代码对齐、注释分布不均问题,第一次作业注释率仅2.4%。后续统一遵循 Java驼峰命名规范,统一引脚、元件、子电路变量命名规则;为抽象方法、硬件运算逻辑、异常优先级规则添加块注释;拆分第三次作业中main主方法,按职责拆分子方法,提升整体可读性与可维护性。

五、总结

5.1学习收获

通过数字电路模拟程序三次作业的练习,复习巩固了课堂Java面向对象核心知识,熟练掌握抽象类、继承、多态、封装的使用,能够运用单一职责、开闭原则完成类设计,理清聚合、组合等类间关联关系;熟练运用正则表达式完成输入解析。同时将数字逻辑转化为代码逻辑,掌握多级异常优先级处理设计思路。在调试过程中,逻辑严谨性、问题拆解能力得到锻炼。

5.2自身不足和后续学习方向

短板

一是初期架构规划不合理,导致后修迭代代码大幅修改;
二是代码复用性设计不足,后续代码修改大;
三是注释量偏低,在写代码过程中没有养成注释习惯;
四是问题分析能力还是很薄弱,在面对复杂业务时总是无从下手,需要思考很久很久才有思路;
五是基础知识掌握还不够牢固,在完成项目过程中需要查阅大量基础知识资料,这方面花费时间相对较多。

后续学习方向

在今后的学习中,我会认真学习面向对象设计模式,提前用UML类图做好架构设计,提升代码可扩展性;勤加练习,在代码练习当中提升自己代码复用性的学习,拆解重复代码、抽取公共工具方法,改掉堆砌代码的坏习惯;写代码前先明确业务逻辑,避免写到一半思路混乱;最后,慢慢培养自己规范书写代码的习惯。

posted @ 2026-06-24 21:41  訫慟  阅读(4)  评论(0)    收藏  举报