




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第第页嵌入式代码优化技巧来源:捡田螺的小男孩
最近工作中,我通过层层优化重复代码,最后抽出个通用模板.因此跟大家分享一下优化以及思考的过程。我会先造一个相似的例子,然后一步步带大家如何优化哈,看完一定会有帮助的。
优化前的例子
第一步优化:抽取公用方法
第二步优化:反射对比字段
第三步优化:泛型+lambda函数式
第四步优化:继承多态
第五步优化:模板方法成型
大功告成:策略模式+工厂模式+模板方法模式
1.优化前的例子
在这里,我先给大家(模拟)一个业务场景哈,并给出些简化版的代码
假设你有个对账需求:你要把文件服务器中,两个A、B不同端,上送的余额明细和转账明细,(下载)下来,对比每个字段是否一致.
明细和余额的对比类似,代码整体流程:
读取A、B端文件到内存的两个list
两个list通过某个唯一key转化为map
两个map字段逐个对比
我们先看明细对比哈,可以写出类似酱紫的代码:
//对比明细private
void
checkDet(ai)l(String
detailPathOfA,String
detailPathOfB
)throws
IOException{
//读取A端的文件
List
基于SpringBoot+MyBatisPlus+Vue
//读取B端明细的文件
List
resultList
=
compareObjects(dtoA,
dtoB);
for
(String
te(mpS)tr
:
resultList)
{
log.warn("{}
is
different,key:{}",
tempStr,
dtoA.getKey());
}
}
}
}}
6.模板方法
大家回头细看,可以发现不管是明细还是余额对比,两个方法很像,都是一个骨架流程来的:
读取A、B端文件到内存的两个list
两个list通过某个唯一key转化为map
两个map字段逐个对比
大家先回想一下模板方法模式:
定义了一个(算法)的骨架,将一些步骤延迟到子类中实现。这有助于避免在不同类中重复编写相似的代码。
顿时是不是就觉得这块代码还有优化空间~~
6.1定义对比模板的骨架
我们可以尝试这两块代码再合并,用模板方法优化它。我们先定义一个模板,然后模板内定义它们骨架的流程,如下:
6.2模板的方法逐步细化
因为readDataFromFile需要输出两个list,所以我们可以定义返回类型为Pair,代码如下:
又因为这个函数式的转化,是不同子类才能定下来的,我们就可以声明个抽象方法convertLineToDTD,让子类去实现。因此模板就变成这样啦:
同理,还有两个list转化为两个map再对比,我们可以声明为这样:
因此最终模板就是这样啦:
6.3不同对比子类
如果你是余额对比,那你声明一个CheckBalanceStrategyServ(ic)eImpl去继承抽象模板
如果你是明细对比,那你声明一个CheckDetailStrategyServiceImpl去继承抽象模板
这两个不同的子类,就像不同的策略,我们应该都能嗅到策略模式的味道啦~
7.工厂模式+模板方法+策略模式全家桶
有了明细对比、余额对比的模板,为了更方便调用,我们还可以定义一个校验策略接口,然后交给spring工厂类,这样更方便调用。其实日常开发中,这三种设计模式一般一起出现,非常实用:
我们先声明一个校验ICheckStrategy接口:
然后模板AbstractCheckTemplate实现ICheckStrategy接口:
接着,不同对比策略类CheckDetailStrategyServiceImpl和CheckDetailStrategyServiceImpl映射对应的对比校验类型:
/**
*
明细对比策略
*/@Servicepublic
class
CheckDetailStrategyServiceImpl
extends
AbstractCheckTemplate
{
@Override
protected
DetailDTO
convertLineToDTD(String
line)
{
return
DetailDTO.convert(line);
}
@Override
public
void
check(String
filePathA,
String
filePathB)
throws
IOException
{
checkTemplate(filePathA,
filePathB);
}
//对比校验类型为:明细
@Override
public
CheckEnum
getCheckEnum()
{
return
CheckEnum.DETAIL_CHECK;
}}/**
*
余额对比策略
*/@Servicepublic
class
CheckBalanceStrategyServiceImpl
extends
AbstractCheckTemplate
{
@Override
public
void
check(String
filePathA,
String
filePathB)
throws
IOException
{
checkTemplate(filePathA,
filePathB);
}
//对比校验类型为:余额
@Override
public
CheckEnum
getCheckEnum()
{
return
CheckEnum.BALANCE_CHECK;
}
@Override
protected
BalanceDTO
convertLineToDTD(String
line)
{
return
BalanceDTO.convert(line);
}}
最后一步,我们借助spring的生命周期,使用ApplicationContextAware接口,把对用的策略,初始化到map里
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 防盗报警合同范本
- 租学校合同范本
- 产品技术合同范本
- 中国工商银行委托贷款委托合同范本
- 弱电智能化系统合同范本
- 满诗深浅色惟歌生民病-《卖炭翁》教学设计
- 个人劳动合同格式
- 第6章 跨学科实践活动5 调查日常生活中金属废弃物的种类及回收利用教学设计-2024-2025学年九年级化学沪教版(全国)(2024)上册
- Unit 3 My School Section A 2a~2f 教学设计 2024-2025学年人教版(2024)七年级英语上册
- 第四单元让世界更美好(教学设计)-2023-2024学年道德与法治六年级下册统编版
- 全国大全身份证前六位、区号、邮编-编码
- 种植林业可行性研究报告
- 金和物业公司简介
- 广东省五年一贯制考试英语真题
- 2023年中央广播电视总台校园招聘笔试参考题库附带答案详解
- 项目部岗位廉洁风险情景教育案例
- 小学英语-What a dream教学设计学情分析教材分析课后反思
- 消防栓定期检查记录表
- 员工面试登记表通用模板
- 单位(个人或集体)约谈表
- 水质检测实验室仪器配置
评论
0/150
提交评论