gpt4 book ai didi

java - 避免不断检查以确保 json 对象包含元素

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:06:37 26 4
gpt4 key购买 nike

我正在编写一些代码,当它感觉丑陋和不雅时,我有一种urgh的感觉,但我无法立即找到避免它的方法。

我有一个从第三方获取的 json 对象。我知道会发生什么,但我不能确定每个元素一定会存在,所以我需要检查它是否存在,如下所示:

if (object.has(ELEMENT)) {
JsonObject element = object.get(ELEMENT);
}

问题是有时我必须深入研究对象,当我得到这么多嵌套的 if 时,它开始变得丑陋。这是一个例子:

private boolean lineExists(JsonArray orders, Line lineItem) {
final String LINE_ITEMS = "lineItems";
final String ELEMENTS = "elements";
final String NOTE = "note";
boolean exists = false;

log.debug("Checking if line item already exists in order...");

// if there is no order payload then the order hasn't already been posted so there can't be a duplicate line item
if (orders != null) {
for (int i = 0; i < orders.size(); i++) {
JsonObject order = orders.get(i).getAsJsonObject();
if (order.has(LINE_ITEMS)) {
JsonObject lineItems = order.get(LINE_ITEMS).getAsJsonObject();
if (lineItems.has(ELEMENTS)) {
JsonArray elements = lineItems.get(ELEMENTS).getAsJsonArray();
for (int j = 0; j < elements.size(); j++) {
JsonObject existingLine = elements.get(j).getAsJsonObject();
if (existingLine.has(NOTE)) {
String note = existingLine.get(NOTE).getAsString();
// the note may change after this comparison so just check if the ID is contained in the
// note
if (note.contains(lineItem.getNote())) {
exists = true;

log.warn("Line item with note containing '{}' already exists in order.",
lineItem.getNote());
}
}
}
}
}
}
}

return exists;
}

我知道我可以像这样将一些测试拆分成它们自己的方法:

private boolean lineExistCheck(JsonObject order) {
final String LINE_ITEMS = "lineItems";
final String ELEMENTS = "elements";

return order.has(LINE_ITEMS) && order.get(LINE_ITEMS).getAsJsonObject().has(ELEMENTS);
}

我只是想知道是否有一种设计模式或思维方式可以帮助我在这种情况下编写更好的代码。

最佳答案

您想了解 single layer of abstraction principle .

从本质上讲,这个想法是要求您向右缩进的每件事......最好放在自己的方法中。因此,您不仅将测试放入单独的方法中;你走得更远。

旁注:像那样使用 final ... 不会给你带来任何好处。在我看来(但这是对风格的看法!)这只是浪费,无缘无故地让你的 CPU 燃烧周期。更进一步;将这些局部常量转换为全局静态常量可能更有意义。

另一件事(考虑到您正在处理 JsonObject,这当然很棘手)......这段代码是 Tell Dont Ask 的一个“不错”的反例。 .重点是:你的代码在查询其他对象的内部状态;以此为基础做出决定。本质上,这就是过程编程。在真正的 OO 中,您不会对象询问一些信息然后做某事;没有;您只需告诉该对象做任何需要做的事情。但正如所说;这在这里并没有真正的帮助;考虑到您正在处理通用 JsonObject 的事实;而不是具有已知且定义明确的接口(interface)的“真实”对象,您可以使用它来“告诉”它要做什么。

关于java - 避免不断检查以确保 json 对象包含元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38827525/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com