第4-5次作业总结

前言:

本次题目需应用工厂模式解耦元件创建逻辑,难点主要在于控制引脚的优先级处理,多输出引脚的状态管理,如何处理译码器输出编号、数据分配器输出 “-”,以及理解译码器的编码转换、数据选择器 / 分配器的控制引脚与输入 / 输出映射规则,需要较为具体地拆解复杂情景。

第四次作业

题目分析:

核心需求是实现数字电路元件的信号传播与输出计算,需处理:
1.通过特定命名规则解析门类型、输入引脚数;
2.处理输出引脚到多个输入引脚的单向传播,保证输入引脚唯一来源;
3.循环传播信号直到稳定,计算所有门的输出;
4.按门类型 + 编号的规则输出结果。

设计分析:

  1. 类结构设计
    Gate抽象类:定义门的公共属性和方法;
    子类:实现各自的输出计算逻辑;
    CircuitSimulator类:负责输入解析、信号传播、模拟执行的核心逻辑;
    Connection类:封装引脚间的连接关系。
  2. 核心逻辑设计
    用Scanner读取输入,区分INPUT行和连接行;通过正则表达式解析门名称,在createGate方法中创建对应门对象。
    用signalValues存储所有引脚的信号值;循环执行 “传播连接信号→计算门输出”,直到信号无变化。
    过滤出输入全有效的门,通过Comparator按类型 + ID 排序后输出。

类图设计:

lLPRQnD157uFv3yCyS6DJQ1UA5XAQ0qeXROH8oA83zFToJfqCxFCpDPAwODeNwne7mg2GcqVX89OA7smqDkVwIRroR_WN7Otaul1YdK32NlE-SxvpfUpPtQI2yX4r0pokQlWVFUaVRpRtZkCFvsqjhx7H-_pERw0IGWPR08tW9o3vNmEoEiET1TyHYFYLMb06RZIkAq-YPCo3x74SLDVnZ

SourceMonitor 报表分析:

屏幕截图 2025-12-14 201221

屏幕截图 2025-12-14 201228

屏幕截图 2025-12-14 201234

屏幕截图 2025-12-14 201240

屏幕截图 2025-12-14 201246

  1. 复杂度分析
    最复杂方法:CircuitSimulator.createGate()复杂度 11,语句数 33 条。
    平均复杂度 2.91,最大块深度 6:整体复杂度适中,但createGate和simulate方法的分支较多。
    CircuitSimulator.simulate()复杂度 6,语句数 14 条。
    Main.main()复杂度 6,语句数 12 条.
  2. 块深度分布
    块深度主要集中在 0-3 层,深度 5 以上仅 2 条语句:大部分逻辑的嵌套层级合理,但存在个别深度较高的分支。

改进方案:

  1. 降低方法复杂度
    将不同门的正则解析逻辑拆分为独立方,减少单个方法的分支数,降低复杂度;
    将 “传播连接信号” 和 “计算门输出” 拆分为propagateConnections和calculateGateOutputs两个方法,减少方法内的嵌套层级。
  2. 优化数据结构
    当前connections是Map<String, List>,可直接用Map<String, List>存储输入引脚列表,减少Connection类的冗余;
    gates用Map<String, Gate>存储名称到门的映射,可增加按类型分类的Map,简化输出排序时的分类逻辑。
  3. 性能优化
    当前simulate循环中每次复制signalValues,可改为记录 “变化的引脚”,减少复制开销;
    createGate中多次创建Pattern对象,可将常用正则定义为静态常量,避免重复编译。

第五次作业

题目分析:

新增了三态门、译码器、数据选择器、数据分配器4 种元件,同时调整了输入规则、输出格式:
1.从 5 种门扩展为 9 种元件,新增元件需处理控制引脚、多输出引脚、特殊输出格式。
2.含控制引脚的元件需按 “控制 - 输入 - 输出” 顺序定义引脚号。
3.输出顺序新增 4 种元件,区分 “无效输出” 场景,不同元件输出格式差异化。

设计分析:

  1. 类结构设计
    Component抽象类:统一封装所有元件的公共属性和方法,支持多元件扩展。
    元件子类:AndGate/TriStateGate/Decoder等子类实现各自的输出逻辑,通过ComponentOutput封装不同格式的输出。
    ComponentFactory工厂类:集中处理元件的创建逻辑,通过正则匹配元件名生成对应实例,解耦创建逻辑与业务逻辑。
    CircuitManager类:负责输入解析、信号传播、输出收集,作为电路的核心控制类。
  2. 核心逻辑设计
    拆分parseInputSignals和parseConnection,通过parsePinId方法统一解析 “元件名 - 引脚号” 格式,支持全局输入和元件引脚。
    先传递全局输入信号,再迭代传递元件输出,调用元件的calculateOutput获取输出,再传递到目标输入引脚。
    按题目要求的元件类型顺序分类,同类元件按编号排序,过滤出isValid为true的元件,输出其ComponentOutput结果。

类图设计:

jLTHRnD747wtvF-mCWzrI5811QGYP2LrHHi99qX1LQkAXyrvxQvothNsza8GGWfj3GHe6YbM4G4bX1OrQeMRD6eIOaB-ZDVdFFKli7TxTrxVNGX4uInPlfsPx_jcTlRcF6HnoBXTCTEfJu2ehOhrcVQpBV7wr_tQByvk8vso9Z6fGWOhm32XPO6RwHIGrnVGc2mpQfDYdfgKWHEbpzsFRw

SourceMonitor 报表分析:

屏幕截图 2025-12-14 203235

屏幕截图 2025-12-14 203252

屏幕截图 2025-12-14 203303

屏幕截图 2025-12-14 203311

  1. 复杂度分析
    最复杂方法:TriStateGate.calculateOutput()复杂度 6,语句数 8 条。
    平均复杂度 2.60,最大块深度 4:整体复杂度略有降低,但Demux.calculateOutput()等方法因多步骤逻辑仍有一定复杂度;
    AndGate.calculateOutput()/OrGate.calculateOutput()复杂度 5,主要是输入有效性循环检查;
    TriStateGate.calculateOutput()复杂度 6,包含多条件判断。
  2. 块深度分布
    块深度集中在 0-2 层,深度 3 以上仅 14 条语句,大部分逻辑的嵌套合理,新增元件的逻辑未引入过深嵌套。

改进方案:

  1. 优化元件工厂
    ComponentFactory中多个正则可定义为静态常量,避免重复编译。
  2. 简化信号传播逻辑
    propagateSignals中 “全局输入传递” 和 “元件输出传递” 可抽取为公共方法,减少代码重复。do-while循环存在冗余迭代,可通过 “标记已更新的元件” 减少循环次数。
  3. 增强输出兼容性
    为ComponentOutput添加静态工厂方法,统一不同元件的输出构造逻辑。

自我总结:

通过两次数字电路模拟程序的开发,我熟练掌握了“抽象基类+子类”的设计模式,能够针对多元件场景进行合理的类结构拆分,同时学会运用工厂模式解耦对象创建与业务逻辑。面对新增元件的复杂规则,我通过迭代循环、条件判断等实现状态稳定更新,同时熟悉了正则表达式在字符串解析中的应用。从第一版的CircuitSimulator到第二版的CircuitManager,逐步优化了核心控制类的职责划分,通过封装ComponentOutput类统一输出格式,解决了差异化输出的适配问题。
然而,虽然使用了工厂模式,但在信号传播、输出适配等场景中,仍有优化空间,后续需深入学习常见设计模式,并在实际项目中灵活运用。当前信号传播的迭代逻辑存在冗余循环,且缺少对非法输入的容错处理,后续需优化循环效率,同时添加异常处理、参数校验等逻辑。面对多元件、多连接的复杂电路,信号传播的效率仍有很大提升空间,后续应避免无效迭代,提升程序运行效率。

posted @ 2025-12-14 20:48  mike666  阅读(10)  评论(0)    收藏  举报