Hallo,
habe folgendes (Design-)"Problem":
Um kurz zu erklären, um was es geht: Ein Java-Programm holt sich eine XML-Datei von einem HTTP-Server. In dieser ist eine Liste von Kategorien enthalten (nach Auswahl einer Kategorie im UI können passend zur Kategorie weitere Informationen angezeigt werden) die bislang ungefähr so aussah:
[XML]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<categories>
<category id="1" name="Test" />
<category id="2" name="Bar" />
</categories>[/XML]
Mittlerweile ist es so, dass eine Kategorie auch Unterkategorien enthalten kann (beliebige Pfadlängen möglich):
[XML]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<categories>
<category id="1" name="Test">
<category id="3" name="Foo">
<!-- evtl. noch weitere Kategorien ... -->
</category>
<category id="4" name="Hunger">
</category>
</category>
<category id="2" name="Bar">
</category>
</categories>[/XML]
Als es noch keine untergeordneten Kategorien gab, hat die folgende Klasse eine Kategorie repräsentiert:
[Java]public class Category {
private int id;
private String name;
public Category(int id, String name) {
setId(id);
setName(name);
}
public int getId() {
return id;
}
public void setId(int id) {
if (id < 0) {
throw new IllegalArgumentException("param must be >=0");
}
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
if (name == null) {
throw new NullPointerException("param must not be null!");
}
this.name = name;
}
}[/Java]
Jetzt will ich die Klasse Category so umschreiben, dass sie ihren evtl. vorhandenen Parent bzw. ihre Children mir über get-Methoden liefern kann.
Die XML wird ungefähr folgendermaßen rekursiv ausgelesen (Pseudo-Code):
Jede Instanz soll ihren Parent (die übergeordnete Kategorie) und ihre Children (die untergeordneten Kategorien) kennen und mir über irgendwelche get-Methoden zurückliefern können.
Jetzt fehlt mir allerdings die Idee, wie ich das ganze sinnvoll und mit gutem Code-Design umsetzen kann.
Später soll diese Kategorieliste in einem JTree dargestellt werden, möchte es aber trotzdem unabhänig von irgendwelchen Swing-Models machen.
Auch sollen die ganzen Kategorien über eine List verfügbar gemacht werden. Wäre es hier sinnvoll, dass eine Liste nur mit den Kategorien der obersten Schicht erstellt wird, und später im Code für bspw. die GUI dann so etwas wie getChildren() aufgerufen wird?
Ich habe mir auch schon überlegt, in den Konstruktor eine Variable für den Parent einzubauen, der auch null sein kann. Doch dann frage ich mich wieder, wie eine Category an ihre Children kommen soll.
Evtl. auch eine addChildren-Methode?
Das Composite Pattern passt das auch nicht ganz zu meinem Problem. Jede Kategorie soll gleichzeitig eine Kategorie als auch ein Container ("Composite") sein. Auch wenn eine Kategorie beim Einlesen der XML noch keine untergeordneten Kategorien hat, soll trotzdem noch die Möglichkeit bestehen, später Children dazufügen zu können.
Eine Kategorie sollte auch ihren Parent (die übergeordnete Kategorie) kennen.
Mir fehlt hier völlig die Idee, wie ich das einigermaßen sinnvoll lösen könnte. Habe sowas in der Art noch nicht machen müssen. Wäre nett, wenn ihr mir auf die Sprünge helfen könntet!
Danke,
pcworld
PS: Ich weiß, der Post ist evtl. etwas durcheinander...
habe folgendes (Design-)"Problem":
Um kurz zu erklären, um was es geht: Ein Java-Programm holt sich eine XML-Datei von einem HTTP-Server. In dieser ist eine Liste von Kategorien enthalten (nach Auswahl einer Kategorie im UI können passend zur Kategorie weitere Informationen angezeigt werden) die bislang ungefähr so aussah:
[XML]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<categories>
<category id="1" name="Test" />
<category id="2" name="Bar" />
</categories>[/XML]
Mittlerweile ist es so, dass eine Kategorie auch Unterkategorien enthalten kann (beliebige Pfadlängen möglich):
[XML]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<categories>
<category id="1" name="Test">
<category id="3" name="Foo">
<!-- evtl. noch weitere Kategorien ... -->
</category>
<category id="4" name="Hunger">
</category>
</category>
<category id="2" name="Bar">
</category>
</categories>[/XML]
Als es noch keine untergeordneten Kategorien gab, hat die folgende Klasse eine Kategorie repräsentiert:
[Java]public class Category {
private int id;
private String name;
public Category(int id, String name) {
setId(id);
setName(name);
}
public int getId() {
return id;
}
public void setId(int id) {
if (id < 0) {
throw new IllegalArgumentException("param must be >=0");
}
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
if (name == null) {
throw new NullPointerException("param must not be null!");
}
this.name = name;
}
}[/Java]
Jetzt will ich die Klasse Category so umschreiben, dass sie ihren evtl. vorhandenen Parent bzw. ihre Children mir über get-Methoden liefern kann.
Die XML wird ungefähr folgendermaßen rekursiv ausgelesen (Pseudo-Code):
Java:
rootelement = ...; // damit bekomme ich das Root-Element der XML-Datei (<categories>)
readChildren(rootelement);
function readChildren(element) {
children = element.getChildren();
// Aus dem <category>-Element eine neue Instanz von Category erstellen und evtl. zu einer Liste hinzufügen?
for (children : child) {
readChildren(child);
}
}
Jede Instanz soll ihren Parent (die übergeordnete Kategorie) und ihre Children (die untergeordneten Kategorien) kennen und mir über irgendwelche get-Methoden zurückliefern können.
Jetzt fehlt mir allerdings die Idee, wie ich das ganze sinnvoll und mit gutem Code-Design umsetzen kann.
Später soll diese Kategorieliste in einem JTree dargestellt werden, möchte es aber trotzdem unabhänig von irgendwelchen Swing-Models machen.
Auch sollen die ganzen Kategorien über eine List verfügbar gemacht werden. Wäre es hier sinnvoll, dass eine Liste nur mit den Kategorien der obersten Schicht erstellt wird, und später im Code für bspw. die GUI dann so etwas wie getChildren() aufgerufen wird?
Ich habe mir auch schon überlegt, in den Konstruktor eine Variable für den Parent einzubauen, der auch null sein kann. Doch dann frage ich mich wieder, wie eine Category an ihre Children kommen soll.
Evtl. auch eine addChildren-Methode?
Das Composite Pattern passt das auch nicht ganz zu meinem Problem. Jede Kategorie soll gleichzeitig eine Kategorie als auch ein Container ("Composite") sein. Auch wenn eine Kategorie beim Einlesen der XML noch keine untergeordneten Kategorien hat, soll trotzdem noch die Möglichkeit bestehen, später Children dazufügen zu können.
Eine Kategorie sollte auch ihren Parent (die übergeordnete Kategorie) kennen.
Mir fehlt hier völlig die Idee, wie ich das einigermaßen sinnvoll lösen könnte. Habe sowas in der Art noch nicht machen müssen. Wäre nett, wenn ihr mir auf die Sprünge helfen könntet!
Danke,
pcworld
PS: Ich weiß, der Post ist evtl. etwas durcheinander...