博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java笔记—重构-完全不用 if-else 可能吗?
阅读量:6910 次
发布时间:2019-06-27

本文共 1381 字,大约阅读时间需要 4 分钟。

上次那篇重构-

笔者曾就职于华为,三星,腾讯,将发布一系列java技术文档,欢迎大家关注我哦

本文的目的是重构,是研究其思想,而并不是说这个代码一定比if-else好,谢谢大家

说到代码中的 if-else会随着代码量的增加,在迭代的过程中变的越来越难以维护,

然后用工厂模式的思路可以把 if-else代码块给剥离开来,

不过有朋友提出了不足,

虽然表面上看没有 if-else了,但其实只是给挪到工厂里面去。

这不是换汤不换药嘛?

但其实想完全不用 if-else也是可能的,还是以上次那段代码为例子来说,

这是最终在调用端的代码

TargetExecutor executor = ExecutorFactory.getExecutor(target);executor.process();复制代码

这是工厂类的代码

开始重构

我们关注的重点是 getExecutor()这个方法,这里一堆 if-else,

可以看到这里面的逻辑是根据 target 字符串的不同内容实例化不同的 executor对象给调用者使用,

也就是说,这里是一种多对多的模式,对于这种模式我们可以考虑用一个 HashMap来保存键值对,

private static HashMap
mMappings = new HashMap<>();复制代码

而判断 target内容的逻辑也不需要放在工厂类里了,可以重构 TargetExecutor的代码,给它增加一个抽象方法,

public abstract String matchUri();复制代码

这个方法的作用就是返回需要跟它匹配的字符串,

比如 ExecutorWithTag,那么它返回的是 "RANGE",

如果是 ExecutorWithStash,那么它返回的是 "#".

我们把新增的代码列出来,

准备工作好,还记得我们实例化了一个 HashMap吗,以String和Executor作为键值对的,

现在我们需要另外一个方法来把 executor放到 HashMap里,

完全摘除 if-else

在准备工作做到这里后,我们就需要来把工厂中的 if-else摘除了,

我们把之前的条件判断改成了从一个 map 中遍历查找匹配的模式,虽然从逻辑上来说,遍历查找跟 if-else差不多,

但代码会变更简洁,也不会再看到一长串的 if-else嵌套了,

下面是摘完之后的工厂类的代码,

这只是一种代码中的小技巧,可以在重构代码的时候让整个代码逻辑清晰很多,

但是也有弊端,

因为需要通过 pattern 去查找匹配,就会有可能出现 pattern 类似或者重叠的情况,一不小心就会导致bug...

对于这种情况上面的重构方法就没那么好了,

所以我习惯的话会把 if-else 剥离到工厂中就结束,但如果涉及到多个模块的人之间的合作的话,

才会再拆分一层,让大家自己把自己的 executor 在静态方法块中注册到 mMapping里,

这样各个模块之前的耦合就能降的很低,大家也就只需要关注自己的功能就行。

如果您对这篇文章有什么意见或者错误需要改进的地方,欢迎与我讨论。

如果您觉得还不错的话,希望你们可以点个赞。
希望我的文章对你能有所帮助。
有什么意见、见解或疑惑,欢迎留言讨论。

转载地址:http://ulfcl.baihongyu.com/

你可能感兴趣的文章
CEF中JavaScript与C++交互
查看>>
unity3d绘画手册-------灯光之反射及各个参数解释
查看>>
深入理解程序的结构
查看>>
POJ1365 Prime Land【质因数分解】【素数】【水题】
查看>>
Java实现文件复制
查看>>
Spark修炼之道(基础篇)——Linux大数据开发基础:第三节:用户和组
查看>>
Linux下Power Management开发总结
查看>>
安装服务器安全狗教程
查看>>
使用CodePush实时更新 React Native 和 Cordova 应用
查看>>
jstree -- 使用JSON 数据组装成树
查看>>
C++读取INI文件
查看>>
Win2003服务器安装Sql Server 2008 (转)
查看>>
2的倍数相加后如何还原
查看>>
W3C 、HTML 、CSS 发展介绍
查看>>
JS实现点击跳转登陆邮箱
查看>>
Alexandra and Prime Numbers(思维)
查看>>
jQuery hover 延时器实现代码
查看>>
ArcGIS JS 学习笔记3 实现百度风格的BubblePopup
查看>>
JavaScript之字符串引号的使用技巧
查看>>
linux如何关闭selinux?
查看>>