当前位置: 首页 > news >正文

Java_conclusion_2

前言:

1、正则表达式的运用
2、七大设计原则的代码体现和运用
3、设计模式的运用场景
4、类继承、多态、接口的运用

第一次作业分析

图片
(1)Dataprocessing的单方法平均语句84行,单个方法冗长,需通过拆分出子方法来优化冗余问题。
(2)ShowAgent中分支覆盖率高,由于在处理输入数据问题时采用过多的if-else语句,此时应该采用正则表达式来优化硬编码的问题。
(3)当前And/Not/Or/Xor/Xnor/CircuitElement/Pin方法注释少,需添加注释来提高代码的可读性

DataProcessing类中的getOutputPinElectrcalSignal方法

屏幕截图 2026-06-21 203548
从参数列表明显可以看出随着电子元件类型的增加,显然这个参数列表会更加冗长,这明显违背了里氏代换原则(LSP),应该讲所有元件常见列表时以抽象为参数,如以下方式:
屏幕截图 2026-06-21 204319 =800x800
在对比下明显可以看出参数列表并不会由于元件类型增加而增加
原因:以父类定义的List这个类型能代表所有的子类
优点:能明显的减少代码的冗余性
缺点:这个列表中存储的全部子类,具体一个不知道是哪一种元件
解决方案:通过给每一种子类添加type属性,通过instanceOf来确定具体元件种类,从而采取不同的方案

第二次作业分析

屏幕截图 2026-06-21 210411
(1)main方法冗余,应通过将业务代码迁移到Datadistributor、DataSelector、ShowAgent等业务类中
(2)Decoder的类职责超载,应通过按功能将类方法拆分到其他类中
(3)代码总体的注释含量较低,可通过添加注释来提高可读性

输入数据处理

(1)将输入数据分为三个层次处理,第一个为提取有效信息,第二层是对有效信息的信息解读,第三层则是对引脚之间建立联系;即分别对应InputDataProcessing,InputParse,Transfermation三个类
(2)这里采取正则表达式来提取有效信息,提高了数据处理的统一性
屏幕截图 2026-06-21 212703

输出

采取创建一个抽象父类,在多次迭代中不同的输出结构只需要不断继承这个showAgent类,从而提高代码的可维护性,可拓展性

第三次作业分析

屏幕截图 2026-06-21 213113
(1)Main类中代码行数有308行,超出合理行数
(2)Transformation单方法平均语句过长,通过拆解为更小的方法来优化

Connection类的创建

这里通过给每个电子元件添加type属性实现,在输入数据处理创建Connection对象,当信号传递时通过对Connection对象里的两个元件类型判断,从而采取不同的处理方法,优化了对信号传递时关系存储的问题
屏幕截图 2026-06-21 213852
屏幕截图 2026-06-21 213922

同时采用了组合模式

通过组合设计模式实现对电路嵌套电路的问题,同时可以看出组合设计模式的运用场景就是用来解决嵌套问题
屏幕截图 2026-06-21 214051
屏幕截图 2026-06-21 214106
屏幕截图 2026-06-21 214115
类图如下:
屏幕截图 2026-06-21 220309

踩坑心得:

一、对代码没满足里氏代换原则(LSP)导致代码冗余

例子即第一次作业分析中的代码例子

二、在创建一个类要思考它的需求变化性

以电子元件为例,在三次作业的迭代中有最初的And/Or/Not/Xor/Xnor的五个电子元件,到后来加了DataDistributor/Decoder/ThreeGate,这个例子充分说明当有一类相似的东西,就必须要创建抽象父类来维持代码的可拓展性。

第一次迭代

屏幕截图 2026-06-22 004605

第二次迭代

屏幕截图 2026-06-22 004748

三、对里氏代换原则的应用归纳(以AndGateElement为例)

(1)对于定义一个对象时,如果他又父类赋值左侧类型是父类,在实例化对象时赋值右侧再写具体的子类
Circuitment andGate = new AndGateElment();
(2)对于数组也遵循(1)的原则
List andGateList = new ArrayList<>();
问题:对于这个子类要加类型属性,不然只能知道他们的类型时父类,所以在子类加类型属性来方便对不同子类进行不同的操作。

四、正则表达式在字符串数据处理的重要性

对于不用正则表达式的字符串我要考虑的是在整个字符串找第几个位置的数据,即要在不确定性的字符串长度中找出有效数据位置和数据的特殊位置(例如:字符串的头和尾)来确定有效信息的位置,这很容易导致数组越界问题;但是正则表达式则帮助我们把关注点放到字符串和正则表达式规则的对应,然后就能找到有效数据,大大减少对字符串的处理难度;

五、lamda表达式在自定义类型数据处理的简便性(以第三次迭代的排序为例)

(1)最麻烦的方式:
<1>创建一个实现Comparator接口的类
<2>创建对象
<3>作为参数传到sort的参数中
代码:
public class ComparatorImplementation implements Comparator{
@Override
public int compare(Circuitment g1, Circuitment g2) {
int index_1 = order.indexOf(g1.getType());
int index_2 = order.indexOf(g2.getType());
if(index_1 != index_2) {
return index_1 - index_2;
}
return g1.getNumber() - g2.getNumber();
}
}
ComparatorImplementation c = new ComparatorImplementation();
//假设这个list就是自定义对象数组
Collections.sort(list, c);
(2)匿名类
Comparator c = new Comparator(){
@Override
public int compare(Circuitment g1, Circuitment g2) {
int index_1 = order.indexOf(g1.getType());
int index_2 = order.indexOf(g2.getType());
if(index_1 != index_2) {
return index_1 - index_2;
}
return g1.getNumber() - g2.getNumber();
}
}
Collections.sort(list, c);
(3)lamda表达式
Collections.sort(list,(g1,g2)->{
int index_1 = order.indexOf(g1.getType());
int index_2 = order.indexOf(g2.getType());
if(index_1 != index_2) {
return index_1 - index_2;
}
return g1.getNumber() - g2.getNumber();
}
});
从代码的演变能明显感觉到lamda表达式的简便性
同时也从当前能总结出:lamda表达式更偏向于用在实现Java已经写好的接口实现上

改进建议

一、对引脚的改进

在这几次迭代中,并没有将Pin抽象为父类,应将Pin抽象为父类,因为在后续迭代中,出现类控制引脚的新种类

二、数据初始化问题

对于构造方法不论是无参还是有参构造一定要实例化对象,就是普通数据类型(例如:int则赋值为0或者-1等,String则赋值为空字符串)以防止数据操作时出现空指针的问题。

整体总结

一、七大设计原则(补充第一次)
1、里氏代换原则:父类用子类替换不会报错
代码体现方面:创建对象以父类创建对象,以具体子类实例化对象
二、设计模式
组合模式
解决的问题:对于本身可能包含本身的问题
类图以第三次作业的类图为例
代码:
父类:
public abstract class Component {
// 添加子元件
public abstract void add(Component component);

// 移除子元件
public abstract void remove(Component component);

// 获取所有子元件
public abstract List getChildren();
}
子类:和父类既是继承也是组合关系
public class Subcircuit extends Component {
private List children = new ArrayList<>();

@Override
public void add(Component component) {
children.add(component);
}

@Override
public void remove(Component component) {
children.remove(component);
}

@Override
public List getChildren() {
return children;
}
}
子类:只继承父类
public abstract class CircuitElement extends Component {
protected String type;
protected int number;

public String getType() {
return type;
}

public int getNumber() {
return number;
}

@Override
public void add(Component component) {
}

@Override
public void remove(Component component) {
}

@Override
public List getChildren() {
return Collections.emptyList();
}
}

三、正则表达式

用正则表达式高效处理字符串

四、lamda表达式

用lamda表达式来实现接口能让代码十分简洁

需要进一步研究

当前对七大设计原则的依赖倒转原则还没找到具体实例,对其他设计模式的用途和解决的问题尚且还不懂,需进一步探索,对类设计的思考步骤还是不够周全有序,需进一步探索类设计的高效思路,方法。

http://www.gsyq.cn/news/1570342.html

相关文章:

  • 2026武汉除甲醛选择指南,不同预算怎么选最划算权威排行榜守护家庭健康呼吸 - 博客万
  • DPrivBench:大语言模型在差分隐私算法推理中的能力评估与挑战
  • 2026年广州怎么挑选律师避坑 广州挑选律师常见陷阱与避坑全指南10 - 3158GEO
  • ComfyUI Inpaint Nodes:智能图像修复的技术突破与实践应用
  • iOS 系统上测试抖音自动消息插件:静态分析、发送链路与风险边界
  • 劳力士中国售后服务体系研究报告(2026年6月) - 博客万
  • Ubuntu 18.04 apt安装Java:多版本共存与系统级环境配置
  • 机器学习如何预测并补偿大规模MIMO中的功放非线性失真
  • RISE算法:大模型训练数据影响力高效估算与溯源实践
  • Tan-HWG框架:用Wasserstein几何约束Hebbian学习实现稳健持续学习
  • SAGE框架:基于注意力引导的长文档问答上下文压缩技术解析
  • League-Toolkit:英雄联盟玩家的终极桌面助手,一键提升游戏体验
  • 基于TTCA的LLM智能路由:轻量级准确率预估与多目标决策实践
  • MoE模型专家池规模与成本敏感路由的平衡优化实践
  • React/Next.js 现代化 Web 应用开发:从架构选型到性能工程
  • 终极免费方案:轻松解密网易云音乐NCM格式,实现音乐跨平台播放自由
  • 火锅店用什么燃料便宜_成本对比与选型实操 - 3158GEO
  • PolarMAE:极坐标掩码自编码器在胎儿超声图像小样本学习中的应用
  • 视频大模型如何挑战裁判任务?RefereeBench评估揭示AI认知鸿沟
  • 随机投影降维技术:原理、对比与工程实践
  • DEDECMS CSRF漏洞实战:原理、复现与代码级防护方案
  • 厂房车间降温公司哪家专业!应该选择什么设备给厂房降温会更好? - 博客万
  • AI科技热点日报 | 2026年6月21日
  • 项目管理经典必读书籍推荐,建立完整项目思维必备
  • Vue组件钩子即事件:重构父子通信范式
  • 告别盲目跟风!新手尤克里里选购推荐,避坑干货全覆盖
  • SteamAutoCrack终极指南:如何快速实现Steam游戏免客户端启动的完整教程
  • 波兰语大模型Tokenizer优化:BPE算法与形态学挑战
  • ST-STORM:自监督视觉表示解耦框架的原理与实践
  • 2026年 抛光液/抛光粉/抛光膏/抛光布供应商:氧化铝、金刚石、硅溶胶与CMP抛光材料专业选择 - 品牌发掘