一个简单低级的代码逻辑问题

2022-01-04 16:34:28 +08:00
 kayseen

假设存在多个判断条件,以下以修改用户信息为例,哪种代码结构会更清晰而且性能会好一点? 以下 python 伪代码:

一:

if 用户存在:
	if 密码符合规范:
		if 手机号符合规范:
			if 邮箱符合规范:
				do 修改用户信息
			else:
				return 邮箱不符合规范
		else:
			return 手机号不符合规范
	else:
		return 密码不符合规范
else:
	return 用户不存在

二:

if 用户不存在:
	return 用户不存在
if 密码不符合规范:
	return 密码不符合规范
if 手机号不符合规范:
	return 手机号不符合规范
if 邮箱不符合规范:
	return 邮箱不符合规范
do 修改用户信息
3827 次点击
所在节点    Python
44 条回复
night98
2022-01-04 18:38:45 +08:00
python 没有类似 hibernate valid 的库么,这种基础校验手写太麻烦了把
daimubai
2022-01-04 19:12:55 +08:00
肯定第二,能 return 就 return ,return 意味着 return 掉的代码不需要去管了可以降低“思维逻辑负担”,尽管逻辑不复杂
veike
2022-01-04 19:20:16 +08:00
第二种,可以查一下"卫语句",就是为了降低 if 嵌套的程序复杂性
Droi
2022-01-04 19:39:04 +08:00
@dengji85 各人项目不会去用,用了反而增加复杂度
teem
2022-01-04 19:42:17 +08:00
2 防御式编程
chnhyg
2022-01-04 19:57:49 +08:00
以卫语句取代嵌套条件表达式的精髓就是:给某一条分支以特别的重视。如果使用 if-then-else 结构,你对 if 分支和 else 分支的重视是同等的。这样的代码结构传递给阅读者的消息就是:各个分支有同样的重要性。卫语句就不同了,它告诉阅读者:“这种情况不是本函数的核心逻辑所关心的,如果它真发生了,请做一些必要的整理工作,然后退出。”——《重构》
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;
llsquaer
2022-01-04 22:33:40 +08:00
if 用户存在 or 密码符合规范 or 手机号符合规范 or 邮箱符合规范:
return '你输入的数据中有一些地方是错的.自己检查'
NowTime
2022-01-04 22:35:28 +08:00
@xiubin 那你这种的话,会不会符合多种条件,但只会返回最后一个提示
bigxianyu
2022-01-04 22:52:21 +08:00
这两者之间的性能差距几乎可以忽略( 不是主要矛盾 ) ,第二种的可读性好多了,所以肯定选第二个
zwgf
2022-01-04 23:00:38 +08:00
性能当然是第一种,但是这点性能,没必要
还是第二种看着舒服
msg7086
2022-01-04 23:04:13 +08:00
@dengji85 如果库已经有现成的功能的话还是用起来方便。
比如 Rails 里,写 validation 规则比手写代码方便多了。
https://guides.rubyonrails.org/active_record_validations.html
inframe
2022-01-04 23:26:07 +08:00
Django DRF 框架里用 validator 可以对每个字段设置规则进行校验,就不用单独写逻辑
pcbl
2022-01-04 23:49:48 +08:00
@xiubin 不直接 return 的话,应该用 elif 吧。这些条件是只要满足一个就退出判断的
yolee599
2022-01-05 09:29:31 +08:00
用第二种,有错误及时返回,不要再做其他判断了,做了也没用
meiyoumingzi6
2022-01-05 09:34:42 +08:00
写第一种怕不是要被同事打死
bfdh
2022-01-05 10:33:20 +08:00
说个题外话,想起以前去一些单位办事,工作人员的答复
第一次去:身份证没带,办不了
第二次去:户口本没带,办不了
第三次去:证件照没带,办不了
xiubin
2022-01-05 11:26:28 +08:00
@NowTime #29
@pcbl #34

enen 我是直接复制了,应该是 if - else if
sadfQED2
2022-01-05 15:30:19 +08:00
@xiubin #27
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;

我一般都是这样写,不然多种条件部分和,日志打印不全,排除问题的时候日志反而误导人

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

https://www.v2ex.com/t/826136

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

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

© 2021 V2EX