嵌入式代码优化技巧_第1页
嵌入式代码优化技巧_第2页
嵌入式代码优化技巧_第3页
嵌入式代码优化技巧_第4页
嵌入式代码优化技巧_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页嵌入式代码优化技巧来源:捡田螺的小男孩

最近工作中,我通过层层优化重复代码,最后抽出个通用模板.因此跟大家分享一下优化以及思考的过程。我会先造一个相似的例子,然后一步步带大家如何优化哈,看完一定会有帮助的。

优化前的例子

第一步优化:抽取公用方法

第二步优化:反射对比字段

第三步优化:泛型+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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论