如何简化此解析方法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何简化此解析方法?相关的知识,希望对你有一定的参考价值。

我正在编写代码来从文件中解组XML。我不知道XML基于哪个模式,所以我尝试用不同Jaxb2Marshaller实例形式的几个模式解组它。

该方法需要:

  1. 尝试用每个编组器解组XML
  2. 如果成功,则返回结果对象
  3. 如果失败,请尝试下一个编组
  4. 如果所有marshallers都失败,请使用上一条错误消息抛出异常

这是当前的代码:

private Object getObject(final byte[] data) throws MyException {
    String lastErrorMessage = "";
    for (final Jaxb2Marshaller marshaller : this.marshallers) {
        try {
            return marshaller.unmarshal(new StreamSource(new ByteArrayInputStream(data)));
        } catch (final XmlMappingException e) {
            LOGGER.warn("Invalid XML", e);
            lastErrorMessage = e.getMessage();
        }
    }
    throw new MyException(lastErrorMessage);
}

我觉得这个方法在不同的抽象层次上做了太多事情:

  • 迭代marshallers
  • 申请编组
  • 返回结果
  • 捕捉异常
  • 抛出异常

但我没有看到简化它的方法。每个编组器都需要try-catch块(因为我应该捕获并忽略除最后一个之外的这些XmlMappingExceptions)。该块要么返回一个结果对象,要么返回迭代后需要的lastErrorMessage来抛出MyException。

我能想到的唯一解决方案是创建一些人为的Result类,它包含结果对象或错误消息,但感觉很笨拙。还有其他见解吗?

答案

我想要像这样的粒度方法:

private Object getObject(byte[] data) throws MyException {
    Result result;
    for (Jaxb2Marshaller marshaller : this.marshallers) {
        result = getObject(marshaller, data);
    }
    return handleError(result);
}

private Result getObject(Jaxb2Marshaller marshaller, byte[] data) {
    try {
        return Result.value(marshaller.unmarshal(new StreamSource(new ByteArrayInputStream(data))));
    } catch (final XmlMappingException e) {
        LOGGER.warn("Invalid XML", e);
        return Result.error(e.getMessage());
    }
}

private Object handleError(Result result) {
    if (result.isError()) {
        throw new MyException(result.errroMessage);
    }
    else {
        return result.value;        
    }
}

但是附加的Result类是冗长而且笨拙的:

private class Result {
    String errorMessage;
    Object value;

    static Result error(String errorMessage) {
        Result result = new Result();
        result.errorMessage = errorMessage;
        return result;
    }

    static Result value(Object value) {
        Result result = new Result();
        result.value = value;
        return result;
    }

    boolean isError() {
        return errorMessage != null;
    }
}

以上是关于如何简化此解析方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何简化此 if 语句?

如何使用 Android 片段?

如何在片段中使用按钮[关闭]

Python 优化:如何简化此代码?

如何简化此更新函数数组代码?

为啥我的 C 代码片段不起作用?简化版可以。为 unsigned long long 传递不带 VA_ARGS 的 args