blog作业

一、前言
1.1 作业整体概况
三次迭代式Java编程作业,核心目标为使用面向对象思想,分阶段完成数字逻辑电路仿真系统开发,从基础逻辑门仿真,到通用元器件+引脚分层设计,最终支持子电路嵌套、电路语法错误检测,逐步贴合工业级电路仿真软件设计逻辑。知识点包括面向对象基础中的抽象类、抽象方法、继承;集合框架:HashMap、ArrayList;及正则表达式等等。三次作业为递进开发关系,后一次作业完全兼容前一次的电路功能,题量与难度都是逐级增加。
二、设计与分析
2.1第一次作业
2.1.1设计要求
电路中包含与门、或门、非门、异或门、同或门五种元件。元件特征如下:
与门:包含两个或多个输入引脚和一个输出引脚。所有输入引脚必须都是高电平,输出引脚才是高电平,只要有一个输入引脚为低电平,输出引脚输出低电平。
或门:包含两个或多个输入引脚和一个输出引脚。所有输入引脚必须都是低电平,输出引脚才是低电平,只要有一个输入引脚为高电平,输出引脚输出高电平。
非门:包含一个输入引脚和一个输出引脚。输出引脚的电平与输入引脚的电平相反,如输入为低电平,输出则为高电平。
异或门:包含两个输入引脚和一个输出引脚。当两个输入引脚电平不一致时输出引脚输出高电平,否则输出低电平。
同或门:包含两个输入引脚和一个输出引脚。当两个输入引脚电平一致时输出引脚输出高电平,否则输出低电平。
2.1.2输入要求
1)元件信息:
用A、O、N、X、Y 分别用作与门、或门、非门、异或门、同或门五种元件的元件标识符。
电路中的每个与门、或门用“标识符(输入引脚数)+编号”作为其元件名。
电路中的每个非门、异或门、同或门用“标识符+编号”作为其元件名。
约束条件:
不同元件的编号可以相同,如X4、Y4。
同一电路中同种元件的编号不可重复,可以不连续
2)引脚信息:
引脚信息由“元件名-引脚号”构成,。
3)电路的输入信息:
电路的输入格式:
INPUT:英文空格+输入1+”-”+输入信号1+英文空格+输入2+....+输入n+”-”+输入信号n
4)连接信息
引脚的连接信息格式:
[+输出引脚+英文空格+输入引脚1+。。。。+英文空格+输入引脚+]
约束条件:
一个输出引脚可以连接多个输入引脚,即将输出引脚的信号传给每一个输入引脚。但一个输入引脚不能连接多个输出引脚。
输出引脚不能短接在一起。
5)输入结束信息
所有输入以end为结束标志,end之后出现的内容忽略不计
2.1.3类图
image
2.1.4复杂度分析
image
(1)整体规模
代码总行数:368 行
有效语句:216 条
类与接口总数:8 个
平均每个类包含方法数:3.6 个
平均每个方法语句数:3.02 条
(2)复杂度核心指标
最大圈复杂度:11
平均圈复杂度:4.2
最深块嵌套:6
平均块深度:2.43
2.1.5结果
image
2.2第二次作业
2.2.1设计要求
电路中包含与门、或门、非门、异或门、同或门、三态门、译码器、数据选择器、数据分配器九种元件。(部分同上2.1.1)
2.2.2输入要求
同2.1.2。
2.1.3类图
image
image
2.1.4复杂度分析
image
image
(1)整体规模
代码总行数:796 行
有效语句:463 条
类与接口总数:14 个
平均每个类包含方法数:4.1 个
平均每个方法语句数:2.87 条
(2)复杂度核心指标
最大圈复杂度:14
平均圈复杂度:5.8
最深块嵌套:7
平均块深度:2.96
2.1.5结果
image
2.3第三次作业
2.3.1设计要求
电路中包含与门、或门、非门、异或门、同或门五种元件。(同2.1.1)
2.3.2输入要求
1)元件信息:
用A、O、N、X、Y 分别用作与门、或门、非门、异或门、同或门五种元件的元件标识符。
电路中的每个与门、或门用“标识符(输入引脚数)+编号”作为其元件名。
电路中的每个非门、异或门、同或门用“标识符+编号”作为其元件名。
约束条件:
不同元件的编号可以相同,如X4、Y4。
同一电路中同种元件的编号不可重复,可以不连续
2)引脚信息:
引脚信息由“元件名-引脚号”构成,。
3)电路的输入信息:
电路的输入格式:
INPUT:英文空格+输入1+”-”+输入信号1+英文空格+输入2+....+输入n+”-”+输入信号n
4)连接信息
引脚的连接信息格式:
[输出引脚+英文空格+输入引脚1+。。。。+英文空格+输入引脚]
约束条件:
一个输出引脚可以连接多个输入引脚,即将输出引脚的信号传给每一个输入引脚。但一个输入引脚不能连接多个输出引脚。
输出引脚不能短接在一起。
5)#子电路信息(本题在数字电路模拟程序-1基础上新增的内容)
可以将一部分电路设定为一个子电路,子电路可以在主电路中被引用。子电路的输入按顺序包括以下几部分:
子电路起始信息:C+子电路编号+:
子电路输入信息:
INPUT:输入1+英文空格+输入2+英文空格+....+英文空格+输入n,
子电路输出信息:
OUT:输出1+英文空格+输出2+英文空格+....+英文空格+输出n,
子电路连接信息:(格式与主电路输入信息相同),子电路的元件编号与主电路中的编号可能相同。
子电路结束标志:endc
输入、输出信息的编码可以作为子电路的引脚号在主电路中引用
子电路元件输出时带上子电路的编号,格式为:子电路编号+“-”+元件编号+“-”+引脚号+“:”+引脚输出
6)#异常输入信息(本题在数字电路模拟程序-1基础上新增的内容)
当出现各类异常输入情况时,电路应输出相应提示
7)输入结束信息
所有输入以end为结束标志,end之后出现的内容忽略不计
2.1.3类图
image
2.1.4复杂度分析
image
(1)整体规模
代码总行数:621 行
有效语句:375 条
类与接口总数:4 个
平均每个类包含方法数:7.5 个
平均每个方法语句数:4.32 条
(2)复杂度核心指标
最大圈复杂度:16
平均圈复杂度:6.3
最深块嵌套:8
平均块深度:3.41
2.1.5结果
image
三、总结部分
3.1踩坑心得

  1. 前两次作业完全没有输入合法性检测,非法输入直接程序崩溃;
  2. 第一次作业中正则分组顺序错误,分组索引颠倒,导致获取到的门编号和输入引脚数量完全相反;
  3. 第三次作业同一个目标引脚被两个不同源引脚驱动,属于电路短路错误,前期代码无检测,直接覆盖信号值。后期新增pinSource全局Map,记录引脚来源,重复绑定直接抛出错误信息。
    3.2改进建议
    1.三次代码中均存在硬编码字符串(引脚后缀-0、器件标识A/O/N等),建议全部抽取为全局常量,便于后期统一修改维护,减少魔法值。
    2.目前错误信息直接控制台打印,建议封装日志工具类,区分INFO、ERROR日志等级,方便调试和问题定位。
    3.所有集合取值前增加非空判断,避免空指针异常。
    4.统一使用HashMap有序集合,保证引脚遍历顺序固定,输出结果更加稳定
    5.重复访问同一引脚信号时,重复调用计算方法,可增加信号缓存机制,提升递归计算效率。
    3.3总结
    3.3.1收获
    1.从最基础的继承实现,到分层解耦、工厂模式、单一职责、开闭原则,完整经历了代码从混乱到规范、从冗余到简洁的全过程,理解了设计模式不是纸上谈兵,而是解决实际代码痛点的工具;
    2.学会了增量迭代开发思路,不一次性写出完美代码,而是先实现功能,再优化架构,最后补齐工程化容错能力;
    3.多级信号传播、递归子电路、连线语法校验都是复杂嵌套逻辑,通过拆分方法、拆分模块,能够将复杂电路仿真业务拆解为多个简单小方法;
    4.学会使用SourceMonitor分析代码圈复杂度,通过复杂度数据定位代码臃肿、分支过多的方法,针对性优化代码结构。
    3.3.2不足
    1.递归算法把控不足:子电路递归计算初期多次出现栈溢出问题,对递归终止条件、递归调用链路把控不够精准,后续需要专项练习递归算法与树结构遍历;
    2.代码健壮性考虑欠缺:前期两次作业完全忽略输入异常、边界用例,只会实现正向功能,不会考虑异常场景,后续开发需要养成先写边界测试用例、再写业务代码的习惯。
    3.工厂模式使用较为基础,没有结合反射实现彻底解耦,后续需要深入学习常用创建型、结构型设计模式,并在项目中灵活运用。
    3.3.3感悟
    三次作业从简单逻辑门到完整带错误检测、子电路复用的电路仿真器,完整复刻了小型软件的开发全流程:需求实现→架构重构→工程化完善。我深刻意识到,编程不仅仅是实现功能,更重要的是写出易读、易维护、易扩展、高健壮性的代码,后续编写代码会更加注重架构设计、异常处理和代码规范。
posted @ 2026-06-24 22:09  雨中賞霧  阅读(3)  评论(0)    收藏  举报