前言
本阶段的学习主要围绕两次题目集和一次课堂测验展开,其中核心内容是数字电路模拟程序的设计与实现。题目集四和五呈现了从简单到复杂的渐进式设计过程,考察了面向对象编程、算法设计、将实体抽象为数据类型的能力以及代码编写能力。
知识点分析:
-
题目集四:涉及基本的门电路(与门、或门、非门、异或门、同或门)、输入输出处理、对应的算法设计,根据单一职责原则,开闭原则等进行程序设计,将系统分为三个核心模块,
Pin类,Gate抽象类及子类和CircuitContext类。新增门电路时,仅需继承Gate类并实现calculateOutput()方法,无需修改原有代码。例如新增 “与非门”,只需创建NandGate子类,原有AndGate、OrGate等代码无需改动。我觉得难点主要在于如何将分散的门电路按逻辑连接,并保证信号按顺序传递。 -
题目集五:在题目集四的基础上,新增三态门、译码器、数据选择器、数据分配器。需要注意的点是,如何实现复杂原件,一开始的思路是,使用基础元件进行组合得到复杂原件,但是这样写效率很低,于是换成了模拟的方法。
-
课堂测验:侧重Java基础概念,包括类与对象、继承与多态、异常处理、集合框架等核心知识点。
设计与分析
题目集四设计与分析
- 输出顺序:按与门→或门→非门→异或门→同或门的顺序输出。
- 同类排序:同种元件按编号从小到大排序。
- 输出内容:各元件的输出引脚电平,无有效输入的元件不输出。
整体设计架构与核心思想
应该按真实电路的样子分层设计,分成五层来写,这样结构清晰,改bug也方便。我的设计思路:电路里有引脚类,有各种门类,还有个电路系统进行计算。引脚管信号传递,门管逻辑运算,系统管整体调度,各司其职,互相配合。
具体实现细节
1. 引脚类(Pin)
这个类我花了不少心思。引脚在真实电路里就是接线的点,有输入有输出。我在Pin类里记录了引脚名字、是输入还是输出、当前信号值。最关键的规则是:只有输出引脚才能给输入引脚传信号,这个必须严格遵守,不然就乱套了。另外,如果引脚没连好或者信号无效,那就标记为无效状态,不能参与计算。
2. 门电路类(Gate)
我写了一个Gate抽象类作为所有门的基类。这样做的好处是,所有门共通的东西都在这里写了,比如管理输入引脚、检查输入是否有效这些。然后各种具体的门(与门、或门、非门、异或门、同或门)都继承这个基类,每个子类只需要实现自己的计算逻辑就行。
比如与门,就是所有输入都为1时才输出1,否则输出0;或门是只要有一个输入为1就输出1。这些都是按照真值表来写的,一个门一个门地对照着真值表实现,虽然有点枯燥,但不容易出错。
3. 电路系统类(CircuitContext)
这个类相当于电路的总控中心。它要管理所有的门和引脚,还要处理用户输入的连接关系。最头疼的是计算顺序问题:A门的输出是B门的输入,必须先算A才能算B。我试了好几种方法,最后用了迭代计算:每次循环只算那些输入都准备好的门,直到所有能算的门都算完。
4. 工具类(GateNameParser)
解析元件名这个功能单独抽出来了。因为用户输入的名字像“A(8)1”这种,需要拆出类型、引脚数、编号等信息。单独写个解析类,代码看起来清爽多了,而且如果要改解析规则,只需要改这一个地方。
5. 主类(Main)
这个类比较简单,就是读用户输入,然后调用其他类干活,最后输出结果。把交互和业务逻辑分开,以后如果想改输入方式或者加图形界面,只需要改这里,不用动核心代码。
下面👇是我设计本次作业的类图。

SourceMonitor分析报告

题目集五设计与分析
相较于题目集四,题目集五新增的几个复杂的逻辑门电路,三态门,数据选择器等。正如前面所说,这里采用模拟的方法解题。



整体设计架构与核心思想
复杂门电路子类的核心设计:
SourceMonitor分析报告

代码评价:
代码规模:Main.java共698行代码,含458条语句,注释占比4.3%,注释覆盖度较低。
复杂度分布:方法最大复杂度为10,对应Main.createGateFromName(),该方法通过多分支判断创建不同类型门电路实例,分支逻辑导致复杂度较高;次高复杂度为9,对应DecoderGate.calculateOutput(),其需处理使能条件判定、输入编码转换、输出赋值等多步骤逻辑。
块深度:最大块深度为5,来自Main.createGateIfNeeded()的嵌套逻辑;整体平均块深度1.76,多数代码块嵌套层级合理,仅少数方法存在过深嵌套。
关键问题:createGateFromName()的多分支结构、DecoderGate.calculateOutput()的长逻辑链,是复杂度的主要来源;注释占比不足,代码可维护性待提升。
后续优化方向:拆分高复杂度方法的逻辑、增加注释、简化嵌套结构,降低代码复杂度与维护成本。
课堂测验
课堂测验考的都是java的基础知识点,虽然说是基础,但是想要在2个小时的时间做完近200道题也不是件容易事,需要有很扎实的基础。
