我感觉这样代码看着有莫名的对称美感。虽然多打点字,但是看代码时逻辑更容易理解。
只有我这样觉得吗?
1
xmbaozi 2015-09-30 19:56:04 +08:00
file.exists() == true
怎么觉得这样更符合逻辑 |
2
lsmgeb89 2015-09-30 19:56:15 +08:00 2
if (file.exists())
if (!file.exists()) |
3
blacktulip 2015-09-30 19:57:53 +08:00
英语而论 if file exists 显然更流畅
|
4
render 2015-09-30 19:58:16 +08:00
这样写多此一举,没意义。
|
5
vietor 2015-09-30 19:58:37 +08:00 via Android
把缺点美化成优点。之前国内有些人写的编程类的书中推荐的方法、风格很多都是坑人的。
|
6
lsmgeb89 2015-09-30 19:59:16 +08:00
@xmbaozi 是防止少写一个等号,造成 bug 。所以写在左边,这样如果少写了,就会编译错误。它还有个名字叫 Yoda 表示法,见:
http://www.yinwang.org/blog-cn/2013/04/14/yoda-notation/ |
7
aprikyblue 2015-09-30 20:00:17 +08:00
多此一举,而且实在看不出 哪里逻辑更容易理解。。。
还是习惯这样 > if ( file.exists() ) |
8
jydeng 2015-09-30 20:01:05 +08:00
true 和 false 从来不写,都是 if(条件) 、 if(!条件)。
|
9
zenjayjay 2015-09-30 20:01:29 +08:00
true 写在前面是好的,不过语义化应该是“如果存在”,那个 true 就没必要写了吧。
|
10
echo1937 2015-09-30 20:03:30 +08:00
其实是你习惯了而已,就好比 “朱逸之” 这样的名字。
|
11
YuJianrong 2015-09-30 20:07:39 +08:00
Yoda 表示法现在来看毫无意义,阅读起来明显 变量 == 常亮 更符合人类阅读习惯。至于写错的问题,现代软件开发的编译器或者语法检查器早就能解决这种无聊的问题了……
|
12
wdlth 2015-09-30 20:09:12 +08:00
以前总有人说 value == false 应该写成 false == value ,这样就算写成了一个=, value 不会被赋值。
不过很多 IDE 是不允许在判断时写一个=的,还有 Java 、 Python 等语言可以用 equals 、 is 等方法判断,看来还是要与时俱进。 |
13
88250 2015-09-30 20:11:33 +08:00 via Android
看你们讨论,我又写了几行。😊
|
14
suduo1987 2015-09-30 20:12:14 +08:00 via iPhone
null==?, true 不写
|
15
Quaintjade 2015-09-30 20:13:51 +08:00
我觉得 Yoda conditions 中文可以翻译成智叟表示法(甚矣,汝之不惠)。。。
|
17
zjqzxc 2015-09-30 20:40:24 +08:00
if(file.exists()) ...;
else ...; 如果文件存在执行...;否则的话执行... 多自然语言~~一边说中文一边写。 |
18
matthewgao 2015-09-30 20:58:20 +08:00
这个逻辑还没复杂到需要这样写,这么简单的直接写就好
|
19
crazystory 2015-09-30 21:03:06 +08:00 2
看到有人说 if 写一个等号会有 IDE 提示错误的我也是醉了。在支持多种语言的 IDE 下,是否提示错误是根据语言来的。比如 if ($a = 1)这种语法在 php 中属于合法的,IDE 并不会提示错误, IDE 会提示错误,但在 golang 中这样写是会直接报错的。所以结论就是 yoda 并不是一竿子打死的的无意义,在某些语言里还是有重大意义的
|
20
crazystory 2015-09-30 21:03:43 +08:00
建议多去了解一下其他语言的规范再来说某种写法是否有意义
|
21
hunterzhang86 2015-09-30 21:12:02 +08:00
@YuJianrong 正解
|
22
dorentus 2015-09-30 21:14:39 +08:00 via iPad
@crazystory PHP 的 IDE 太多了我不知道, Objective-C 也一样,赋值表达式是有值的,并且大部分类型的值可以隐式转化为布尔值,于是你那种写法也是合法的语句,但是正常配置的 Xcode 还是会给一个警告。
我写这么多只是想说,和语言规范无关,编译器或者 IDE 只要想做到,就完全可以给用户可能出错的代码以警告。 |
23
xcv58 2015-09-30 21:15:58 +08:00 via iPhone
反正编译器会给你优化掉
|
24
lincanbin 2015-09-30 21:18:22 +08:00
反正我在 PHP 中习惯这么写,并且还是用强类型比较符===,很多函数都是返回 mixed 。
只要有值,不一定是 bool true ,都能使 if 成立。 |
26
zmj1316 2015-09-30 21:44:32 +08:00
@lsmgeb89 这应该是在没有 Bool 类型的时候或者比较常量的时候才使用,如果语言支持 bool 类型那就是多此一举
|
27
ryd994 2015-09-30 22:04:19 +08:00
gcc warning 妥妥的
|
28
fengxiang 2015-09-30 22:05:51 +08:00 via Android
true,false =false,true
|
29
zhujinliang 2015-09-30 22:44:03 +08:00
if (脱裤子 == 放屁())
刚才脑中突然出现这句话,然后自己被自己逗笑了。。。 话说印象中以前 Basic 要写 if Something = false then ... 而不是 if !Something then ,具体怎么回事记不清了,或许是某些 Basic 解释器只认 if ... = ... then 的形式,也可能是我记错了 |
30
huanglexus 2015-09-30 23:10:39 +08:00 1
你这就和 if (true) return true else return false 差不多...
|
31
RemRain 2015-09-30 23:23:00 +08:00 1
不是应该写成 if (false != file.exists()) 吗?
另外推荐这么写: if (false xor file.exists()),除了有莫名的对称美感外,还有莫名的专业感~ |
32
blue7wings 2015-09-30 23:26:18 +08:00
这个是很久以前的方式了,《编写可执行代码》一书中,还专门说了这个问题,现在已经不提倡这么些了,影响代码的阅读,虽然自己看着舒服,如果别人看的话就莫名的难受了。
|
33
mimzy 2015-09-30 23:38:28 +08:00
《编写可读代码的艺术》里提到了这个问题:
「比较的左侧:“被问询的”表达式,它的值更倾向于不断变化。比较的右侧:用来做比较的表达式,它的值更倾向于常量。」 「这条指导原则和英语的用法一致。我们会很自然地说:“如果你的年收入至少是 10 万美元”或者“如果你不小于 18 岁。”而“如果 18 岁小于或等于你的年龄”这样的说法却很少见。」 「遗憾的是,这种顺序的改变使得代码读起来很不自然(就像电影《星球大战》里的尤达大师的语气:“除非对此有话可说之于我”)。庆幸的是,现代编译器对 if (obj = NULL) 这样的代码会给出警告,因此“尤达表示法”是已经过时的事情了。」 |
34
mornlight 2015-10-01 00:30:08 +08:00
我们的编码规范里直接禁止写 == YES 这种
|
35
vikeria 2015-10-01 08:09:31 +08:00 via Android
看着不觉得蛋疼吗?
|
36
gamexg 2015-10-01 09:17:34 +08:00
python 表示少一个=号直接报错。
|
37
tushiner 2015-10-01 11:28:11 +08:00
判断布尔类型值不用这样,判断数据值和类型是否相等用 equal ,直接用"=="在面向对象语言中的应用越少越好
|
38
oska874 2015-10-01 12:21:28 +08:00
题主 C 出身吧。
|
41
ekousp 2015-10-01 13:19:52 +08:00
这样写 code review 不会通过的哟。
|
44
chmlai 2015-10-01 15:29:27 +08:00
这种写法没任何好处.
搞不好还会出来 N 多变种: ``` if (true == file.exists()) if (true != file.exists()) if (false == file.exists()) if (false != file.exists()) ``` |
45
hualuogeng 2015-10-01 16:43:02 +08:00
我只有在==的情况下才把常量写在左侧。
|
46
noli 2015-10-01 17:35:00 +08:00
这种情况 ( == 右边是中间变量的情况下)即使反过来写并且少打了一个等于号,绝大多数语言的编译器都是会 complain 的吧? 所以这么写完全没有意义。
|
49
abscon 2015-10-01 23:03:12 +08:00 via iPhone
如果真的是存在文件
-------- 楼主你平时这样说话? |
50
crazystory 2015-10-01 23:13:38 +08:00
@dorentus 合法的语法为何要警告。这不是多此一举。 就是需要这样写呢。
|
51
thxmem 2015-10-01 23:15:34 +08:00
记得有书推荐这种写法,不过看起来很别扭。
|
52
anjouslava 2015-10-02 00:16:20 +08:00
@crazystory 合法的语法也会警告,因为在条件判断的地方写赋值语句是明显的无意义错误,高级 IDE 设计的时候就考虑到了
|
53
legendlee 2015-10-02 01:45:56 +08:00 via Android
我的习惯是:
bool 类型和指针的判断不用==号,直接 if ( file.valid())和 if(ptr)。 其他类型的使用常量==变量的形式。 |
54
gladuo 2015-10-02 01:56:01 +08:00
这个逼装的已经不流行了
|
55
orzfly 2015-10-02 10:48:13 +08:00 via Android
@crazystory 我见过的一些 IDE / 编译器是你再套一层括号,比如 if ((result = someMagic())) 他就不给你警告了……
|
56
limuxy 2015-10-02 13:17:38 +08:00 via Android
到底对称在哪里……
|
57
nozama 2015-10-02 18:34:02 +08:00 via Android
我发现很多人自己根本不思考,书上说这样,就必须这样... 还有一种奇葩习惯是,任何指针使用前都加一句 if(ptr)…, 但是又忽略 else 的情况,结果虽然临时避免了 bug ,却隐藏了更多 bug
|
58
CRVV 2015-10-02 23:22:53 +08:00
@crazystory
建议自己把代码写出来用编译器编译一下再来说事 “合法的语法为何要警告”... 你是只写过 Go 么 警告就是在合法的语句里找不合适的地方 C 语言用 ‘ gcc -Wall ’ 编译,会对 if(a=1)给 Warning |
59
adonishong 2015-10-03 11:54:40 +08:00
楼主自己没发现这个写法最大的好处?这个写法最大的好处是如果把 if (true == file.exists()){} 错写成 if (true = file.exists()){}的时候,编译器会报错,编译直接过不去;如果是 if (file.exists() == true){}少写一个等号,编译器不会出错,跑起来会有不定期的错误,并且不太好查。。。
|
60
adonishong 2015-10-03 11:56:56 +08:00
|
61
yuchting 2015-10-03 16:38:30 +08:00
这样的代码感觉有点蛋疼,之前遇到过老程序员看不管?:的语法,非得 if else
|
62
hjkl0001 2015-10-03 16:53:56 +08:00
这样看着感觉不习惯,一直 if(file()) or if(!file())
|
63
secondwtq 2015-10-03 23:05:33 +08:00 1
我认为语言本身设计存在的某些问题和缺陷,锅应该让编译器和工具链来背,而不应该让你和阅读你代码的人来背。
|
64
Geoion 2015-10-04 00:06:42 +08:00
传说中的布林表达式?
|
65
jedihy 2015-10-04 14:03:52 +08:00
写 C 都是这样写的,怕写成等于。原来项目中出过这样的错之后,就都这样写了。
其实很大经典的库内部的代码风格也是这样( C )。 |
66
dqh3000 2015-10-04 17:43:12 +08:00
我倒是有以后会想写
if (exists() == true) 我当然知道 true==exists()是避免把==写成=,但是正如楼上所说,这样毕竟和自然语言理解差别太大 然而我有时候觉得觉得如果写 if(exists())这样,不仔细看的话,可能会跟 if(!exists())弄混,更何况还可能有 if(notExists())和 if(!notExists())或者类似的东西 |