第七次大作业和第八次大作业总结
第七次大作业和第八次大作业总结
前言
在第七次作业和第八次大作业中,我的得分很低,对java感到有心无力,每一次迭代都感觉只是添加了一些细节去更符合我们的日常需求,但难度上却感觉到有非常大的提升这也同时也提高了我对复杂问题分解的能力和对一些情况的思考能力。比如第七次对互斥开关的加入电路是情况的复杂化还有第八次添加引脚
题目量:共有 2 道题目,分别涉及算法实现和面向对象设计。
难度:我觉得很难,非常具有挑战性,尤其是引脚细节上的处理,增加对引脚电压的计算和电路的复杂设计。
知识点:本次题目涉及的主要知识点包括数据结构、算法设计、面向对象编程以及设计模式。
设计与分析
第七次题目分析
1. 源码分析
在电路解析上使用正则表达式提取输入中的串联和并联关系,并将其解析为数据结构(如 Map<String, List
# 解析串联电路和并联电路
Pattern seriesPattern = Pattern.compile("#T(\\d+):(.*)");
Matcher matcher = seriesPattern.matcher(conn);
Pattern parallelPattern = Pattern.compile("#M(\\d+):\\[(.*)\\]");
Matcher matcher = parallelPattern.matcher(conn);
# 提取设备引脚
Matcher pinMatcher = Pattern.compile("\\[(.*?)\\]").matcher(parts);
while (pinMatcher.find()) {
pins.add(pinMatcher.group(1).trim());
}
在设备初始化上使用工厂方法模式,先解析设备类型和编号:设备ID的第一个字符表示设备类型。剩余部分表示设备的唯一编号(如 1 表示 K1)。根据类型创建对应的设备实例:通过 switch 语句,根据类型标识符创建相应的设备对象。
# 工厂方法 createDevice
public static Electric createDevice(String deviceId) {
String type = deviceId.substring(0, 1);
String id = deviceId.substring(1);
switch (type) {
case "K":
return new Kaiguan(id);
case "F":
return new Fendang(id);
case "L":
return new Lianxu(id);
case "B":
return new Baichi(id);
case "R":
return new Riguang(id);
case "D":
return new Diaoshan(id);
case "A":
return new Luodi(id);
case "H":
return new Bi(id);
case "S":
return new Shuanglian(id);
default:
return null;
}
}
2.类图设计和生成报表
这里给出类图设计
这里给出生成报表
第八次题目分析
1. 源码分析
这次题目在上次的基础上迭代,电路更加复杂,并联电路M中的串联电路可以包含别的并联电路且迭代模拟一种受控窗帘。同时还增加了管脚电压的显示。总而言之,可以发现题目越来越贴近我们的生活实际,要求也越来越多,电路更加复杂,考虑情况也更多。在电路管理上维护一个串联电路的列表,表示并联分支。确保各并联分支电压相同,累加各分支电流得到总电流。若任一分支短路,整个并联电路视为短路。我在设备管理上维护一个设备列表,表示串联连接的设备。遍历设备列表,累加总电阻,处理特殊设备如互斥开关和二极管。总电阻和电压差计算电流,更新各设备的状态。
# 电路类 ParallelCircuit
static class ParallelCircuit extends Circuit {
List<Circuit> circuitList = new ArrayList<>();
public ParallelCircuit(String id) {
super(id);
}
@Override
public int getPinCount() {
return 2;
}
@Override
public void updateState() {
// 并联两端电压相同 => M-IN, M-OUT
double vin = getPinVoltage(0);
double vout = getPinVoltage(1);
double diff = vin - vout;
// 并联总电流 = 各支路电流之和
double totalI = 0.0;
for (Circuit c : circuitList) {
c.setPinVoltage(0, vin);
c.setPinVoltage(1, vout);
c.updateState();
// c.current => 这条支路的电流
if (c.current == Double.POSITIVE_INFINITY) {
// 短路
this.current = Double.POSITIVE_INFINITY;
break;
}
totalI += c.current;
}
this.current = totalI;
checkOverCurrent();
}
@Override
public String showInfo() {
return ""; // 并联电路本身也不单独显示
}
}
在这次大作业中使用 deviceMap 统一管理所有设备和电路,便于快速查找和操作,减少重复创建和管理的复杂性。过递归调用 updateState 方法,确保整个电路网络的状态能够一致地更新和求解,考虑了设备间的相互影响。按照设备类型和编号顺序输出结果。
# outputResult 方法
static void outputResult() {
if (shortCircuit) {
System.out.println("short circuit error");
return;
}
// 分类存储并排序输出
Map<Character, List<Device>> mapByKind = /* 分类 */;
for (char c : order) {
List<Device> list = mapByKind.get(c);
if (list == null) continue;
list.sort(/* 按编号排序 */);
for (Device dev : list) {
String out = dev.showInfo();
if (!out.isEmpty()) {
System.out.println(out);
}
}
}
}
2.类图设计和生成报表
这里给出类图设计
这里给出生成报表
踩坑心得
第七次作业踩坑心得
感觉其实没踩什么坑,就是不会,主要的问题还是在电路设计上,
第八次作业踩坑心得
感觉其实没踩什么坑,就是不会,主要的问题还是在电路设计上,因为并联电路M中的串联电路可以包含别的并联电路,所以电路设计更加复杂,最初在设计设备和电路的类结构时,没有清晰地定义抽象层次,导致具体设备和电路类之间的职责不明确,通过引入抽象类 Device 和 Circuit,明确了设备与电路的基本属性和行为。在处理不同设备的电流和电压计算时,尤其是涉及到互斥开关和二极管等特殊设备,逻辑变得复杂,容易出错。例如,二极管在正向和反向时的导通状态不同,处理不当会导致整个电路计算错误。为每种特殊设备(如 MutualSwitch 和 Diode)单独实现 updateState 方法,确保其行为符合实际电路特性。同时,在 SeriesCircuit 和 ParallelCircuit 中分别处理这些设备的特殊逻辑,确保电流和电压的计算准确。
static class Diode extends Device {
private boolean conduction;
@Override
public void updateState() {
double diff = getPinVoltage(0) - getPinVoltage(1);
if (diff > 0) {
conduction = true;
current = diff / 1e-6; // 近似极大电流
} else {
conduction = false;
current = 0;
}
checkOverCurrent();
}
}
在构建复杂的串联和并联电路网络时,如何正确地递归更新各个设备和电路的状态成为一个难点。初期的实现导致电压和电流分配不准确,尤其是在多级嵌套的电路中。
采用递归的方法,通过 updateState 方法逐层更新电路状态。在 SeriesCircuit 中,先计算总电阻,再根据总电阻和电压差计算总电流,并将电流分配给各个设备。对于 ParallelCircuit,确保各并联分支的电压一致,累加各支路电流。必要时,设置标志位如 shortCircuit 来检测短路情况,及时终止计算。
static class SeriesCircuit extends Circuit {
List<Device> deviceList = new ArrayList<>();
@Override
public void updateState() {
double totalR = 0.0;
for (Device d : deviceList) {
if (d instanceof MutualSwitch) {
totalR += ((MutualSwitch)d).upState ? 5.0 : 10.0;
}
else if (d instanceof Diode) {
Diode dd = (Diode)d;
if (!dd.conduction) {
totalR = Double.POSITIVE_INFINITY;
break;
}
else {
totalR += 0.0;
}
}
else {
totalR += d.resistance;
}
}
// 计算电流
double diff = getPinVoltage(0) - getPinVoltage(1);
if (totalR == 0) {
current = (diff != 0) ? Double.POSITIVE_INFINITY : 0;
}
else if (Double.isInfinite(totalR)) {
current = 0;
}
else {
current = diff / totalR;
}
checkOverCurrent();
// 递归更新内部设备状态
for (Device d : deviceList) {
d.updateState();
}
}
}
改进建议
第七次作业改进建议
1.改进 Electric 基类
当前的 Electric 类包含了一些可能不适用于所有子类的字段和方法。建议将其抽象化,或将某些方法设为抽象方法,以强制子类实现特定功能。
2.使用枚举(Enums)替代字符串
使用枚举类型定义设备类型和状态,减少拼写错误的风险,并提升代码的类型安全性。
3.增强工厂模式
优化工厂方法,以更优雅地处理无效的设备类型,并考虑使用反射提高可扩展性。
public abstract class
第八次作业改进建议
1.引入接口与抽象层次
接口化设备行为:为不同类型的设备定义接口,如Switchable(可切换的)、Regulatable(可调节的)、Controllable(可控制的)等。这样可以更灵活地组合设备行为,减少类之间的耦合。
抽象电路连接方式:除了SeriesCircuit和ParallelCircuit,可以考虑引入更通用的电路连接方式接口,如Connectable,以便未来扩展更多类型的电路连接。
减少继承层次,增加组合
通过组合而非继承来实现设备的多功能性。例如,一个设备既可以是开关又可以是调速器,可以通过组合相应的功能组件来实现,而不是通过多重继承。
2.增强电路求解算法
引入高级电路求解方法
基尔霍夫定律:实现基尔霍夫电压定律(KVL)和电流定律(KCL),以更准确地计算复杂电路中的电压和电流分布。
节点电压法或网孔电流法:这些方法可以有效地处理多节点和多支路的复杂电路,提升求解的准确性和效率。
迭代求解与收敛检测
对于包含非线性元件(如二极管、互斥开关)的电路,采用迭代方法逐步逼近稳定状态,并设置收敛条件避免无限循环。
3.优化性能与资源管理
优化数据结构
使用更高效的数据结构管理设备和电路,如HashMap用于快速查找设备,ArrayList用于顺序访问等。
对于频繁访问的设备,可以考虑使用缓存机制,减少查找时间。
并行计算
对于独立的并联电路分支,可以考虑采用多线程或并行计算来加速电路状态的更新,提升大规模电路求解的性能。
内存管理
确保设备和电路对象在不再使用时及时释放,避免内存泄漏。可以通过使用WeakReference或显式地清理不再需要的对象来管理内存。
总结
对于这三次题目集,可以说给我留下了深刻的印象,几乎没有可以轻松度过的一次,每一次都是极大的挑战,在对java还是一知半解的情况下做着从来没做过的难题时常想起以前学C语言的轻松(没做这么难的题目),从最开始的对信息输入读取和输出,到引入各种模式,智能家居中电路设计。在这几次大作业中,我也认识到良好的设计规划、清晰的抽象层次以及全面的测试验证在软件开发中的重要性。面向对象的设计方法极大地提升了代码的可维护性和扩展性,而细致的错误检测与处理机制则保障了程序的稳定性和可靠性。三次题目集是是对两类现实情况的处理(改卷评分和电路带电器设计),然我明白如何将学到的java知识结合实际问题进行处理。如果要我提什么建议的话,我希望在课堂上老师可以在本次的大作业结束后,对题目进行一个讲解。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~