我一般用 2 的写法,但是今天用一个代码检查工具(oclint)提示 inverted logic 。 其他语言有没有官方的推荐写法
1 FlashEcho 2023-12-28 15:49:07 +08:00 我喜欢写成 1 ,但是有的 ide 会提示我改成 2 ,尤其是是 pycharm ,clion 好像没这么提示过 |
![]() | 2 churchill 2023-12-28 15:51:22 +08:00 ![]() THAT MAKE NO SENSE |
3 ltyj2003 2023-12-28 15:53:42 +08:00 via Android ![]() 我会把 flag 命名为 isXxx ,然后用第二种写法。 |
![]() | 4 MoYi123 2023-12-28 16:01:09 +08:00 ![]() 具体的代码是怎么样的? inverted logic 看起来像是让你把 if ( not flag) { A } else { B } 改成 if (flag) { B } else { A } |
5 xloger 2023-12-28 16:02:43 +08:00 ![]() 我用的 Kotlin ,第一种写法只有在 flag 为可空类型的时候用,这时候理解起来比较直观。 然后第二种写法,如果是 Kotlin 是可以 if(flag.not()) 的,虽然我觉得 !flag 写法也没啥问题的。有些代码检查我觉得是过度了,单个判断用 ! 我觉得没问题,如果是 !flag && !flag2 这种我才觉得问题比较大。 |
6 Yuanlaoer 2023-12-28 16:08:35 +08:00 要说推荐写法的话,可以参考使用较广的语言和开源库的代码,以及公司的代码范式。比如谷歌家几乎各语言都有 |
7 bthulu 2023-12-28 16:09:08 +08:00 当然是第一种更简单直观了 |
![]() | 8 luzemin 2023-12-28 16:10:04 +08:00 当然是 2 |
![]() | 9 365473321 2023-12-28 16:12:16 +08:00 给 Bool 类型写个扩展: extension Bool { var isTrue: Bool { self == true } var isFalse: Bool { self == false } } |
10 thinkershare 2023-12-28 16:15:55 +08:00 我们公司的统一个规范是一律采用第二种,将第二种理解为不为真,不管什么情形,布尔类型都不与 true/false 比较相等性。 不过这个纯粹是个人喜好,团队里面约定一个就好了,保证代码风格审查都用统一的就行。 |
![]() | 11 via 2023-12-28 16:17:37 +08:00 |
13 ltyj2003 2023-12-28 16:31:32 +08:00 via Android ![]() @via 没太看明白哈,为啥要叫 isFalse ,我想是根据业务来起名,isPowerOn ,isEarthDestroyed 这子。 |
![]() | 14 marcong95 2023-12-28 16:53:14 +08:00 !flag 这种写法的感叹号太没存在感了,本来感叹号可能是在各种符号里是最窄的了。但是 flag == false 又感觉太长了,JS 的 linting 里还普遍推荐用===。窃以为还是 Python 的用 and/or/not 关键字代替符号更加合理 |
15 thinkershare 2023-12-28 16:58:52 +08:00 不过我们最近开始更换为 is true/ is false 这种新写法。 |
![]() | 16 lululau 2023-12-28 17:01:34 +08:00 讲个笑话,曾经有个同事极力反对使用 Java 8 Stream API ,说「 Stream API 比如 for 循环直观易懂」 |
![]() | 18 QUC062IzY3M1Y6dg 2023-12-28 17:25:43 +08:00 如果只有一个判断,我会选择 2 ,例如 if(!isMob){},如果多个判断我用 1 ,一层层往下更清晰 |
![]() | 19 linvaux 2023-12-28 18:05:06 +08:00 习惯用 1 ,第 2 种取反的脑袋还要转一下 |
![]() | 20 Building 2023-12-28 21:19:39 +08:00 第一种遇到 #define false true 的怎么办? |
![]() | 21 param 2023-12-29 01:03:21 +08:00 via Android 看情况。第二种情况,当 flag 为 null 的时候也生效 |
![]() | 22 leegradyllljjjj 2023-12-29 08:48:59 +08:00 via Android 又搁这儿研究茴香豆呢? |
23 layxy 2023-12-29 08:55:13 +08:00 这个得看哪种语言,js 类语言 2 比较好,对于布尔类型有默认值的语言 2 也可以,没默认值 2 可能就不行了 |
![]() | 24 zzl22100048 2023-12-29 09:23:53 +08:00 @V2Q 比如 -》不如 |
25 johnnyyeen 2023-12-29 09:52:07 +08:00 第一种语法描述的更加精确,exactly+specifically ,含义不容易产生歧义。 |
27 jifengg 2023-12-29 10:24:58 +08:00 var flag = false; if ( flag = false ){ console.log('=>false'); }else{ console.log('=>true'); } 首先猜猜上面打印的是啥? 阅读上是第一种比较直观。 但是编写的时候很容易出现上面这种 bug 。 而这种情况大部分语言都是支持的所以编译的时候都不会报错。 |
28 tsanie 2023-12-29 10:32:40 +08:00 @jifengg 虽然我也会用 2 ,但是一般情况下你说的这种情况编译器会报 warning ,例如 Assignment in conditional expression is always constant; did you mean to use == instead of = ? 当然不管 warning 那就没救了 |
![]() | 29 Xhack 2023-12-29 11:33:17 +08:00 if(Boolean.TRUE.equals(flag)){ // …… } |
![]() | 30 bocchi1amos 2023-12-29 11:35:05 +08:00 @ltyj2003 一样,常写 isEmpty ,isNumber ,isxxxx |
31 xuld 2023-12-29 12:45:54 +08:00 不管每个人是怎么想的,客观事实上: - 写成 flag == false 的好处是:更直观,更容易理解。 - 写成 !flag 的好处是:更短。此外如果写成 flag == false ,那为了保持对称,是不是也应该用 flag == true 所以结论很简单:分两类人: 第一类人理解 !flag 比较吃力,他们会认为 “flag == false 更好理解,推荐用法” 第二类人觉得理解 !flag 没那么吃力,他们追求更短,以及更利于记忆的对称性(而这些恰恰是第一类人所不能理解的)。 人的能力本来就是有区别的,强制用 !flag 会让第一类类人不爽(不好理解),强制用 flag == false 会让第二类人不爽(更麻烦了),因此不需要有推荐用法。 但如果实在需要确定一个团队里的统一写法的话,应该是优先照顾第二类人,因为第二类人才是团队的主力。 |
32 chutianyao 2023-12-29 13:51:01 +08:00 血泪教训,生产环境建议使用 1,养成好习惯. 某次技改,改动原有代码逻辑,需要将 flag==flase 的判断全部改成 flag==true,但是有些地方使用第二种写法,夹在一大堆代码中遗漏了,CR 也没看出来,造成生产事故. 一个!夹杂在大量代码中,确实非常容易遗漏. 所以后面我都改成 if(false == flag)这种写法 |