假设存在多个判断条件,以下以修改用户信息为例,哪种代码结构会更清晰而且性能会好一点? 以下 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 ![]() 第二种 从代码的“面相”来看,第一种长的像“回调地狱”,第二种就长得像 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 ![]() 说个题外话,想起以前去一些单位办事,工作人员的答复 第一次去:身份证没带,办不了 第二次去:户口本没带,办不了 第三次去:证件照没带,办不了 |
![]() | 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/ |