1
mengzhuo 2015-03-20 09:58:22 +08:00 2
Readability counts.
|
2
b821025551b 2015-03-20 10:01:15 +08:00
直接三元就行了
|
3
lizheming 2015-03-20 10:02:00 +08:00
额,这个不可以写成三元么?
|
4
xjliao 2015-03-20 10:02:02 +08:00
同意3楼
|
5
griffinqiu 2015-03-20 10:04:35 +08:00 6
$is_false && $this->rollback() || $this->commit();
PHP是世界上最好的语言没有之一。 |
6
killerand1983 2015-03-20 10:07:26 +08:00
echo $is_false ? $this->rollback() : $this->commit()
|
7
ALeo 2015-03-20 10:11:01 +08:00 2
用if else 就好了,好像效率还更高一点..
顺便说一句,我真的看不惯别人写这种语句不加花括号... |
8
mcfog 2015-03-20 10:12:44 +08:00 via Android 3
这种情况就应该写多行没事把几句话硬挤在一起写就好像说话不停顿写字不加标点不仅不优雅简直就是在讨打
|
9
killerand1983 2015-03-20 10:14:05 +08:00
@griffinqiu 这个是什么语法呢?求解
|
10
b821025551b 2015-03-20 10:14:16 +08:00
@griffinqiu 你这是什么???
|
11
zhicheng 2015-03-20 10:16:24 +08:00 via Android
难道,大家都没有听说过函数这个东西吗?
|
12
lyragosa 2015-03-20 10:17:19 +08:00
@griffinqiu 窝巢,这个神了……
|
13
br00k 2015-03-20 10:17:45 +08:00
@griffinqiu 这样是错的。第一个为false,后面2个都不会执行。用三元没问题。
|
14
haiyang416 2015-03-20 10:19:25 +08:00
@killerand1983 不要用 @griffinqiu 的写法。
|
15
Arrowing 2015-03-20 10:19:48 +08:00
@griffinqiu 你这个是错的,如果$is_false为true的话,2个方法都会执行到。
|
16
kmvan 2015-03-20 10:20:55 +08:00
wp源码,经常有
if(true) return; |
17
br00k 2015-03-20 10:21:45 +08:00
@Arrowing 为true的话,如果$this->rollback()返回false才会继续执行。返回true就不会执行||后面的了
|
18
ETiV 2015-03-20 10:27:55 +08:00 via iPhone
三元:
TrueOrFalse ? ExecTrue : ExecFalse 某楼那个是(几乎?)所有高级点儿的编程语言的特性 && 左边是 false 的时候直接返回 false,不执行右边的 || 相反,左边是 true 的时候直接返回 true,不执行右边的 |
19
killerand1983 2015-03-20 10:29:46 +08:00
@griffinqiu 研究了十分钟终于懂了
(a && b ) || c |
20
killerand1983 2015-03-20 10:30:17 +08:00
@griffinqiu 研究了十分钟终于懂了
((a) && (b) ) || c |
21
XCaiEr 2015-03-20 10:31:20 +08:00 via iPhone
Bool ? A : B;
|
23
killerand1983 2015-03-20 10:34:07 +08:00
搭车:
为什么 $is_false ? echo 111 : echo 222; 不行 $is_false ? print 111 : print 222; 就可以 |
24
sudoz 2015-03-20 10:36:31 +08:00
? : 三目运算 一行搞定啊
|
25
ALeo 2015-03-20 10:43:21 +08:00 1
@killerand1983 echo不能使用在表达式里面..它算不上是一个函数
|
27
ericls 2015-03-20 10:49:37 +08:00
我觉得楼主的就挺优雅的 比楼下的一行的好
|
28
b821025551b 2015-03-20 10:50:13 +08:00 1
@killerand1983 用 echo $is_false ? 111 : 222;echo只是个语言结构,而print是个有返回值的函数
|
29
aWangami 2015-03-20 10:51:06 +08:00
问号表达式
|
30
goodbest 2015-03-20 10:51:31 +08:00
碰到按代码行数算工作量的公司,你们就老老实实写lz的吧...
|
31
blue7wings OP 感谢以上的同学的解答。。。
|
32
haiyang416 2015-03-20 10:56:41 +08:00
@b821025551b 不要误导别人,print 是语言结构。
|
33
blue7wings OP 我还是决定使用if,else。不必太过于强求简洁,可读性也是非常重要的。。。
|
34
c742435 2015-03-20 11:00:30 +08:00
我一般只是用&& 确保值存在。
比如 callback && callback(); 其他的用法,过于依赖&& 和|| 当流程跳转,会降低代码可读性。 |
35
k9982874 2015-03-20 11:02:08 +08:00 via iPad
|
36
b821025551b 2015-03-20 11:06:10 +08:00
@griffinqiu
@killerand1983 @ETiV 这个写法绝对有问题啊,你们自己看看 function A(){ echo 'A'; return true; } function B(){ echo 'B'; } true && A() || B(); //结果:A function A(){ echo 'A'; return false; } function B(){ echo 'B'; } true && A() || B(); //结果 AB function A(){ echo 'A'; return true; } function B(){ echo 'B'; } false && A() || B(); //结果B |
37
hooluupog 2015-03-20 11:08:49 +08:00
要么使用Fp语言,要么就忍受大量的if else。三目运算符用多了也出问题,比如多层的嵌套。
if else {} ; 这些看起来像是噪音,不过可读性还是不错的。 |
38
b821025551b 2015-03-20 11:09:42 +08:00
@haiyang416 对,我错了,print是语言结构,但是它有返回值,所以能在三元里执行
|
39
griffinqiu 2015-03-20 11:30:00 +08:00
@b821025551b 咳咳,本着对科学的严谨性。本PHPer决定修改该写发。
$is_false && ($this->rollback() || true) || $this->commit(); |
40
Registering 2015-03-20 11:47:36 +08:00
clean code 中建议拆成两个方法,,,忘记了是不是,,
|
41
155 2015-03-20 11:53:15 +08:00
$method = $is_false ? 'rollback' : 'commit';
$this->$method(); |
42
jon 2015-03-20 12:01:41 +08:00
|
43
shyangs 2015-03-20 12:04:52 +08:00
@griffinqiu
難看←_← |
44
Felldeadbird 2015-03-20 12:30:25 +08:00
最讨厌这种不加 括号的语句了。调试不好调。看着也不爽。
|
45
ETiV 2015-03-20 13:01:00 +08:00
|
46
fr0m 2015-03-20 13:16:59 +08:00
@griffinqiu readability diaobaole
|
47
b821025551b 2015-03-20 13:24:33 +08:00
@ETiV xx为真,yy为假,括号里为假,会执行zz,这样会导致yy和zz都被执行 :)@griffinqiu 在39楼的改进版才是正确的
|
48
ETiV 2015-03-20 13:28:36 +08:00
|
49
chmlai 2015-03-20 14:37:30 +08:00
不用改!
|
51
ioth 2015-03-20 15:10:22 +08:00
php也想优雅?
py笑了。 php就比c难看那么一点,当年才愿意用pascal不用c c就是合适懒人。 |
52
recall704 2015-03-20 15:11:04 +08:00
do_rollback() if is_false else do_commit()
python 的写法 |
53
loryyang 2015-03-20 17:28:25 +08:00 1
优雅不是说代码量少,而是容易看懂,层次结构合理清洗,所以不仅要这么写,而且要加上大括号。
|
54
fxxkgw 2015-03-20 18:10:11 +08:00
$this->rollbakc() if($is_false) else $this->commit()
python |
57
jasontse 2015-03-20 21:27:15 +08:00 via Android
标题应该改成
这种一句话的 if, else 有没有难以阅读的处理方法? |
58
shiny 2015-03-20 21:31:16 +08:00
这个时候总是能想起一个成语:大巧若拙
|
60
rming 2015-03-20 22:17:47 +08:00
$method = $is_false ? "rollback" : "commit" ;
call_user_func([$this, $method]); 这样的写法,其实一开始我是拒绝的。。。 |
61
gihnius 2015-03-20 22:41:58 +08:00
Lisp style:
(if bool then else) (if false rollback-this commit-this) (if is-false (rollback this) (commit this)) (if (false this) (rollback this) (commit this)) |
62
znoodl 2015-03-20 22:43:52 +08:00
前几天刚写了个一行的,后来又改掉换成多行
(a && b) || c a ? b : c 这两种效果应该相同 |
63
rushcheyo 2015-03-20 22:45:12 +08:00
(if (is-false) (funcall rollback) (funcall commit))
|
64
rushcheyo 2015-03-20 22:45:24 +08:00
(if (is-false) (rollback) (commit))
|
65
lujjjh 2015-03-20 22:45:51 +08:00 1
很奇怪的事情,要优雅,为什么不用异常处理?而且居然没人提到,很多人都在单纯地“优化”这句 if。
如果用的是 PDO 就更不可思议了,感觉没有好好看官方的例子。 |
66
ryd994 2015-03-20 22:56:35 +08:00 via Android
if ($is_false) $this->rollback();
else $this->commit(); 这样呢? 用缩进,同时在同一行,不用花括号因为不可能看错 |
67
glongzh 2015-03-20 23:00:39 +08:00
if...else不就是干这个的么。。。这都不用,那各语言的if...else是什么用途?
|
68
solupro 2015-03-21 09:54:43 +08:00
我也觉得直接用if else就好,如果想绕,也是可以的。
call_user_method_array(['rollback', 'commit'][intval(boolval($is_false))], $this, []); |
69
Syec 2015-03-21 14:24:38 +08:00
我觉得这样写就挺好呀,可读性多好
|
70
kisshere 2015-03-21 19:39:31 +08:00
楼上的,我就不明白,一堆后端代码有啥好简化的?给自己看孤芳自赏好证明自己很牛叉,用了一堆三元运算符就是大神了?反正也没人看见你的代码,如果是js,用三元运算符之类的逼格还高点,至少还有人看得见
|
71
picasso250 2015-03-22 18:40:19 +08:00
逻辑派:
$ok or $db->rollback(); $ok and $db->commit(); 动态派: $db->{$ok ? 'commit' : 'rollback'}(); ps 但是我支持多行派、人能看懂派。 |
72
picasso250 2015-03-22 18:42:55 +08:00
@lujjjh 确实,数据库操作和exception简直是绝配。
|
73
bmy001 2015-03-23 12:59:41 +08:00
直接用三元不就好了?
|