2016-07-08 3 views
1

Ich denke, ich habe eine gute Frage bezüglich der Arbeit, die ich mache. Also möchte ich ein Objekt erstellen, um den Typ eines HTML-Elements und seinen X-Pfad zu speichern. Der Code ist sehr einfach:Eine gute Implementierung für ein Objekt, das 2 oder 3 Felder haben kann, abhängig vom Typ

public class XpathObject { 
    private String type; 
    private String xpath; 

    public XpathObject(String type, String xpath) { 

    if(!type.equals("input") && !type.equals("label") && !type.equals("textarea") && !type.equals("button")) { 
    throw new IllegalArgumentException(); 
    } 

     this.type = type; 
     this.xpath = xpath; 
    } 

    public String getType() { 
     return type; 
    } 

    public String getXpath() { 
     return xpath; 
    } 
} 

Die Dinge, das ist, wenn ich habe ein die „Bezeichnung“ Typ i Diese Aufgabe wollen die folgenden drei Felder haben, anstatt die 2, Typ, XPath und xpath_bis. Der naive Ansatz wäre, immer den xpath_bis zu setzen und ihn zu ingigieren, wenn ich nicht im "label" -Fall bin, aber ich finde es hässlich, ein Feld auf Null gesetzt zu haben (ich könnte falsch liegen). Wie könnte ich diesen Fall richtig umsetzen? Vielen Dank.

+1

Erstellen einer Unterklasse 'XpathLabelObject', die das zusätzliche Feld hat, und verwenden Sie die Unterklasse im Fall Typ ist "Label". Vielleicht erstellen Sie eine Factory-Methode, um entweder eine Instanz von 'XpathObject' oder eine Instanz von' XpathLabelObject' zu erstellen, abhängig vom Wert von 'type'. – Jesper

+0

Ja, aber wäre es nicht ein bisschen zu viel, um ein anderes Objekt in der Klasse nur für diesen kleinen Fall zu instanziieren? –

+0

Ich zögere für die Factory-Methode, ich denke, ich werde dafür gehen, wenn keine andere Lösung finden –

Antwort

3

Nachfolgend würde

public class XpathObject { 
    public final String type; // Or protected final 
    public final String xpath; 

    public XpathObject(String type, String xpath) { // Or protected 
     this.type = type; 
     this.xpath = xpath; 
    } 
} 

public class XpathObjectLabel { 
    public final String xpathBis; 

    public XpathObjectLabel(String xpath, String xpathBis) { 
     super("label", xpath); 
     this.xpathBis = xpathBis; 
    } 
} 

Dies wäre sinnvoll, machbar sein, wenn man Klassen XpathObjectTextArea und so machen würde.

Aber wie ich denke, Sie erstellen diese Objekte durch Parsen von Text, ohne viel Funktionalität w.r.t. spezielle Methoden/Logik, ich denke, einfach alles in eine einzige Klasse setzen wäre ein guter Anfang. Mit Java 8 Einfluss:

public class XpathObject { 
    public final String type; // Or protected final 
    public final String xpath; 
    public Optional<String> xpathBis = Optional.empty(); 

    public XpathObject(String type, String xpath) { // Or protected 
     this.type = type; 
     this.xpath = xpath; 
    } 
} 

Grund: Sie wahrscheinlich verarbeiten die DOM-Elemente hierarchisch, auf der Suche alle Texteingaben (Eingabe von Text + Textbereich) oder was auch immer. Dann beschäftigen Sie sich hauptsächlich mit XPathObject.

Intelligentere Dinge, wie der Input, auf den sich dieses Label bezieht, erfordern intelligente Datenstrukturen, Map, eine eigene FieldDefinition-Klasse oder was auch immer. Und Refactoring ist einfach.

+0

Die Verwendung der Otional wäre schön gewesen! Aber ich kann es nicht benutzen, ich bin in Java 1.7. Ich denke, dass ich für den ersten gehen werde. PS: Sie haben völlig erraten, was ich tat, ich bin beeindruckt, –

+0

'Optional ' so zu sagen. Viel Glück –

2

Zuerst würde ich vorschlagen, eine Aufzählung für den Typ anstelle einer Zeichenfolge zu verwenden. Dies macht es typsicher und leicht erweiterbar und macht die hässliche if-Anweisung überflüssig.

public enum ElementType { 

INPUT, LABEL, TEXTAREA, BUTTON; 

}

Zweitens sollte es eine Unterklasse für Typ LABEL sein, das zusätzliche Feld hat.

Drittens würde ich mit Builders vorschlagen, die appropriat Setter und geben die richtigen Subtypen haben, wie folgt aus:

XPathBuilder.builder(LABEL).setXpath("path").setXpathBis("bis").build(); 

und

XPathBuilder.builder(TEXTAREA).setXpath("path").build(); 
Verwandte Themen