Mein Programm lässt den Benutzer mit einer GUI einen Baum Schritt für Schritt erstellen.
Die möglichen Baumknotenschablonen werden vom Server geholt und gehören zu folgenden Kategorien, wobei alle einen namen (String) haben:
- Elemente können komplex und simpel sein
- komplexe Elemente haben 0..* Elemente als Kindknoten
- simple Elemente haben genau 2 Properties (wobei erste und zweite voneinander unterscheidbar sein sollen) und 0..* Parameter
- Properties haben einen Wert
- Parameter haben einen Wert und einen optionalen Defaultwert
Die Elemente heißen bei mir Metriken aber das hat auf die Modellierung keinen Einfluss deshalb hab ich bis jetzt von Elementen gesprochen weil das einfacher klingt. Wenn die Schablonen geholt sind kann der Benutzer unter Zuhilfenahme dieser dann den Baum aufbauen, wobei der Baum eine Extraklasse ist.
Jetzt ist die Frage wie ich das modelliere und ich habe keine Ahnung, wie ich das mache.
Bis jetzt habe ich folgende Möglichkeiten überlegt:
1. es gibt genau eine Klasse namens "MetricInfo" mit vielen Werten und einem enum "Type" der bestimmt, welche Werte benutzt werden. Diese Klasse hat einen Copykonstruktor, sodass die Schablonen kopiert, an den Baum gehängt, und dort die Werte verändert werden können (die werte der properties oder der parameter)
+ in dem Baum habe ich dann auch nur eine Klasse und muss keine instanceofs machen
- totales chaos
so sieht es auch jetzt bei mir aus:
Damit bin ich aber nicht wirklich zufrieden. Meine anderen Ideen:
2. Ich mache getrennte Klassen für die Schablonen und die tatsächlichen Objekte und mache eine Hierarchie daraus.
+ sauber getrennt alles
- einen Haufen Klassen, alles doppelt auch wenn oft gar keine Werte vorhanden sind die geändert werden können (in den simplen und komplexen Tyypen)
- instanceOfs beim aus-dem-Baum nehmen nötig
3. Ich mache eine Hierarchie aus den Klassen, aber Schablone und Objekt sind eins.
~ ganz gut getrennt aber auch nicht richtig
~ nicht wenig Klassen aber auch nicht viele
- instanceOfs beim aus-dem-Baum nehmen nötig
Habt ihr da vielleicht eine Idee?
Die möglichen Baumknotenschablonen werden vom Server geholt und gehören zu folgenden Kategorien, wobei alle einen namen (String) haben:
- Elemente können komplex und simpel sein
- komplexe Elemente haben 0..* Elemente als Kindknoten
- simple Elemente haben genau 2 Properties (wobei erste und zweite voneinander unterscheidbar sein sollen) und 0..* Parameter
- Properties haben einen Wert
- Parameter haben einen Wert und einen optionalen Defaultwert
Die Elemente heißen bei mir Metriken aber das hat auf die Modellierung keinen Einfluss deshalb hab ich bis jetzt von Elementen gesprochen weil das einfacher klingt. Wenn die Schablonen geholt sind kann der Benutzer unter Zuhilfenahme dieser dann den Baum aufbauen, wobei der Baum eine Extraklasse ist.
Jetzt ist die Frage wie ich das modelliere und ich habe keine Ahnung, wie ich das mache.
Bis jetzt habe ich folgende Möglichkeiten überlegt:
1. es gibt genau eine Klasse namens "MetricInfo" mit vielen Werten und einem enum "Type" der bestimmt, welche Werte benutzt werden. Diese Klasse hat einen Copykonstruktor, sodass die Schablonen kopiert, an den Baum gehängt, und dort die Werte verändert werden können (die werte der properties oder der parameter)
+ in dem Baum habe ich dann auch nur eine Klasse und muss keine instanceofs machen
- totales chaos
so sieht es auch jetzt bei mir aus:
Java:
package net.saim.gwt.shared;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
public class MetricInfo implements Serializable
{
private static final long serialVersionUID = 6346373663851056941L;
public String name;
public String value; // only for parameters and properties
//public String type;
public Type type;
public Set<MetricInfo> parameters; // have to have a MetricInfo.Type of PARAMETER
public enum Type {SIMPLE,COMPOSITE,PROPERTY,PARAMETER}
public static MetricInfo composite(String name)
{
return new MetricInfo(name,null,Type.COMPOSITE,null);
}
public static MetricInfo simple(String name,Set<MetricInfo> parameters)
{
return new MetricInfo(name,null,Type.SIMPLE,parameters);
}
public static MetricInfo property(String name,String value)
{
return new MetricInfo(name,value,Type.PROPERTY,null);
}
public static MetricInfo parameter(String name,String value)
{
return new MetricInfo(name,value,Type.PROPERTY,null);
}
private MetricInfo(String name, String value, Type type,
Set<MetricInfo> parameters)
{
super();
this.name = name;
this.value = value;
this.type = type;
this.parameters = new HashSet<MetricInfo>(parameters);
}
public MetricInfo(MetricInfo metricInfo)
{
this.name = metricInfo.name;
this.value = metricInfo.value;
this.type = metricInfo.type;
this.parameters = new HashSet<MetricInfo>(metricInfo.parameters);
}
@Override
public String toString()
{
return name;
}
/** for gwt serialization which needs a default constructor */
public MetricInfo(){}
}
Damit bin ich aber nicht wirklich zufrieden. Meine anderen Ideen:
2. Ich mache getrennte Klassen für die Schablonen und die tatsächlichen Objekte und mache eine Hierarchie daraus.
+ sauber getrennt alles
- einen Haufen Klassen, alles doppelt auch wenn oft gar keine Werte vorhanden sind die geändert werden können (in den simplen und komplexen Tyypen)
- instanceOfs beim aus-dem-Baum nehmen nötig
3. Ich mache eine Hierarchie aus den Klassen, aber Schablone und Objekt sind eins.
~ ganz gut getrennt aber auch nicht richtig
~ nicht wenig Klassen aber auch nicht viele
- instanceOfs beim aus-dem-Baum nehmen nötig
Habt ihr da vielleicht eine Idee?