面向对象设计与构造——作业集4~6的总结

写在前面

面向对象设计与构造作业集4~6结束了,这次作业集以数字电路模拟器为核心完成三次迭代作业,功能持续叠加、难度逐步上升,在整个单元的编码、调试、互测过程中我学到了很多:

  1. 掌握了Java封装、继承、多态核心语法,能够完成分层类设计;

  2. 建立起了面向对象建模思维,理解组合、继承两种复用方式的适用场景;

  3. 认识到代码可拓展性、低耦合架构对于迭代开发的关键意义。

Complexity Metrics(复杂度分析)

因为下面要用到复杂度分析,所以先在此给出一些相关概念。

我们需要使用的主要是方法和类的复杂度分析。

方法的复杂度分析主要基于循环复杂度的计算。循环复杂度是一种表示程序复杂度的软件度量,由程序流程图中的“基础路径”数量得来。

ev(G):即Essentail Complexity,用来表示一个方法的结构化程度,范围在[1,v(G)]​之间,值越大则程序的结构越“病态”,其计算过程和图的“缩点”有关。

iv(G):即Design Complexity,用来表示一个方法和他所调用的其他方法的紧密程度,范围也在[1,v(G)]​之间,值越大联系越紧密。

v(G):即循环复杂度,可以理解为穷尽程序流程每一条路径所需要的试验次数。

对于类,有OCavg和WMC两个项目,分别代表类的方法的平均循环复杂度和总循环复杂度。

下面我将从程序结构,公测、互测以及bug分析几个方面来总结我这次题目集的三次作业。

题目集4

题目要求

数字电路是一种处理离散信号的电子电路。与处理连续变化信号(如声音、温度)的模拟电路不同,数字电路只识别和运算两种基本状态:高电平(通常表示为“1”) 和 低电平(通常表示为“0”)。这正好与二进制数制系统相对应,使得数字电路成为所有计算机和数字系统的物理实现基础。

请编程实现数字电路模拟程序,

1、电路元件

电路中包含与门、或门、非门、异或门、同或门五种元件。元件特征如下:

与门:

包含两个或多个输入引脚和一个输出引脚。所有输入引脚必须都是高电平,输出引脚才是高电平,只要有一个输入引脚为低电平,输出引脚输出低电平。

或门:

包含两个或多个输入引脚和一个输出引脚。所有输入引脚必须都是低电平,输出引脚才是低电平,只要有一个输入引脚为高电平,输出引脚输出高电平。

非门:

包含一个输入引脚和一个输出引脚。输出引脚的电平与输入引脚的电平相反,如输入为低电平,输出则为高电平。

异或门:

包含两个输入引脚和一个输出引脚。当两个输入引脚电平不一致时输出引脚输出高电平,否则输出低电平。

同或门:

包含两个输入引脚和一个输出引脚。当两个输入引脚电平一致时输出引脚输出高电平,否则输出低电平。

2、程序输入

1)元件信息:

用A、O、N、X、Y 分别用作与门、或门、非门、异或门、同或门五种元件的元件标识符。

电路中的每个与门、或门用“标识符(输入引脚数)+编号”作为其元件名。

例如:A(8)1表示一个8输入引脚的与门,O(4)2代表一个4输入引脚的或门。

电路中的每个非门、异或门、同或门用“标识符+编号”作为其元件名。

例如:X8表示一个异或门,Y4代表一个同或门,N1代表一个非门。

约束条件:

不同元件的编号可以相同,如X4、Y4。

同一电路中同种元件的编号不可重复,可以不连续

2)引脚信息:

引脚信息由“元件名-引脚号”构成,。

例如:A(8)1-2代表与门A(8)1的2号引脚。

3)电路的输入信息:

电路的输入格式:

INPUT:英文空格+输入1+”-”+输入信号1+英文空格+输入2+....+输入n+”-”+输入信号n

例如:

“INPUT: A-0 B-1 C-0”代表整个电路包括3个输入:A、B、C 分别输入0,1,0信号。

4)连接信息

引脚的连接信息格式:

[+输出引脚+英文空格+输入引脚1+。。。。+英文空格+输入引脚+]

例如:

[A A(8)1-1 A(8)1-3 X5-2]

代表信号从引脚A发送给与门A(8)1的1、3两个引脚,以及异或门X5的2号引脚。

[Y8-0 N1-1 O(4)2-3 Y2-1]

代表信号从引脚Y8-0发送给非门N1的1号引脚、或门O(4)2的3号引脚、同或门Y2的1号引脚。

约束条件:

一个输出引脚可以连接多个输入引脚,即将输出引脚的信号传给每一个输入引脚。但一个输入引脚不能连接多个输出引脚。

输出引脚不能短接在一起。

5)输入结束信息

所有输入以end为结束标志,end之后出现的内容忽略不计

3、程序输出

按照与门、或门、非门、异或门、同或门的顺序依次输出所有元件的输出引脚电平。同类元件按编号从小到大的顺序排序。

如果某个元件的引脚没有接有效输入,元件输出无法计算,程序输出结果忽略该元件

4、测试输入默认满足以下条件:

1)每个元件的输入引脚连续编号。假设元件有n个输入引脚,则其编号取值范围为[1,n],且引脚号不重复。

2)本题涉及的五种元件都只有一个输出引脚,输出引脚号默认为0。

5、后续迭代设计
数字电路模拟程序1(本次作业):

基础逻辑门元件构成电路

数字电路模拟程序2:

1、包含多输入输出的组合电路元件如数据选择器;

2、元件引脚类型除输入、输出之外,增加控制引脚,如三态门。

数字电路模拟程序3:

增加带反馈的电路、时序电路元件,如D触发器、JK触发器。

数字电路模拟程序4:

1、增加子电路;

2、增加程序异常输入的检测。

实现方式

采用分层实体类建模,使用ArrayList存储所有器件、连线实体;读取输入文本后逐行解析构造引脚、逻辑门、连接关系;采用多轮循环迭代刷新所有引脚电平,直至电路电平不再变化达到稳态;最后按照AO-NXY固定顺序、器件编号升序完成输出格式化。

代码规模

题目集4代码规模如下图

屏幕截图 2026-06-23 203659

类图

题目集4类图结构:Main为主程序入口类,Circuit为电路总控类,Pin为引脚实体类,抽象类Gate为所有逻辑门父类,派生AndGate、OrGate、NotGate、XorGate、XnorGate五个子类;Connection连线类关联Pin与Gate,Gate与Pin为一对多组合关系,Circuit聚合所有Gate、Connection、Pin对象,通过«create»依赖关系创建各类器件实例

屏幕截图 2026-06-23 203506

复杂度分析

第一次作业的复杂度分析如下。

屏幕截图 2026-06-23 202343

屏幕截图 2026-06-23 202359

可以看出Circuit构造方法、printResult()打印方法圈复杂度 v (G) 极高,两个方法的共性是内部嵌套了大量多层 if/else 条件分支。其中构造方法复杂度过高,根源是输入解析正则匹配、各类器件实例化判断分支过多;print打印方法复杂度过高,是输出格式优化时对正负号、数字省略、器件分类的多重条件判断导致。

Bug分析

公测

我的程序公测无功能性逻辑错误,全部电路样例输出电平正确;但输出格式优化存在细节疏漏,部分输出字符串冗余字符,被扣少量格式性能分。

互测

互测阶段暂时没有找出问题。

题目集5

题目要求

数字电路是一种处理离散信号的电子电路。与处理连续变化信号(如声音、温度)的模拟电路不同,
数字电路只识别和运算两种基本状态:高电平(通常表示为“1”) 和 低电平(通常表示为“0”)。
这正好与二进制数制系统相对应,使得数字电路成为所有计算机和数字系统的物理实现基础。
请编程实现数字电路模拟程序。
以下内容中,首行用#号标注的为本次新增的题目要求,其余内容与“数字电路模拟程序-1”相同。

1、电路元件

电路中包含与门、或门、非门、异或门、同或门、三态门、译码器、数据选择器、数据分配器九种元件。元件特征如下:

与门:

包含两个或多个输入引脚和一个输出引脚。所有输入引脚必须都是高电平,输出引脚才是高电平,只要有一个输入引脚为低电平,输出引脚输出低电平。

或门:

包含两个或多个输入引脚和一个输出引脚。所有输入引脚必须都是低电平,输出引脚才是低电平,只要有一个输入引脚为高电平,输出引脚输出高电平。

非门:

包含一个输入引脚和一个输出引脚。输出引脚的电平与输入引脚的电平相反,如输入为低电平,输出则为高电平。

异或门:

包含两个输入引脚和一个输出引脚。当两个输入引脚电平不一致时输出引脚输出高电平,否则输出低电平。

同或门:

包含两个输入引脚和一个输出引脚。当两个输入引脚电平一致时输出引脚输出高电平,否则输出低电平。

三态门:

三态门的作用类似于电路中的开关。包含一个输入引脚、一个输入控制引脚、一个输出引脚。当控制引脚为高电平时,三态门输入输出之间导通,输出电平等于输入电平;当控制引脚为低电平时,三态门输入输出之间呈现高阻态(类似开关断开),输出为无效状态。

译码器:

译码器的作用是讲输入的编码转换为一路有效信号。一个译码器包含两个或多个输入引脚(如图中的A2\A1\A0)、三个控制引脚(如图中的S3\S2\S1)、4个或多个输出引脚(如图中的Y7~Y0)。根据输入输出的数量有2-4线译码器、3-8线译码器等。

当控制引脚当S1 =1,S2 +S3 =0时,译码器正常工作,输出引脚只有一个输出信号0,其余输出为1;哪个引脚输出0由输入引脚的编码决定,例如:图中的3-8线译码器三个输入引脚信号的编码与输出引脚的编码对应,A2\A1\A0输入000时,Y0输出0,其余输出1;A2\A1\A0输入001时,Y1输出0,其余输出1;依次类推。

控制引脚不满足S1 =1,S2 +S3 =0时,译码器处于无效状态,所有输出为无效值。

数据选择器:

数据选择器的作用是从多路输入信号中选择一个,并将其信号直接送往唯一的输出端,选择哪一路输入信号由控制端决定。如图所示控制端有两个则输入端有4个,S1\S0是两个控制端,D3D0是输入端,S1\S0的4种信号组合00、01、10、11分别选择D3D0其中一路输入。如S1S0=00,则Y=D0;S1S0=01,则Y=D1;S1S0=10,则Y=D2;S1S0=11,则Y=D3

根据输入引脚数量的不同有二选一数据选择器(1个控制端)、四选一数据选择器(2个控制端)、八选一数据选择器(3个控制端)等

数据分配器:

数据分配器的作用与数据选择器正好相反,是将唯一的一路输入信号输出到多路输出引脚的其中之一,选择哪一路输出引脚输出由控制端决定。如图所示控制端有两个AB,输出端有4个W0\W1\W2\W3,D是输入端,AB的4种信号组合00、01、10、11分别选择W3~W0其中一路输出,其他三路输出为无效状态。如AB=00,则W0=D;AB=01,则W1=D;AB=10,则W2=D;AB=11,则W3=D。

根据输出引脚数量的不同有二路数据分配器(1个控制端)、四路数据分配器(2个控制端)、八路数据分配器(3个控制端)等

2、程序输入

1)元件信息:

用A、O、N、X、Y、S 、M、Z、F分别用作
与门、或门、非门、异或门、同或门、
三态门、译码器、数据选择器、数据分配器九种元件的元件标识符。

电路中的每个与门、或门用“标识符(输入引脚数)+编号”作为其元件名。

例如:A(8)1表示一个8输入引脚的与门,O(4)2代表一个4输入引脚的或门。

电路中的每个非门、异或门、同或门用“标识符+编号”作为其元件名。

例如:X8表示一个异或门,Y4代表一个同或门,N1代表一个非门。

电路中的数据选择器、数据分配器用“标识符(控制引脚数)+编号”作为其元件名。

例如:Z(2)2代表一个四选一数据选择器,F(3)2代表一个8路数据分配器。

译码器用“标识符(输入引脚数)+编号”作为其元件名。

例如:M(3)1表示一个3-8线译码器。

约束条件:

不同元件的编号可以相同,如X4、Y4。
同一电路中同种元件的编号不可重复,可以不连续
2)#引脚信息:

引脚信息由“元件名-引脚号”构成。

例如:A(8)1-2代表与门A(8)1的2号引脚。

含控制引脚的元件如本次添加的所有元件,按控制-输入-输出的顺序排序,
每种类型的引脚按编号从小到大的顺序排序,
例如3-8线译码器M(3)1包含3个输入引脚、3个控制引脚、8个输出引脚,
M(3)1-0/1/2对应控制引脚S1/S2/S3,
M(3)1-3/4/5对应输入引脚A0/A1/A2,
M(3)1-6/7/8/9/10/11/12/13对应输出引脚Y0~Y7。
又如三态门的三个引脚,0号引脚为控制端、1号引脚为输入端、2号引脚为输出端。
3)电路的输入信息:

电路的输入格式:

INPUT:英文空格+输入1+”-”+输入信号1+英文空格+输入2+....+输入n+”-”+输入信号n
例如:
“INPUT: A-0 B-1 C-0”
代表整个电路包括3个输入:A、B、C 分别输入0,1,0信号。
4)连接信息

引脚的连接信息格式:

[输出引脚+英文空格+输入引脚1+。。。。+英文空格+输入引脚]
例如:
[A A(8)1-1 A(8)1-3 X5-2]
代表信号从引脚A发送给与门A(8)1的1、3两个引脚,以及异或门X5的2号引脚。

[Y8-0 N1-1 O(4)2-3 Y2-1]
代表信号从引脚Y8-0发送给非门N1的1号引脚、或门O(4)2的3号引脚、同或门Y2的1号引脚。
约束条件:

一个输出引脚可以连接多个输入引脚,即将输出引脚的信号传给每一个输入引脚。但一个输入引脚不能连接多个输出引脚。
输出引脚不能短接在一起。

5)输入结束信息

所有输入以end为结束标志,end之后出现的内容忽略不计
3、程序输出

按照与门、或门、非门、异或门、同或门、三态门、译码器、数据选择器、数据分配器的顺序依次输出所有元件的输出引脚电平。
同类元件按编号从小到大的顺序排序。

如果某个元件的引脚没有接有效输入、输入输出之间断开(如三态门)或控制引脚输入无效,元件输出无效,程序输出忽略该元件。
译码器不输出引脚电平,输出其输出为0的引脚的编号。如“M(3)1:3”代表译码器M3的输出引脚Y3输出0,其他引脚输出1。
数据分配器按引脚编号从小到大的顺序输出所有输出引脚的信号,无效状态引脚输出“-”。
如“F(2)1:--0-”代表分配器F1的输出引脚W2输出0信号,其他三个引脚为无效状态。
4、测试输入默认满足以下条件:

1)每个元件的输入引脚连续编号。假设元件有n个输入引脚,则其编号取值范围为[1,n],且引脚号不重复。
2)本题涉及的五种元件都只有一个输出引脚,输出引脚号默认为0。
5、本系列题目的迭代设计
数字电路模拟程序1:

基础逻辑门元件构成电路

数字电路模拟程序2(本次作业):

1、包含多输入输出的组合电路元件如数据选择器;

2、元件引脚类型除输入、输出之外,增加控制引脚,如三态门。

数字电路模拟程序3:

增加带反馈的电路、时序电路元件,如D触发器、JK触发器。

数字电路模拟程序4:

1、增加子电路;

2、增加程序异常输入的检测。

实现方法

将器件引脚划分为控制引脚集合、普通数据输入集合、多路输出集合,统一用-1标记高阻无效态0/1为有效电平;抽象Gate父类新增控制引脚、多输出引脚通用方法,四类新器件重写compute() 专属逻辑;迭代仿真复用第一次稳态循环机制,单次迭代内依次刷新基础门、组合器件电平;输出优化采用DFS深度遍历,对译码器、分配器输出字符串做分段化简处理。

代码规模

屏幕截图 2026-06-23 205700

类图

题目集5类图结构:新增ItemDegs三元组辅助类(存储译码器编码维度),Circuit电路类内部新增三态门、译码器、选择器、分配器子类创建方法;Gate抽象类扩充controlPins、outPins成员变量,所有新增组合器件继承Gate并重写计算逻辑;Main 主类依赖Circuit完成输入解析与仿真,Circuit通过 «create» 关系创建全部 Gate子类实例。

屏幕截图 2026-06-23 210131

复杂度分析

题目集5的复杂度分析如下。

屏幕截图 2026-06-23 210301

屏幕截图 2026-06-23 210330

其中四个方法复杂度过高,逐一分析:

  • Circuit.propagate方法是多层嵌套循环叠加,循环内部大量条件分支,存在大量无效重复计算。

  • Circuit.printOutput方法是多层嵌套循环加多重类型判断,分支爆炸,强制类型转换加重复引脚遍历,冗余遍历。

  • CreateDoor.createDoor方法是连续平铺多分支if-else链,圈复杂度极高,字符串解析逻辑重复冗余。

  • Demultiplexer.updateOutput、Decoder.updateOutput方法是多层循环嵌套加大量状态标记判断,大量布尔状态变量判断。

Bug分析

公测

程序所有电路逻辑无正确性Bug,电平运算完全匹配真值表;但仅实现了三角译码合并化简,未做贪心拆分、最短字符串优化,输出文本冗余较长。

互测

笔者的程序在互测中被发现3个bug,主要来源于几个方面:

  • Decoder、Demultiplexer 将实际运算写在updateOutput,重写的compute()空返回 0,违背父类抽象方法设计,调用 compute 会拿到错误电平。

  • 解析引脚名称反复split("-"),无空值、下标越界校验,非法引脚名会直接程序崩溃。

  • 电平统一用 - 1 代表无效,但部分分支仅单向判断无效,缺少双向校验,存在电平状态判断遗漏。

题目集6

题目要求

数字电路是一种处理离散信号的电子电路。与处理连续变化信号(如声音、温度)的模拟电路不同,数字电路只识别和运算两种基本状态:高电平(通常表示为“1”) 和 低电平(通常表示为“0”)。这正好与二进制数制系统相对应,使得数字电路成为所有计算机和数字系统的物理实现基础。本题目在“NCHUD-数字电路模拟程序-1”的基础上迭代,增加的功能参见题目中的标注。

请编程实现数字电路模拟程序,

1、电路元件

电路中包含与门、或门、非门、异或门、同或门五种元件。元件特征如下:

与门:

包含两个或多个输入引脚和一个输出引脚。所有输入引脚必须都是高电平,输出引脚才是高电平,只要有一个输入引脚为低电平,输出引脚输出低电平。

或门:

包含两个或多个输入引脚和一个输出引脚。所有输入引脚必须都是低电平,输出引脚才是低电平,只要有一个输入引脚为高电平,输出引脚输出高电平。

非门:

包含一个输入引脚和一个输出引脚。输出引脚的电平与输入引脚的电平相反,如输入为低电平,输出则为高电平。

异或门:

包含两个输入引脚和一个输出引脚。当两个输入引脚电平不一致时输出引脚输出高电平,否则输出低电平。

同或门:

包含两个输入引脚和一个输出引脚。当两个输入引脚电平一致时输出引脚输出高电平,否则输出低电平。

2、程序输入

1)元件信息:

用A、O、N、X、Y 分别用作与门、或门、非门、异或门、同或门五种元件的元件标识符。

电路中的每个与门、或门用“标识符(输入引脚数)+编号”作为其元件名。

例如:A(8)1表示一个8输入引脚的与门,O(4)2代表一个4输入引脚的或门。

电路中的每个非门、异或门、同或门用“标识符+编号”作为其元件名。

例如:X8表示一个异或门,Y4代表一个同或门,N1代表一个非门。

约束条件:

不同元件的编号可以相同,如X4、Y4。

同一电路中同种元件的编号不可重复,可以不连续

2)引脚信息:

引脚信息由“元件名-引脚号”构成,。

例如:A(8)1-2代表与门A(8)1的2号引脚。

3)电路的输入信息:

电路的输入格式:

INPUT:英文空格+输入1+”-”+输入信号1+英文空格+输入2+....+输入n+”-”+输入信号n

例如:

“INPUT: A-0 B-1 C-0”代表整个电路包括3个输入:A、B、C 分别输入0,1,0信号。

4)连接信息

引脚的连接信息格式:

[输出引脚+英文空格+输入引脚1+。。。。+英文空格+输入引脚]

例如:

[A A(8)1-1 A(8)1-3 X5-2]

代表信号从引脚A发送给与门A(8)1的1、3两个引脚,以及异或门X5的2号引脚。

[Y8-0 N1-1 O(4)2-3 Y2-1]

代表信号从引脚Y8-0发送给非门N1的1号引脚、或门O(4)2的3号引脚、同或门Y2的1号引脚。

约束条件:

一个输出引脚可以连接多个输入引脚,即将输出引脚的信号传给每一个输入引脚。但一个输入引脚不能连接多个输出引脚。

输出引脚不能短接在一起。

5)#子电路信息(本题在数字电路模拟程序-1基础上新增的内容)

可以将一部分电路设定为一个子电路,子电路可以在主电路中被引用。子电路的输入按顺序包括以下几部分:

子电路起始信息:C+子电路编号+:
子电路输入信息:

INPUT:输入1+英文空格+输入2+英文空格+....+英文空格+输入n,
子电路输出信息:

OUT:输出1+英文空格+输出2+英文空格+....+英文空格+输出n,

子电路连接信息:(格式与主电路输入信息相同),子电路的元件编号与主电路中的编号可能相同。

子电路结束标志:endc

输入、输出信息的编码可以作为子电路的引脚号在主电路中引用。

子电路元件输出时带上子电路的编号,格式为:子电路编号+“-”+元件编号+“-”+引脚号+“:”+引脚输出

例如:定义一个编号2的子电路,包含A、B两个输入和一个输出O:

C2:

INPUT:A B

OUT:C

[A X1-1]

[B X1-2]

[X1-0 Y1-1]

[A Y1-2]

[Y1-0 C]

endc

主电路中的运用:

INPUT: A-1 B-1

[A C2-A]

[B C2-B]

[C2-C N1-1]

[N1-0 OUT]

end

输出信息:

C2-X1-0:0

C2-Y1-0:0

N1-0 :1

所有子电路信息都在主电路信息之前定义完成。

6)#异常输入信息(本题在数字电路模拟程序-1基础上新增的内容)

当出现各类异常输入情况时,电路应输出相应提示,异常情况包括:

1.一个连接信息中包含两个或多个输入,输出:ERROR:“连接信息”+“英文空格”+include more than one input

例如:

INPUT: A-1 B-1

[A B A2-1]

应输出:

ERROR: [A B A2-1] include more than one input

2.一个连接信息中没有输入信息,输出:ERROR:“连接信息”+“英文空格”+include none input

例如:

INPUT: A-1 B-1

[C1-1 C2-1]

应输出:

ERROR: [C1-1 C2-1] include none input
注意:C1-1 C2-1引脚是元件的输入引脚,但作为连接信息,元件的输入引脚属于连接系统的输出,所以是none input

3.一个连接信息中没有输出,输出:ERROR:“连接信息”+“英文空格”+include none output

例如:

INPUT: A-1 B-1

[A]

应输出:ERROR: [A] include none output

4.一个连接信息中输入输出写反,输出:ERROR:“连接信息”+“英文空格”+input and output sequence error

例如:

INPUT: A-1 B-1

[A2-1 A]

应输出:ERROR: [A2-1 A] input and output sequence error

5.一个输入引脚接受中来自多个不同输出的信号,输出:ERROR:“输入引脚”+“英文空格”+input signal conflict

例如:

INPUT: A-1 B-1

[A A2-1]

[B A2-1]

应输出:ERROR: A2-1 input signal conflict

注:如果一条输入出现了多种异常,按以上异常先后顺序为优先级,顺序靠前者优先级越高,最后输出优先级最高的异常输出。

当电路输入信息中多条输入都包含异常,只处理排在最前面的异常信息。

7)输入结束信息

所有输入以end为结束标志,end之后出现的内容忽略不计

3、程序输出

按照与门、或门、非门、异或门、同或门的顺序依次输出所有元件的输出引脚电平。同类元件按编号从小到大的顺序排序。

如果某个元件的引脚没有接有效输入,元件输出无法计算,程序输出结果忽略该元件

4、测试输入默认满足以下条件:

1)每个元件的输入引脚连续编号。假设元件有n个输入引脚,则其编号取值范围为[1,n],且引脚号不重复。

2)本题涉及的五种元件都只有一个输出引脚,输出引脚号默认为0。

5、后续迭代设计
数字电路模拟程序1(本次作业):

基础逻辑门元件构成电路

数字电路模拟程序2:

1、包含多输入输出的组合电路元件如数据选择器;

2、元件引脚类型除输入、输出之外,增加控制引脚,如三态门。

数字电路模拟程序3:

增加带反馈的电路、时序电路元件,如D触发器、JK触发器。

数字电路模拟程序4:

1、增加子电路;

2、增加程序异常输入的检测。

实现方法

采用递归下降分析法解析子电路定义块、主电路输入,递归构造子电路内部器件、引脚、连线,解析完成存入 ArrayList 暂存;引入组合模式,设计 CircuitComponent 顶层抽象组件,普通逻辑门、子电路全部实现该接口,统一引脚读写、迭代计算接口;分层迭代,先刷新主电路顶层信号,再递归遍历所有子电路内部组件更新电平;

代码规模

题目集6的代码规模如下图

屏幕截图 2026-06-23 215126

类图

题目集6作业类图如下

屏幕截图 2026-06-23 215353

复杂度分析

第三次作业的复杂度分析如下。

屏幕截图 2026-06-23 215947

屏幕截图 2026-06-23 220033

对于其中几个比较复杂的方法,分析如下:

  • CircuitSimulator.simulate是循环嵌套加大量条件分支。

  • CircuitSimulator.parseSubCircuits是多分支分段解析输入,嵌套 if 大量堆叠。

  • CircuitSimulator.expandSubCircuit是多层循环处理子电路实例复制与引脚映射。

  • CircuitSimulator.parseMainCircuit是超长if-else类型判断链和正则匹配、字符串分割嵌套判断。

结合三次作业的复杂度分析,仔细思考了可能的解决方法:

  1. 将巨型方法拆分为小型私有工具函数,一个方法只负责单一操作,例如把BFS入队、门计算、引脚翻译单独抽离;

  2. 引脚、元件查找使用 HashMap 缓存,减少线性全量循环遍历,降低循环层数;

  3. 对不同门、不同引脚类型建立子类,通过多态替换超长类型判断链。

Bug分析

公测

程序无任何功能性逻辑 Bug,所有电路、子电路、异常检测样例输出全部合规;但性能优化存在短板:多余括号消除逻辑仅实现浅层简化,多层嵌套冗余括号无法完全去除,公测精心设计的极限优化样例输出字符串更长。

互测

引脚匹配正则不完善,无法识别多位数编号、多输入门引脚,合法引脚被判定非法。

题目集4~6总结

  1. 依托逻辑门抽象父类理解继承、模板思想;从长 if 分支踩坑学会工厂模式;通过子电路实现理解分层复用,懂得抽象要预留扩展接口,不能只适配短期需求;

  2. 掌握分行解析、字符串清洗、正则校验,认识外部输入不可信,必须前置拦截越界、格式转换等异常;

  3. 将复杂子电路功能拆分为解析、展开、校验、仿真、输出独立流程,分模块调试降低难度。

现存短板

  1. 只有代码出现长if、巨型类、大量重复代码后,才临时修改重构,编码初期不会主动用设计模式规避问题;

  2. 三次作业核心逻辑全部堆在CircuitSimulator一个类,解析、校验、仿真、打印、子电路展开全部混在一起,类代码超300行,方法互相大量调用,一处修改多处联动;

  3. 写代码优先实现功能,完全不考虑循环、查找的时间复杂度,大规模样例出现超时、迭代过多才临时优化哈希、BFS。

改进办法

  1. 每次作业动笔前绘制类图、整体流程图,划分模块边界、定义抽象父类与扩展接口,确定容器与算法选型,写完设计思路再编写代码,避免功能写完再大规模重构;

  2. 抽取字符串处理、引脚解析、正则校验静态工具类,消除全项目重复代码;

  3. 遇到多分支类型判断、大量同类对象创建、差异化计算逻辑时,主动使用工厂、模板模式,杜绝超长 if/else、巨型方法,控制单个方法圈复杂度在 10 以内。

posted @ 2026-06-23 22:53  王雨乐  阅读(3)  评论(0)    收藏  举报