Ich schreibe etwas Code und ich habe dieses Gefühl von Urgh, die ich bekomme, wenn es hässlich und unelegant fühlt, aber ich kann nicht sehen, einen sofortigen Weg, um es zu vermeiden.Vermeidung der ständigen Überprüfung, um sicherzustellen, Json-Objekt enthält Elemente
Ich habe ein JSON-Objekt, das ich von einer dritten Partei bekomme. Ich weiß, was zu erwarten ist, aber ich kann nicht sicher sein, dass jedes Element auf jeden Fall da sein wird, so muss ich prüfen, ob es so gibt:
if (object.has(ELEMENT)) {
JsonObject element = object.get(ELEMENT);
}
Das Problem ist, dass ich manchmal ziemlich tief in die gehen Objekt und es beginnt sich hässlich zu fühlen, wenn ich so viele verschachtelte ifs bekomme. Hier ein Beispiel:
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;
}
Ich weiß, dass ich einige der Tests in eigene Methode wie folgt aufteilen:
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);
}
Ich frage mich nur, wenn es ein Design-Muster oder eine Art und Weise des Denkens, das mir helfen würde, in diesem Fall besseren Code zu schreiben.
Danke für die späten aber immer herzlich willkommen zu akzeptieren! – GhostCat
@GhostCat Total dachte ich hätte das schon gemacht! Entschuldige die Verzögerung (oops). – SBmore
Kein Grund zum Mitleid. Wenn Sie länger herum sind, sind solche unerwarteten Dinge wirklich etwas, das Sie genießen; es fühlt sich irgendwie wie "free lunch" an (du siehst, die "Anstrengung" hat vor einigen Wochen stattgefunden und jetzt gibt es einen überraschenden Gewinn daraus ;-) – GhostCat