Frage

Jemand hat Code entworfen, der sich auf vollständige Daten stützte. Das XML hatte immer jedes Element. Die Datenquelle sendet jetzt spärliche XML; Wenn es vorher leer gewesen wäre, fehlt es jetzt. Es ist also an der Zeit, Fehler zu refaktoren, während er Fehler behebt.

Es gibt über 100 Codezeilen wie diese:

functionDoSomething(foo, bar, getRoot().getChild("1").getChild("A").
    getChild("oo").getContent());

Außer jetzt könnte GetChild ("a") Null zurückgeben. Oder eine der GetChild (XXX) -Methoden könnte.

Als eine zusätzliche Wendung gibt es anstelle von getChild () tatsächlich vier getrennte Methoden, die nur in bestimmten Bestellungen auftreten können. Jemand schlug einen Varargs -Anruf vor, der keine schlechte Idee ist, aber nicht so sauber funktioniert, wie ich es mir mag.

Was ist der schnellste Weg, um diesen zu reinigen? Der beste? "Versuchen/fangen", wurde vorgeschlagen, aber Mann, das ist hässlich. Das dritte Argument für die oben genannte Methode in seine eigene Funktion herauszugeben, könnte funktionieren ... aber das würde mehr als 100 neue Methoden mit sich bringen, die sich hässlich anfühlt, wenn auch weniger.

Die Anzahl der GetChild (XXX) -Anrufe liegt zwischen sechs und zehn pro Zeile ohne feste Tiefe. Es gibt auch keinen möglichen Weg, um eine korrekte DTD dafür zu erhalten. Die Dinge werden später ohne vorherige Köpfe hinzugefügt, und wo ich eine Warnung in den Protokollen bevorzugen würde, müssen zusätzliche Zeilen im XML anmutig behandelt werden.

Ideen?

GetChild () ist eigentlich eine Komfortmethode. Der sauberste Weg, den ich im Sinn habe, besteht darin, dass die Komfortmethoden ein gültiges Kinderobjekt zurückgeben, aber das "leere" Kind des Kindes GetContent () immer zurückgeben "".

War es hilfreich?

Lösung

Was Sie beschrieben haben (Rückgabe eines speziellen Kinderobjekts) ist eine Form der NullObject Muster, was hier wahrscheinlich die beste Lösung ist.

Andere Tipps

Bitte überlegen Sie, wie Sie XPath anstelle dieses Durcheinanders verwenden können.

Die Lösung besteht darin, eine DTD -Datei für XML zu verwenden. Es bestätigt Ihre XML -Datei so getChild("A") Kehrt nicht null zurück, wenn a obligatorisch ist.

Wie wäre es mit:

private Content getChildContent(Node root, String... path) {
    Node target = root;
    for ( String pathElement : path ) {
         Node child = target.getChild(pathElement);
         if ( child == null ) 
            return null; // or whatever you should do

         target = child;
    }

    return target.getContent();

}

verwendet werden als

functionDoSomething(foo, bar, getChildContent(root, "1", "A", "oo"));

Ihr Problem könnte ein Designproblem sein: Gesetz des Demeteres.

Wenn nicht, können Sie so etwas wie eine verwenden Optionstyp Ändern der Rückgabetyp von GetChild in die Optionu003CNode> :

for(Node r : getRoot())
  for(Node c1 : r.getChild("1"))
    for(Node c2: c1.getChild("A"))
      return c2.getChild("oo")

Dies funktioniert, weil die Option iterable implementiert wird, wenn ein Rückgabewert nicht definiert ist. Dies ist ähnlich wie Scala, wo es in einer einzigen Expression exprimiert werden kann.

Ein weiterer Vorteil ist, dass Sie Schnittstellen definieren können, die werden Geben Sie niemals einen Nullwert zurück. Mit einem Optionstyp können Sie in der Schnittstellendefinition angegeben, dass der Rückgabewert möglicherweise undefiniert ist und der Client entscheiden kann, wie er damit umgeht.


Wenn es immer auf ungefähr das gleiche Niveau herrscht, können Sie den Code beispielsweise wahrscheinlich mit Eclipse neu refaktorieren, und er wird automatisch jede Zeile ändern, die gleich aussieht.

Auf diese Weise können Sie die Methode so ändern, dass sie schlauer sein, anstatt jede Zeile einzeln zu ändern

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top