java - 如何简化这组 if 语句? (或者,是什么让它感觉如此尴尬?)

标签 java if-statement logic refactoring boolean-logic

我的同事向我展示了这段代码,我们都想知道为什么我们似乎无法删除重复的代码。

private List<Foo> parseResponse(Response<ByteString> response) {
    if (response.status().code() != Status.OK.code() || !response.payload().isPresent()) {
      if (response.status().code() != Status.NOT_FOUND.code() || !response.payload().isPresent()) {
        LOG.error("Cannot fetch recently played, got status code {}", response.status());
      }
      return Lists.newArrayList();
    }
    // ...
    // ...
    // ...
    doSomeLogic();
    // ...
    // ...
    // ...
    return someOtherList;
}

这是另一种表示形式,以使其不那么冗长:

private void f() {
    if (S != 200 || !P) {
        if (S != 404 || !P) {
            Log();
        }
        return;
    }
    // ...
    // ...
    // ...
    doSomeLogic();
    // ...
    // ...
    // ...
    return;
}

有没有更简单的方法来写这个,而不复制 !P?如果没有,是否有一些关于情况或条件的独特属性使得无法分解出 !P

最佳答案

它看起来像很多代码的一个原因是它非常重复。使用变量来存储重复的部分,这将有助于提高可读性:

private List<Foo> parseResponse(Response<ByteString> response) {
    Status status = response.status();
    int code = status.code();
    boolean payloadAbsent = !response.payload().isPresent();

    if (code != Status.OK.code() || payloadAbsent) {
      if (code != Status.NOT_FOUND.code() || payloadAbsent) {
        LOG.error("Cannot fetch recently played, got status code {}", status);
      }
      return Lists.newArrayList();
    }
    // ...
    // ...
    // ...
    return someOtherList;
}

编辑: 正如斯图尔特在下面的评论中指出的那样,如果可以直接比较 response.status()Status.OK ,那么您可以消除对 .code() 的无关调用,并使用 import static 直接访问状态:

import static Namespace.Namespace.Status;

// ...

private List<Foo> parseResponse(Response<ByteString> response) {
    Status status = response.status();
    boolean payloadAbsent = !response.payload().isPresent();

    if (status != OK || payloadAbsent) {
      if (status!= NOT_FOUND || payloadAbsent) {
        LOG.error("Cannot fetch recently played, got status code {}", status);
      }
      return Lists.newArrayList();
    }
    // ...
    // ...
    // ...
    return someOtherList;
}

关于如何处理重复的 payloadAbsent 逻辑的问题,Zachary 提供了一些与我的建议兼容的好主意。另一种选择是保留基本结构,但使检查有效负载的原因更加明确。这将使逻辑更容易理解,并且使您不必在内部 if 中使用 ||。 OTOH,我自己对这种方法不是很热衷:

import static Namespace.Namespace.Status;

// ...

private List<Foo> parseResponse(Response<ByteString> response) {
    Status status = response.status();
    boolean failedRequest = status != OK;
    boolean loggableError = failedRequest && status!= NOT_FOUND ||
        !response.payload().isPresent();

    if (loggableError) {
      LOG.error("Cannot fetch recently played, got status code {}", status);
    }
    if (failedRequest || loggableError) {
      return Lists.newArrayList();
    }
    // ...
    // ...
    // ...
    return someOtherList;
}

关于java - 如何简化这组 if 语句? (或者,是什么让它感觉如此尴尬?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48111270/

相关文章:

jvm - Java 运行时多语言的用途是什么?

java - MySQL 和 JApplet(是的,另一个)

python - 缩短许多 if 子句

java - 计算关闭时间毫秒到时间

java - JSR-356 中服务器发起的 WebSocket 广播

C++ - 如果循环内的语句无法正常工作

ios - 如何正确使用 If 语句?

logic - VHDL 正交解码器 : Sequential/Combinatorial Logic

java - java中的回文函数

java - android中USB多播的问题