NCHUD-数字电路模拟程序-Java三次作业总结
一、前言
1.1知识点覆盖
覆盖Java面向对象技术:抽象类、继承、多态、枚举类、方法重写与接口编程,依靠多态统一门电路计算;借助枚举封装元件标识,接口隔离通用输出行为。包含基础异常处理机制运用。严格遵循面向对象五大设计原则,严格执行单一职责原则;遵循开闭原则,同时依托里氏替换、依赖倒置、接口隔离。熟练运用 List、Map,依靠Pattern与Matcher正则分组解析输入。
1.2题量与难度分布
三次作业题量与难度递增。第一次作业难度较难,实现五类基础逻辑门仿真,侧重正则解析、基础继承与信号传递;第二次作业题量明显上涨,难度困难,类间继承与多态复杂度显著提升;第三次作业综合性最强,难度困难,新增子电路管理,以及多子电路处理,整体难度达到困难级别。
1.3 整体学习感受
经过三次作业,我对面向对象模块化设计、数字电路逻辑代码化实现有了更深的理解。在电路信号仿真与语法解析的过程中,我理清了不同逻辑元件的类职责划分。通过本次开发练习,我明白了严谨的架构设计能降低后续扩展与调试成本。同时,也发现了自己的许多不足,如面对困难时解决独自解决问题的能力尚且不足。另外,在Java语言学习当中还要许多细节知识没用掌握,后续想要逐渐学习补充,查漏补缺。
二、设计分析
2.1第一次作业
第一次作业源码SourceMonitor分析报表如下:

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

类图分析
本次作业以抽象父类Gate为抽象模板,五大基础逻辑门的继承。抽象类Gate封装所有门电路公共属性:元件名称、编号、输入引脚数量、输出引脚、引脚电平集合。AndGate、OrGate、NotGate、XorGate、XnorGate五个子类直接继承Gate。Main与各逻辑门为聚合关系。
心得
通过第一次基础数字门电路作业,我学会了将数字逻辑与面向对象结合设计。本次仅完成五大基础门电路功能实现,注释覆盖率偏低,后续迭代需要补充关键逻辑注释,提升代码可读性。
2.2第二次作业
第二次作业源码SourceMonitor分析报表如下:

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

类图分析
抽象类BasicElement,新增Element顶层接口,工厂模式ElementFactory统一元件实例化创建。保留原有五大基础门子类,新增TriStateGate(三态门)、Decoder(译码器)、Selector(数据选择器)、Allocator(数据分配器)子类;新增ElementType、Circuit、ConnectionTarget。Circuit与ElementFactory为组合关系。
心得
通过第二次作业,我学会了将复杂业务按元件类型细致拆分。本次新增三态门、译码器等四类元件后,类数量扩充至 16 个,同时注释占比提升至 6.5%,可读性提升,也让我明白前期架构分层越清晰,新增功能时代码改动量越小。
2.3第三次作业
第三次作业源码SourceMonitor分析报表如下:

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

类图分析
新增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多异常叠加优先级判定顺序错误问题
问题:
第三次作业异常校验时,未按照题目规定优先级顺序校验,违背题目优先级规则,输出错误提示。

解决方法:
将五类异常按题目给定优先级,按照:多输入→无输入→无输出→顺序颠倒→引脚冲突的顺序依次校验。
心得:
业务异常处理必须严格遵循需求优先级规范,不能自主调整判断顺序。读题时应当仔细,严格遵循题目要求,从而书写正确代码,减少后续不必要改动。
四、改进建议
4.1输入解析部分优化
目前输入解析逻辑在主类方法中。后续计划封装独立输入解析工具类,统一封装元件命名正则、连接语句解析、子电路起止语句解析逻辑。
4.2扩展性优化
后续完善工厂方法模式,将每类元件的运算独立封装,后有功能扩展时仅需在这个基础上增加代码,而不是大幅修改代码,甚至完全抛弃原有代码逻辑。
4.3代码书写规范性
三次作业后部分核心方法存在代码对齐、注释分布不均问题,第一次作业注释率仅2.4%。后续统一遵循 Java驼峰命名规范,统一引脚、元件、子电路变量命名规则;为抽象方法、硬件运算逻辑、异常优先级规则添加块注释;拆分第三次作业中main主方法,按职责拆分子方法,提升整体可读性与可维护性。
五、总结
5.1学习收获
通过数字电路模拟程序三次作业的练习,复习巩固了课堂Java面向对象核心知识,熟练掌握抽象类、继承、多态、封装的使用,能够运用单一职责、开闭原则完成类设计,理清聚合、组合等类间关联关系;熟练运用正则表达式完成输入解析。同时将数字逻辑转化为代码逻辑,掌握多级异常优先级处理设计思路。在调试过程中,逻辑严谨性、问题拆解能力得到锻炼。
5.2自身不足和后续学习方向
短板
一是初期架构规划不合理,导致后修迭代代码大幅修改;
二是代码复用性设计不足,后续代码修改大;
三是注释量偏低,在写代码过程中没有养成注释习惯;
四是问题分析能力还是很薄弱,在面对复杂业务时总是无从下手,需要思考很久很久才有思路;
五是基础知识掌握还不够牢固,在完成项目过程中需要查阅大量基础知识资料,这方面花费时间相对较多。
后续学习方向
在今后的学习中,我会认真学习面向对象设计模式,提前用UML类图做好架构设计,提升代码可扩展性;勤加练习,在代码练习当中提升自己代码复用性的学习,拆解重复代码、抽取公共工具方法,改掉堆砌代码的坏习惯;写代码前先明确业务逻辑,避免写到一半思路混乱;最后,慢慢培养自己规范书写代码的习惯。
浙公网安备 33010602011771号