写接口的时候,经常需要验证参数的数据类型、参数的值。还有一些选填 /必选之类的判断.
如果是用普通的 if esle 去判断的话,导致代码不优雅,后期迭代困难. 在知乎上看的 “如何优雅地解决项目中可能存在的很多的 if/else ” 也不太理解设计模式, 大家平常是用什么方式可以解决呢或者是大家有什么建议应该看哪些书、方法之类的? 求指点迷津,谢谢
写接口的时候,经常需要验证参数的数据类型、参数的值。还有一些选填 /必选之类的判断.
如果是用普通的 if esle 去判断的话,导致代码不优雅,后期迭代困难. 在知乎上看的 “如何优雅地解决项目中可能存在的很多的 if/else ” 也不太理解设计模式, 大家平常是用什么方式可以解决呢或者是大家有什么建议应该看哪些书、方法之类的? 求指点迷津,谢谢
|
1
使用的是 php 语言....目前用的是 tp5 框架
|
|
torbrowserbridgeMar 19, 2018 via Android
2
你需要的是 validation 组件
|
|
powergxMar 19, 2018 via iPhone
3
重构 重要的是程序的结构 /流程,这种 if else 可有可无,在项目中无伤大雅
|
|
4
$error = 'success';
do{ if(!$user){ $error = 'need login'; break; } if(!$a){ $error = 'a not set' ; break; } $uid = $user->id; }while(false) |
|
graysheeepMar 19, 2018
5
validation
|
|
torbrowserbridgeMar 19, 2018
6
@LevineChen 这啥玩意,简直看不懂。你是来黑 php 的?
|
|
paramMar 19, 2018
7
assert?
|
|
irenicusMar 19, 2018 via Android
8
复杂的 if else 可以重构为 dispatch table,相当于把逻辑抽象成数据另外保存,原本的逻辑本身就变成了遍历这个数据
|
|
nickel123666Mar 19, 2018
9
5 楼+1,有个叫做 validation 的东西,可以参考一下。
|
|
daydaydayupMar 19, 2018
10
我不知道是不是因为我的水平低的问题.用其他组件经常被别人鄙视.你们有没有这样的情况?
|
|
xzpjerry731Mar 19, 2018
11
有些 if else 的作用可以用哈希表代替。
|
|
zenxdsMar 19, 2018
12
策略模式了解一下
|
|
songzMar 19, 2018
13
switch case
|
|
yangfch3Mar 19, 2018
14
策略模式了解一下
|
|
wwdyyMar 19, 2018
16
看一遍
JavaScript 设计模式与开发实践 看一遍自己的代码 改 然后----- 看一遍 JavaScript 设计模式与开发实践 看一遍自己的代码 改 |
|
laobaoziMar 19, 2018
18
尽早返回
|
|
suikatorMar 19, 2018 via Android
19
@torbrowserbridge #6 do{...}while(false) 简化嵌套 if
|
|
20
@xzpjerry731 方便给个 demo 吗?我不太理解
|
|
zjpMar 19, 2018 via Android
21
不能避免多层 if 的话,及早处理错误情况然后返回
https://coolshell.cn/articles/17757.html |
|
yangfch3Mar 19, 2018
22
@MaZiT
@xzpjerry731 的意思应该就是使用策略模式,因为策略模式就是用一个哈希表来存储不同的策略,然后策略管理器根据不同的策略 key 来调用不同的策略属性。 下面是一个简单的策略模式用例: ``` function logicCall(type, ...args) { // 其他逻辑 registeredTypeHandler[type] && registeredTypeHandler[type](...args); // 这部分还可以新增一个策略控制器进行管理 } // 策略哈希表 var registeredTypeHandler = { foo: _foo, bar: _bar }; function _foo(...args) { ... } function _bar(..args) { ... } ``` |
|
lurenwMar 19, 2018
23
状态机了解一下
|
|
Todd_LeoMar 19, 2018
24
Pattern Matching 了解一下:
``` x match { case 1 => "one" case 2 => "two" case _ => "many" // case _ will trigger if all other cases fail. } ``` |
|
ahmcscxMar 19, 2018
25
|
|
daisyxdxMar 19, 2018
26
弱弱地提一下 职责链模式。。。不知道有没有啥问题
|
|
27
@torbrowserbridge 老铁我只能说你理解能力比较差.
|
|
CFMYMar 19, 2018
28
策略模式不能避免 if else,如果你真的需要很多判断,无论用什么模式都无法避免这些判断
只是说策略模式更符合开放封闭原则,但是代价是你需要更多地代码去写接口以及更多类 与其套用模式,不如重新审视你的流程是否可以分解,从而让代码更清晰 |
|
BuildingMar 19, 2018 via iPhone
29
只是为了看起来更优雅给自己找麻烦完全没必要,把一堆判断分散到各个角落,一段时间看回来肯定会骂自己傻逼。老老实实写就好。
|
|
crysislinuxMar 19, 2018
30
逻辑上相关的 if else 我现在倾向于拆分成多个 function,逻辑不相关的参数类型检查,就用类似 table 的东西。以前就爱搞些多态。。结果多写了 n 多代码。
没必要还是不要搞复杂了。 |
|
gnaggnoyilMar 19, 2018
31
LZ 我告诉你一个笨但是有用的办法:画真值表硬怼 :)
|
|
realityoneMar 19, 2018 via iPhone
32
不要写 else
|
|
qiyonMar 19, 2018
33
参数校验可以看下
Yii 的 Form Model Laravel 的 Validation 之类的实现 可以实现参数的默认值、过滤、以及校验 |
|
qiyonMar 19, 2018
34
还有 symfony 的 entity,TP 也有 Model 的 validate
|
|
nicevarMar 19, 2018
35
公司代码服务器配个 SonarQube, 这种 if else 多几层就过不去,一段时间就治好了你的症状
|
|
torbrowserbridgeMar 19, 2018 via Android
36
@LevineChen 老铁我说的是,你代码有问题。set 判断都是错的
|
|
windygooseMar 19, 2018
37
四楼的写法一般常见在 C 中,关注点是 do while 和 break 的使用
|
|
TaoSamaMar 19, 2018 via Android
38
这种东西有两种解决方案
一个是尽量用函数式的方法 另一个就是把脏东西藏起来 用可靠的 validation 的库 或者自己写相关的库 把 if..else 藏起来 |
|
koalliMar 19, 2018
39
@windygoose 我也觉得是 C/C++转 php 的老司机,这个写法很常见,包括一些宏为了避免展开出问题也会用这样的写法
|
|
AwayEMMar 19, 2018
40
form validator 很多的把 vue react 自带的好多啊, 后台框架的 form 类也有好多抽离验证的,我用的 spring flask django 以及前端的 vue 都有。
|
|
newmlpMar 19, 2018
41
if 不就是判断用的么,有什么不优雅的,不要为了设计而设计,而且如果判断数量不多的话,改用其他会带来性能问题,虽然不多
|
|
r7stMar 19, 2018
42
@torbrowserbridge do while 这不是??
|
|
zjsxwcMar 19, 2018
43
责任链模式吧,专门用来避免超多 if-else 的情况
|
|
cljnnnMar 19, 2018 via Android
44
《代码大全》里面对多层 if else 的建议是,if 里面总是处理预期情况,else 处理其他情况。 看起来不太优雅,但是逻辑很清楚(这一句我说的)。
|
|
45
不要一开始就通过设计去避免 if-else,等将来分支确实多起来了再考虑也不迟。
|