BLOG-1
前言
在完成题目集 4、5 和 6 的过程中,我们逐渐加深了对编程逻辑设计、面向对象编程以及模块化开发的理解。这三次作业从数据处理的复杂性到物理系统模拟的逻辑深度逐步递进。
答题判题程序-4:
以多种题型的判分为核心,新增了填空题和多选题,要求程序在支持动态输入解析的同时,兼顾题目删除、错题处理等场景,使代码逻辑更加复杂。
家居强电电路模拟程序-1:
聚焦于模拟现实中家居设备的电路逻辑,初步实现串联电路中开关、调速器和受控设备(如灯和风扇)的电压传递及设备状态模拟。
家居强电电路模拟程序-2:
在上一版本的基础上,增加了并联电路的逻辑,并引入了设备电阻的概念,进一步提高了电路模拟的精确性与复杂性。
通过这三次作业,我们逐渐认识到架构设计的重要性,并从较初级的功能实现逐步转向更注重代码的扩展性、模块化和可维护性。
设计与分析
答题判题程序
1.系统设计
该题目的核心是构建一个支持多题型判分的系统,涉及输入解析、题目管理、答卷处理和错误提示等功能。为实现这一目标,代码采用了分层设计,将题目、试卷、学生、答卷等模块独立封装,降低了系统的耦合度。
2.核心模块分析
题目类(Question)Question
为抽象基类,子类如 SingleChoiceQuestion
、MultipleChoiceQuestion
和 FillInBlankQuestion
分别实现不同题型的判分逻辑。
判分逻辑:
单选题:完全匹配得分。
多选题:分为完全正确、部分正确和错误,部分正确得一半分值。
填空题:完全匹配得分,部分匹配得一半分值。
试卷类(TestPaper)
管理试卷信息,包括题目列表和每题分数。
校验总分是否符合要求,输出警示信息。
答卷类(AnswerSheet)
存储学生的答题信息,并与试卷及题目关联。
通过遍历试卷中的题目,逐个调用题目类的判分方法,生成答题记录。
3.静态分析
代码行数:约 1000 行。
注释覆盖率:38%。
复杂性分析:
判题逻辑较复杂,嵌套条件较多,特别是多选题和填空题的部分正确判分部分。
输入解析模块重复代码较多,可以进一步优化。
- 核心逻辑展示
这段代码实现了多选题的判分逻辑,是 MultipleChoiceQuestion 类的核心方法:
将标准答案和学生答案转换为 Set,以便快速比较答案集合。
逻辑判断:
判断学生答案是否完全包含标准答案(完全正确)。
判断学生答案是否包含额外错误答案(有误)。
若既包含标准答案又没有额外错误答案,则为部分正确。
返回结果:
根据答案的正确性返回对应的得分和判分结果:完全正确得满分,部分正确得一半分值,错误答案或答案为空得 0 分。
意义:
灵活处理了多选题答案的复杂性,兼顾了完全正确和部分正确的判分逻辑,保证了系统的公平性。
- 心得与改进建议
心得:
使用子类实现不同题型的判分逻辑,增加了代码的灵活性和可扩展性。
判分逻辑清晰,但条件嵌套较多,导致代码复杂度较高。
改进建议:
优化输入解析模块,减少正则表达式重复使用。
对题目类进一步抽象,减少不同题型之间的逻辑重复。
家居强电电路模拟程序
1.系统设计
本题通过类的继承与多态,模拟了开关、调速器、灯具和风扇等家居电路设备的行为。串联电路的电压传递由 SeriesCircuit
类实现,设备状态由各自的子类负责计算。
- 核心模块分析
设备基类(CircuitDevice)
定义所有设备的公共属性,如引脚电压和设备编号。
子类分为两类:
控制设备(ControlDevice
):如开关、调速器。
受控设备(ControlledDevice
):如灯具、风扇。
控制设备Switch
:实现开关的状态切换和电压传递。SpeedController
:实现分档调速器逻辑,输出电压为输入电压的特定比例。ContinuousController
:实现连续调速器逻辑,可设置任意档位比例。
受控设备IncandescentLamp
:根据电压差计算亮度。Fan
:根据电压差计算转速。
串联电路(SeriesCircuit)
维护电路中设备的连接关系,并按照输入顺序传递电压。
实现电压阻断逻辑,如开关断开时,后续设备的电压均为 0。
- 静态分析
代码行数:约 950 行。
注释覆盖率:42%。
复杂性分析:
串联电路的电压传递逻辑较为复杂,需要考虑电压阻断的情况。
设备状态的计算逻辑较为简单,但亮度与转速的线性关系处理有重复代码。
- 核心逻辑展示
这段代码实现了串联电路的电压传递逻辑,是 SeriesCircuit 类的核心方法:
电压初始化:
电路以 VCC 电压 220V 为初始值。
通过 voltageBlocked 标志判断是否有设备(如开关)阻断了电压传递。
电压传递:
遍历连接列表,根据设备类型和状态计算输出电压。
若为控制设备(如开关、调速器),调用其 getOutputVoltage 方法获取输出电压。
若为开关且处于断开状态,阻断后续设备的电压传递。
设备状态更新:
受控设备(如灯、风扇)接收电压,计算其状态(亮度或转速)。
若电压被阻断或设备未通电,其状态设为初始值(如亮度为 0,转速为 0)。
意义:
模拟了真实电路中电压传递和设备状态的逻辑,体现了串联电路的特性。
通过开关的阻断机制,准确反映了设备间的依赖关系,为后续扩展并联电路奠定了基础。
5.心得与改进建议
心得:
通过类的继承和多态实现了电路设备的灵活模拟。
串联电路逻辑较为清晰,但设备之间的状态依赖较高,容易引发耦合问题。
改进建议:
优化设备状态的计算逻辑,避免电压传递与设备状态更新的相互干扰。
引入更抽象的电路模型类,减少对串联电路类的依赖。
采坑心得
在完成题目集 4、5 和 6 的过程中,我们在开发与测试中遇到了许多细节问题,这些问题暴露了我们在逻辑设计、代码实现和异常处理上的不足,同时也让我们深刻体会到代码优化和架构调整的重要性。在题目集 4 中,格式校验是最大的挑战之一,特别是试卷和答题信息的正则匹配,初期设计忽略了多余空格和格式错位的情况,导致一些错误信息未被捕获。后来通过优化正则表达式和增加手动校验规则,提高了程序的容错能力。此外,在判分过程中,删除题目和引用错误的处理也一度混乱。由于未能正确区分题目是否被删除,最初实现中直接对已删除题目进行判分,导致逻辑漏洞频现。我们引入了删除标志位,同时在判分逻辑中增加了状态校验,从而解决了这个问题。
在题目集 5 的开发中,串联电路的电压传递逻辑成为最大难点。特别是在处理开关设备时,未及时考虑电压被阻断后的状态传递,导致后续设备计算出现错误。为此,我们在电路模型中引入了 voltageBlocked
标志,用于标记电压是否中断,确保逻辑能够正确覆盖所有可能的状态变化。此外,设备状态的更新依赖于电路连接关系和电压传递,初期实现中过于耦合,调试和修改非常困难。通过将状态更新和电压传递分离,我们逐步优化了电路设备的状态计算逻辑,使程序更清晰、更易维护。
到了题目集 6,逻辑复杂性进一步增加,并联电路的引入以及电阻计算的需求为开发提出了更高要求。最初,我们在实现并联电路时,没有很好地处理支路电流的计算,导致总电流与支路电流不一致。此外,由于部分设备的电阻属性遗漏,在计算电流时出现了不符合实际的结果。在进一步调整中,我们通过为设备添加 resistance
属性并引入欧姆定律进行电流计算,最终解决了这一问题。同时,并联电路的逻辑需要处理输入电压一致性与电流分配,初期实现未对电压传递顺序进行严格约束,导致测试结果异常。通过对逻辑流程的优化,明确电压传递的优先级,并验证电路的完整性,我们提升了并联电路逻辑的正确性。
这些问题的解决过程让我们认识到,格式验证与逻辑优化在复杂系统中尤为重要,同时,良好的代码架构和详细的注释能够显著提高程序的可维护性与扩展性。在题目集 4 中,判分逻辑与数据处理之间的高耦合性带来了不少问题,后续我们尝试将两者解耦,逐步改进模块设计。在题目集 5 和 6 中,电路设备的逻辑与状态计算逐渐分离,并对设备功能进行了抽象化设计。这些改进为我们后续开发复杂项目奠定了坚实基础,也让我们认识到面向对象设计和单元测试的重要性。
改进建议
通过题目集 4、5 和 6 的逐步深入,我们积累了丰富的代码设计与调试经验,但也暴露了许多不足,特别是在模块解耦、错误处理和代码注释方面。未来,我们需要进一步优化判分逻辑与数据处理的解耦性。在题目集中,数据解析、错误提示、判分流程往往交织在一起,导致逻辑复杂度提升并且代码维护困难。如果能够通过策略模式或工厂模式,对题目类型、题目状态和判分规则进行统一管理,将显著提高代码的扩展性与灵活性。此外,可以尝试将错误提示信息配置化,将硬编码转移到外部资源文件中,这样可以根据不同需求动态调整提示信息,提高代码的适应性。在电路模拟中,并联与串联电路的计算逻辑可以进一步抽象,通过一个统一的电路模型接口对不同类型的电路进行管理,减少重复代码。
另一方面,代码的注释比例仍然不足,尤其是在复杂逻辑和条件判断处,缺乏足够的解释,导致调试时容易遗漏关键逻辑。我们建议在判分逻辑、电压传递逻辑等关键模块中添加详细的注释,说明条件分支的作用和预期输入输出。此外,复杂的方法可以进一步拆分为小的辅助方法,降低单一方法的复杂度,提高代码的可读性与可测试性。
总结
这三次作业的完成,让我们对面向对象编程、数据结构和代码优化有了更深刻的理解。从题目4的数据解析与判分逻辑,到题目集5的电路设备模拟,再到题目集6的并联电路与电阻计算,我们逐步掌握了如何应对复杂需求场景中的编程设计。虽然在开发过程中遇到了不少困难,但通过不断调试和优化,我们逐渐学会了如何构建健壮、可扩展的代码架构。这些实践经验将为我们后续的开发提供宝贵的指导,使我们能够从容应对更具挑战性的任务。