blue7wings
V2EX  ›  PHP

这种一句话的 if, else 有没有优雅的处理方法?

  •  
  •   blue7wings · Mar 20, 2015 · 11830 views
    This topic created in 4254 days ago, the information mentioned may be changed or developed.
    if ($is_false)
    $this->rollback();
    else
    $this->commit();

    有没有像三元运算符那样,一条语句就搞定的?
    Supplement 1  ·  Mar 20, 2015
    还是采用了if,else的方式,即使一条语句也还是要加上{},可读性同样也是特别重要的,谢谢各位。。
    Supplement 2  ·  Mar 24, 2015
    《编写可读代码的艺术》,第一章的第二个例子就是说这个问题的,果然是学的不够多,滚去看书了。
    73 replies  •  2015-03-23 12:59:41 +08:00
    mengzhuo
    mengzhuo
    Mar 20, 2015❤️2
    1
    Readability counts.
    b821025551b
    b821025551b
    Mar 20, 2015
    2
    直接三元就行了
    lizheming
    lizheming
    Mar 20, 2015
    3
    额,这个不可以写成三元么?
    xjliao
    xjliao
    Mar 20, 2015
    4
    同意3楼
    griffinqiu
    griffinqiu
    Mar 20, 2015❤️6
    5
    $is_false && $this->rollback() || $this->commit();

    PHP是世界上最好的语言没有之一。
    killerand1983
    killerand1983
    Mar 20, 2015
    6
    echo $is_false ? $this->rollback() : $this->commit()
    ALeo
    ALeo
    Mar 20, 2015❤️2
    7
    用if else 就好了,好像效率还更高一点..

    顺便说一句,我真的看不惯别人写这种语句不加花括号...
    mcfog
    mcfog
    Mar 20, 2015 via Android❤️3
    8
    这种情况就应该写多行没事把几句话硬挤在一起写就好像说话不停顿写字不加标点不仅不优雅简直就是在讨打
    killerand1983
    killerand1983
    Mar 20, 2015
    9
    @griffinqiu 这个是什么语法呢?求解
    b821025551b
    b821025551b
    Mar 20, 2015
    10
    @griffinqiu 你这是什么???
    zhicheng
    zhicheng
    Mar 20, 2015 via Android
    11
    难道,大家都没有听说过函数这个东西吗?
    lyragosa
    lyragosa
    Mar 20, 2015
    12
    @griffinqiu 窝巢,这个神了……
    br00k
    br00k
    Mar 20, 2015
    13
    @griffinqiu 这样是错的。第一个为false,后面2个都不会执行。用三元没问题。
    haiyang416
    haiyang416
    Mar 20, 2015
    14
    @killerand1983 不要用 @griffinqiu 的写法。
    Arrowing
    Arrowing
    Mar 20, 2015
    15
    @griffinqiu 你这个是错的,如果$is_false为true的话,2个方法都会执行到。
    kmvan
    kmvan
    Mar 20, 2015
    16
    wp源码,经常有

    if(true)
    return;
    br00k
    br00k
    Mar 20, 2015
    17
    @Arrowing 为true的话,如果$this->rollback()返回false才会继续执行。返回true就不会执行||后面的了
    ETiV
    ETiV
    Mar 20, 2015 via iPhone
    18
    三元:

    TrueOrFalse ? ExecTrue : ExecFalse

    某楼那个是(几乎?)所有高级点儿的编程语言的特性
    && 左边是 false 的时候直接返回 false,不执行右边的
    || 相反,左边是 true 的时候直接返回 true,不执行右边的
    killerand1983
    killerand1983
    Mar 20, 2015
    19
    @griffinqiu 研究了十分钟终于懂了
    (a && b ) || c
    killerand1983
    killerand1983
    Mar 20, 2015
    20
    @griffinqiu 研究了十分钟终于懂了
    ((a) && (b) ) || c
    XCaiEr
    XCaiEr
    Mar 20, 2015 via iPhone
    21
    Bool ? A : B;
    finian
    finian
    Mar 20, 2015
    22
    killerand1983
    killerand1983
    Mar 20, 2015
    23
    搭车:
    为什么 $is_false ? echo 111 : echo 222; 不行
    $is_false ? print 111 : print 222; 就可以
    sudoz
    sudoz
    Mar 20, 2015
    24
    ? : 三目运算 一行搞定啊
    ALeo
    ALeo
    Mar 20, 2015❤️1
    25
    @killerand1983 echo不能使用在表达式里面..它算不上是一个函数
    SuujonH
    SuujonH
    Mar 20, 2015
    26
    @Arrowing 似乎不会吧,记得&& 是符合了第一个条件才会判定后面的
    ericls
    ericls
    Mar 20, 2015
    27
    我觉得楼主的就挺优雅的 比楼下的一行的好
    b821025551b
    b821025551b
    Mar 20, 2015❤️1
    28
    @killerand1983 用 echo $is_false ? 111 : 222;echo只是个语言结构,而print是个有返回值的函数
    aWangami
    aWangami
    Mar 20, 2015
    29
    问号表达式
    goodbest
    goodbest
    Mar 20, 2015
    30
    碰到按代码行数算工作量的公司,你们就老老实实写lz的吧...
    blue7wings
    blue7wings
    OP
    Mar 20, 2015
    31
    感谢以上的同学的解答。。。
    haiyang416
    haiyang416
    Mar 20, 2015
    32
    @b821025551b 不要误导别人,print 是语言结构。
    blue7wings
    blue7wings
    OP
    Mar 20, 2015
    33
    我还是决定使用if,else。不必太过于强求简洁,可读性也是非常重要的。。。
    c742435
    c742435
    Mar 20, 2015
    34
    我一般只是用&& 确保值存在。
    比如
    callback && callback();
    其他的用法,过于依赖&& 和|| 当流程跳转,会降低代码可读性。
    k9982874
    k9982874
    Mar 20, 2015 via iPad
    35
    @ALeo +1 不加花括号不能忍

    @griffinqiu 虽然实现优美简洁但是不适合在多人项目中使用。满篇这种写法其他维护和检查的同事会想死。

    @blue7wings 综上ifelse还是最优雅的
    b821025551b
    b821025551b
    Mar 20, 2015
    36
    @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
    hooluupog
    hooluupog
    Mar 20, 2015
    37
    要么使用Fp语言,要么就忍受大量的if else。三目运算符用多了也出问题,比如多层的嵌套。
    if else {} ; 这些看起来像是噪音,不过可读性还是不错的。
    b821025551b
    b821025551b
    Mar 20, 2015
    38
    @haiyang416 对,我错了,print是语言结构,但是它有返回值,所以能在三元里执行
    griffinqiu
    griffinqiu
    Mar 20, 2015
    39
    @b821025551b 咳咳,本着对科学的严谨性。本PHPer决定修改该写发。
    $is_false && ($this->rollback() || true) || $this->commit();
    Registering
    Registering
    Mar 20, 2015
    40
    clean code 中建议拆成两个方法,,,忘记了是不是,,
    155
    155
    Mar 20, 2015
    41
    $method = $is_false ? 'rollback' : 'commit';

    $this->$method();
    jon
    jon
    Mar 20, 2015
    42
    @griffinqiu 这个改进不错,保证条件为真时,不会执行else部分代码

    不过一般还是用ifelse这种可读性好点的
    shyangs
    shyangs
    Mar 20, 2015
    43
    @griffinqiu
    難看←_←
    Felldeadbird
    Felldeadbird
    Mar 20, 2015
    44
    最讨厌这种不加 括号的语句了。调试不好调。看着也不爽。
    ETiV
    ETiV
    Mar 20, 2015
    45
    @b821025551b 你没考虑优先级的问题

    把括号加进去, 像这样: (xx && yy) || zz

    你是不是能看明白点?
    fr0m
    fr0m
    Mar 20, 2015
    46
    @griffinqiu readability diaobaole
    b821025551b
    b821025551b
    Mar 20, 2015
    47
    @ETiV xx为真,yy为假,括号里为假,会执行zz,这样会导致yy和zz都被执行 :)@griffinqiu 在39楼的改进版才是正确的
    ETiV
    ETiV
    Mar 20, 2015
    48
    @b821025551b

    好吧, 我懂了. 咱俩说岔了!!!
    chmlai
    chmlai
    Mar 20, 2015
    49
    不用改!
    charle9
    charle9
    Mar 20, 2015
    50
    @mcfog +1
    ioth
    ioth
    Mar 20, 2015
    51
    php也想优雅?
    py笑了。
    php就比c难看那么一点,当年才愿意用pascal不用c
    c就是合适懒人。
    recall704
    recall704
    Mar 20, 2015
    52
    do_rollback() if is_false else do_commit()

    python 的写法
    loryyang
    loryyang
    Mar 20, 2015❤️1
    53
    优雅不是说代码量少,而是容易看懂,层次结构合理清洗,所以不仅要这么写,而且要加上大括号。
    fxxkgw
    fxxkgw
    Mar 20, 2015
    54
    $this->rollbakc() if($is_false) else $this->commit()
    python
    tinkerer
    tinkerer
    Mar 20, 2015
    55
    @ALeo 含泪握爪。
    popoge
    popoge
    Mar 20, 2015
    56
    @ALeo 请假这种写法效率高在哪里呢?
    jasontse
    jasontse
    Mar 20, 2015 via Android
    57
    标题应该改成
    这种一句话的 if, else 有没有难以阅读的处理方法?
    shiny
    shiny
    Mar 20, 2015
    58
    这个时候总是能想起一个成语:大巧若拙
    ALeo
    ALeo
    Mar 20, 2015
    59
    @popoge 去测试一下 if else 和三元运算的执行时间就知道了。
    rming
    rming
    Mar 20, 2015
    60
    $method = $is_false ? "rollback" : "commit" ;
    call_user_func([$this, $method]);

    这样的写法,其实一开始我是拒绝的。。。
    gihnius
    gihnius
    Mar 20, 2015
    61
    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))
    znoodl
    znoodl
    Mar 20, 2015
    62
    前几天刚写了个一行的,后来又改掉换成多行
    (a && b) || c
    a ? b : c
    这两种效果应该相同
    rushcheyo
    rushcheyo
    Mar 20, 2015
    63
    (if (is-false) (funcall rollback) (funcall commit))
    rushcheyo
    rushcheyo
    Mar 20, 2015
    64
    (if (is-false) (rollback) (commit))
    lujjjh
    lujjjh
    Mar 20, 2015❤️1
    65
    很奇怪的事情,要优雅,为什么不用异常处理?而且居然没人提到,很多人都在单纯地“优化”这句 if。

    如果用的是 PDO 就更不可思议了,感觉没有好好看官方的例子。
    ryd994
    ryd994
    Mar 20, 2015 via Android
    66
    if ($is_false) $this->rollback();
    else $this->commit();
    这样呢?
    用缩进,同时在同一行,不用花括号因为不可能看错
    glongzh
    glongzh
    Mar 20, 2015
    67
    if...else不就是干这个的么。。。这都不用,那各语言的if...else是什么用途?
    solu
    solu
    Mar 21, 2015
    68
    我也觉得直接用if else就好,如果想绕,也是可以的。

    call_user_method_array(['rollback', 'commit'][intval(boolval($is_false))], $this, []);
    Syec
    Syec
    Mar 21, 2015
    69
    我觉得这样写就挺好呀,可读性多好
    kisshere
    kisshere
    Mar 21, 2015
    70
    楼上的,我就不明白,一堆后端代码有啥好简化的?给自己看孤芳自赏好证明自己很牛叉,用了一堆三元运算符就是大神了?反正也没人看见你的代码,如果是js,用三元运算符之类的逼格还高点,至少还有人看得见
    picasso250
    picasso250
    Mar 22, 2015
    71
    逻辑派:
    $ok or $db->rollback();
    $ok and $db->commit();

    动态派:
    $db->{$ok ? 'commit' : 'rollback'}();

    ps 但是我支持多行派、人能看懂派。
    picasso250
    picasso250
    Mar 22, 2015
    72
    @lujjjh 确实,数据库操作和exception简直是绝配。
    bmy001
    bmy001
    Mar 23, 2015
    73
    直接用三元不就好了?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3037 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 111ms · UTC 04:15 · PVG 12:15 · LAX 20:15 · JFK 23:15
    ♥ Do have faith in what you're doing.