关于代码中的 if else 重构

2018-03-19 09:15:34 +08:00
 MaZiT

写接口的时候,经常需要验证参数的数据类型、参数的值。还有一些选填 /必选之类的判断.

如果是用普通的 if esle 去判断的话,导致代码不优雅,后期迭代困难. 在知乎上看的 “如何优雅地解决项目中可能存在的很多的 if/else ” 也不太理解设计模式, 大家平常是用什么方式可以解决呢或者是大家有什么建议应该看哪些书、方法之类的? 求指点迷津,谢谢

7111 次点击
所在节点    程序员
45 条回复
zjp
2018-03-19 09:52:56 +08:00
不能避免多层 if 的话,及早处理错误情况然后返回
https://coolshell.cn/articles/17757.html
yangfch3
2018-03-19 10:02:02 +08:00
@MaZiT
@xzpjerry731 的意思应该就是使用策略模式,因为策略模式就是用一个哈希表来存储不同的策略,然后策略管理器根据不同的策略 key 来调用不同的策略属性。

下面是一个简单的策略模式用例:
```
function logicCall(type, ...args) {
// 其他逻辑

registeredTypeHandler[type] && registeredTypeHandler[type](...args); // 这部分还可以新增一个策略控制器进行管理
}

// 策略哈希表
var registeredTypeHandler = {
foo: _foo,
bar: _bar
};

function _foo(...args) {
...
}

function _bar(..args) {
...
}
```
lurenw
2018-03-19 10:09:40 +08:00
状态机了解一下
Todd_Leo
2018-03-19 10:13:01 +08:00
Pattern Matching 了解一下:

```
x match {
case 1 => "one"
case 2 => "two"
case _ => "many" // case _ will trigger if all other cases fail.
}
```
ahmcscx
2018-03-19 10:24:41 +08:00
daisyxdx
2018-03-19 10:32:29 +08:00
弱弱地提一下 职责链模式。。。不知道有没有啥问题
LevineChen
2018-03-19 10:39:01 +08:00
@torbrowserbridge 老铁我只能说你理解能力比较差.
CFMY
2018-03-19 10:40:31 +08:00
策略模式不能避免 if else,如果你真的需要很多判断,无论用什么模式都无法避免这些判断
只是说策略模式更符合开放封闭原则,但是代价是你需要更多地代码去写接口以及更多类
与其套用模式,不如重新审视你的流程是否可以分解,从而让代码更清晰
Building
2018-03-19 10:57:58 +08:00
只是为了看起来更优雅给自己找麻烦完全没必要,把一堆判断分散到各个角落,一段时间看回来肯定会骂自己傻逼。老老实实写就好。
crysislinux
2018-03-19 11:03:18 +08:00
逻辑上相关的 if else 我现在倾向于拆分成多个 function,逻辑不相关的参数类型检查,就用类似 table 的东西。以前就爱搞些多态。。结果多写了 n 多代码。

没必要还是不要搞复杂了。
gnaggnoyil
2018-03-19 11:03:19 +08:00
LZ 我告诉你一个笨但是有用的办法:画真值表硬怼 :)
realityone
2018-03-19 11:06:57 +08:00
不要写 else
qiyon
2018-03-19 11:11:32 +08:00
参数校验可以看下
Yii 的 Form Model
Laravel 的 Validation
之类的实现

可以实现参数的默认值、过滤、以及校验
qiyon
2018-03-19 11:15:34 +08:00
还有 symfony 的 entity,TP 也有 Model 的 validate
nicevar
2018-03-19 11:27:15 +08:00
公司代码服务器配个 SonarQube, 这种 if else 多几层就过不去,一段时间就治好了你的症状
torbrowserbridge
2018-03-19 11:29:38 +08:00
@LevineChen 老铁我说的是,你代码有问题。set 判断都是错的
windygoose
2018-03-19 11:39:09 +08:00
四楼的写法一般常见在 C 中,关注点是 do while 和 break 的使用
TaoSama
2018-03-19 13:58:43 +08:00
这种东西有两种解决方案
一个是尽量用函数式的方法
另一个就是把脏东西藏起来 用可靠的 validation 的库 或者自己写相关的库 把 if..else 藏起来
koalli
2018-03-19 14:02:18 +08:00
@windygoose 我也觉得是 C/C++转 php 的老司机,这个写法很常见,包括一些宏为了避免展开出问题也会用这样的写法
AwayEM
2018-03-19 14:07:34 +08:00
form validator 很多的把 vue react 自带的好多啊, 后台框架的 form 类也有好多抽离验证的,我用的 spring flask django 以及前端的 vue 都有。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/439240

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX