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