假设存在多个判断条件,以下以修改用户信息为例,哪种代码结构会更清晰而且性能会好一点? 以下 python 伪代码:
一:
if 用户存在:
if 密码符合规范:
if 手机号符合规范:
if 邮箱符合规范:
do 修改用户信息
else:
return 邮箱不符合规范
else:
return 手机号不符合规范
else:
return 密码不符合规范
else:
return 用户不存在
二:
if 用户不存在:
return 用户不存在
if 密码不符合规范:
return 密码不符合规范
if 手机号不符合规范:
return 手机号不符合规范
if 邮箱不符合规范:
return 邮箱不符合规范
do 修改用户信息
1
xiao109 2022-01-04 16:36:09 +08:00
那肯定是第二种啊,起码不用数空格
|
2
WoWTxT 2022-01-04 16:37:21 +08:00
性能不用考虑,清晰肯定第二种
|
3
Vinceeeent 2022-01-04 16:37:28 +08:00 via Android
第一种看着都累啊
|
4
wangtian2020 2022-01-04 16:38:52 +08:00 1
第二种
从代码的“面相”来看,第一种长的像“回调地狱”,第二种就长得像 async 方法了( JavaScript ) |
5
xingshu1990 2022-01-04 16:45:46 +08:00
原先在 Python 高级编程里看到过第二种 这种优化:
Python 下,第二种属于短路原则。 Python 里的“短路原则”:在条件语句中,如果存在多个条件需要判断时,位置靠前的条件导致整个判断语句为 True ( or 语句)或者为 False ( and 语句),就不再进行后续条件的判断。 |
6
looyer 2022-01-04 16:50:03 +08:00
第二种 另外表单输入判断前置 涉及到数据库查询结果的判断后置 只有表单数据都确认规范了 再去请求数据库做进一步判断
|
7
Jooooooooo 2022-01-04 16:50:28 +08:00
第二种清晰.
|
8
66beta 2022-01-04 16:51:25 +08:00
第二种是几乎适合所有语言的短路原则
|
9
shyrock 2022-01-04 16:54:36 +08:00
必须是二啊。
第一种我是没想出来哪种场景有用。 |
10
xingshu1990 2022-01-04 16:57:55 +08:00
@shyrock 第一种是无任何编程基础的新人学着写的。
|
11
FutherAll 2022-01-04 16:59:57 +08:00
提前返回
|
12
ayase252 2022-01-04 17:00:13 +08:00
无疑是第二种,early return
第一种可读性太差 |
13
Droi 2022-01-04 17:03:29 +08:00
可以试试设计模式了。不知道职责链模式能不能解决你的这个问题。
|
14
adoal 2022-01-04 17:06:30 +08:00
Monad 了解一下
|
15
EchoDeveloper 2022-01-04 17:12:14 +08:00
第二种就是卫语句,显然更好. 把不该出现的情况提前返回.
|
16
ianEros 2022-01-04 17:17:50 +08:00
Fail-fast
|
17
qiaobeier 2022-01-04 17:19:49 +08:00
肯定第二种啊,连你这种伪代码第二种也是漂亮太多了。
|
18
ccraohng 2022-01-04 17:43:44 +08:00
if 密码不符合规范:
return 密码不符合规范 if 手机号不符合规范: return 手机号不符合规范 if 邮箱不符合规范: return 邮箱不符合规范 都是校验,先走规则校验 |
20
PiersSoCool 2022-01-04 17:56:56 +08:00
肯定第二种
|
21
night98 2022-01-04 18:38:45 +08:00
python 没有类似 hibernate valid 的库么,这种基础校验手写太麻烦了把
|
22
daimubai 2022-01-04 19:12:55 +08:00
肯定第二,能 return 就 return ,return 意味着 return 掉的代码不需要去管了可以降低“思维逻辑负担”,尽管逻辑不复杂
|
23
veike 2022-01-04 19:20:16 +08:00 via Android
第二种,可以查一下"卫语句",就是为了降低 if 嵌套的程序复杂性
|
25
teem 2022-01-04 19:42:17 +08:00
2 防御式编程
|
26
chnhyg 2022-01-04 19:57:49 +08:00
以卫语句取代嵌套条件表达式的精髓就是:给某一条分支以特别的重视。如果使用 if-then-else 结构,你对 if 分支和 else 分支的重视是同等的。这样的代码结构传递给阅读者的消息就是:各个分支有同样的重要性。卫语句就不同了,它告诉阅读者:“这种情况不是本函数的核心逻辑所关心的,如果它真发生了,请做一些必要的整理工作,然后退出。”——《重构》
|
27
xiubin 2022-01-04 20:13:30 +08:00
个人可能会这么写,减少 return case ,做统一收口,后面方便加逻辑,比如 log 或者异常监控:
let result = 0; if 用户不存在: result = 用户不存在 if 密码不符合规范: result = 密码不符合规范 if 手机号不符合规范: result = 手机号不符合规范 if 邮箱不符合规范: result = 邮箱不符合规范 log('check result: {result}') return result; |
28
llsquaer 2022-01-04 22:33:40 +08:00
if 用户存在 or 密码符合规范 or 手机号符合规范 or 邮箱符合规范:
return '你输入的数据中有一些地方是错的.自己检查' |
30
bigxianyu 2022-01-04 22:52:21 +08:00
这两者之间的性能差距几乎可以忽略( 不是主要矛盾 ) ,第二种的可读性好多了,所以肯定选第二个
|
31
zwgf 2022-01-04 23:00:38 +08:00
性能当然是第一种,但是这点性能,没必要
还是第二种看着舒服 |
32
msg7086 2022-01-04 23:04:13 +08:00 via Android
@dengji85 如果库已经有现成的功能的话还是用起来方便。
比如 Rails 里,写 validation 规则比手写代码方便多了。 https://guides.rubyonrails.org/active_record_validations.html |
33
inframe 2022-01-04 23:26:07 +08:00
Django DRF 框架里用 validator 可以对每个字段设置规则进行校验,就不用单独写逻辑
|
35
yolee599 2022-01-05 09:29:31 +08:00
用第二种,有错误及时返回,不要再做其他判断了,做了也没用
|
36
meiyoumingzi6 2022-01-05 09:34:42 +08:00 via iPhone
写第一种怕不是要被同事打死
|
37
bfdh 2022-01-05 10:33:20 +08:00 1
说个题外话,想起以前去一些单位办事,工作人员的答复
第一次去:身份证没带,办不了 第二次去:户口本没带,办不了 第三次去:证件照没带,办不了 |
40
sadfQED2 2022-01-05 15:31:59 +08:00
@xiubin #27
let result = ""; if 用户不存在: result += 用户不存在\n if 密码不符合规范: result += 密码不符合规范\n if 手机号不符合规范: result += 手机号不符合规范\n if 邮箱不符合规范: result += 邮箱不符合规范\n log('check result: {result}') return result; 我一般都是这样写,不然多种条件部分和,日志打印不全,排除问题的时候日志反而误导人 |
41
ariera 2022-01-05 16:47:47 +08:00
性能不用考虑,清晰肯定第二种
|
42
akira 2022-01-05 17:19:17 +08:00
性能应该也是 第二种
|
44
generated 2022-01-07 18:58:56 +08:00
@night98 当然是有的噻,多的很, 比如 https://pydantic-docs.helpmanual.io/
|