【问题标题】:How to avoid multiple if else block so that the code does not smell?如何避免多个 if else 阻塞,使代码没有异味?
【发布时间】:2020-06-24 06:10:59
【问题描述】:

我的代码中有很多 if-else 语句,我可以避免这么多 if-else 语句的最佳方法是什么。下面是代码sn-p。现在我需要再次检查 WWW-Authenticate 标头是否返回值

signature_invalid

然后我需要记录并返回不同的错误消息,如果 WWW-Authenticate 标头返回值

token_exppured

然后我需要记录一条不同的错误消息,这将再次添加 2 个 ifs。谁能帮助我如何避免这种情况?

    if (e.getRawStatusCode() == NOT_FOUND) {
      logger.log(
          log,
          LogLevel.ERROR,
          MISSING_VALID_ID_ERROR_MSG + " : " + e.toString(),
          viewRequest);
      String errorDetails = createNotFoundDetails(appl, transactionId);
      updateIdentifier(rcvLog, true, request, identifier);
      return createErrorViewResponseReply(MISSING_VALID_ID_ERROR_MSG, errorDetails);       

 } else if (e.getRawStatusCode() == UNAUTHORIZED) {
      logger.log(
          log, 
          LogLevel.ERROR,
          UNABLE_TO_REACH_ERROR_MSG + " : " + e.toString(),
          viewRequest);
      if (e.getResponseHeaders() != null && e.getResponseHeaders().getFirst(HttpHeaders.WWW_AUTHENTICATE != null)) {
      logger.log(
          log,
          LogLevel.ERROR,
          INVALID_TOKEN_ERROR_MSG + " : " + e.getResponseHeaders().getFirst(HttpHeaders.WWW_AUTHENTICATE),
          viewRequest);
      }
      updateIdentifier(rcvLog, false, request, identifier);
      return createErrorViewResponseReply(
          UNABLE_TO_REACH_ERROR_MSG,
          INVALID_TOKEN_ERROR_DETAILS);
    }

【问题讨论】:

标签: java if-statement


【解决方案1】:

对此可以采取的基本方法是:

  1. 使用工厂创建类层次结构以实例化正确的实例以响应操作
  2. 使用枚举做同样的事情,但要简明扼要
  3. 使用 this::method() 的映射并调用为您工作的方法

对于您的情况,由于您无法真正控制 API 发送给您的代码类型,并且工厂方法可能会过大,因此映射方法可能是最好的:

map.put(NOT_FOUND, this::methodA);
map.put(UNAUTHORIZED, this::methodB);
map.put(OTHER, this::methodC);

map.computeIfAbsent(
   e.getRawStatusCode(), 
   (e, rc, req, id) -> {/** NOTHING */}
).apply(e, rcvLog, request, identifier);

computeIfAbsent() 允许您以基本无操作的方式处理未处理的情况。

【讨论】:

  • 这是一个非常干净的方法。如果我只想在未经授权的块中遵循这种方法并创建一个由 WWW-Authenticate 标头返回的值的映射,例如 map.put("signature_invalid", 这个: :方法A);和 map.put("token_expired, this::methodB),如果我这样做,那么我如何使用 omputeifabsent 返回 createErrorViewResponseReply()
  • 我之前没有使用过computeIfAbsent,所以我对这个新的map方法很陌生
  • computeIfAbsent() 是完全可选的,您也可以这样做: var method = map.get(e.getRawStatusCode()); if (null != method) method.apply(e, rcvLog, request, identifier);由你决定。
  • 你能帮我实现这个 map.put(“signature_invalid”, this::methodA); map.put(“token_expired”, this::methodB); map.put(“其他”, this::methodC); map.computeIfAbsent(e.getResponseHeaders().getFirst(HttpHeaders.WWW_AUTHENTICATE), ).apply();
  • 我真的发现这在使用 computeIfAbsent 时很有用,并返回 createErrorViewResponse 回复由 WWW-Authenticate 标头发送的不同错误消息。所以如果您能帮助我,将不胜感激
猜你喜欢
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多