改变if语句中的状态是不好的做法吗?

1 java state if-statement

我写了一些类似于以下内容的代码:

String SKIP_FIRST = "foo";
String SKIP_SECOND = "foo/bar";

int skipFooBarIndex(String[] list){
    int index;
    if (list.length >= (index = 1) && list[0].equals(SKIP_FIRST) ||
        list.length >= (index = 2) && 
        (list[0] + "/" + list[1]).equals(SKIP_SECOND)){
        return index;
    }

    return 0;
}

String[] myArray = "foo/bar/apples/peaches/cherries".split("/");
print(skipFooBarIndex(myArray);
Run Code Online (Sandbox Code Playgroud)

这通过分配索引来更改if语句内部的状态.但是,我的同事非常不喜欢这个.

这是一种有害的做法吗?有什么理由这样做吗?

Meh*_*ari 15

是.这显然降低了可读性.以下代码有什么问题?

int skipFooBarIndex(String[] list){
    if(list.length >= 1 && list[0].equals(SKIP_FIRST)) 
        return 1;
    if(list.length >= 2 && (list[0] + "/" + list[1]).equals(SKIP_SECOND))
        return 2;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

理解起来要容易得多.一般而言,不鼓励在表达式中存在副作用,因为您将依赖于子表达式的评估顺序.

假设你把它算作"聪明"的代码,那么永远记住Brian Kernighan的引用是件好事:

调试的难度是首先编写代码的两倍.因此,如果您尽可能巧妙地编写代码,那么根据定义,您不够聪明,无法对其进行调试.

  • 为什么不多个return语句,为什么有一个不必要的变量? (6认同)
  • 多次返回非常有用,因为它们允许您在内存中保留较少(您的 - 而不是计算机!).一个很好的例子就是在获得真正的业务之前消除所有简单的边缘情况. (3认同)
  • @大卫.很多人讨厌多次退货.你肯定可以通过代码审查进入战斗.(不是说我这样做.) (2认同)