Modellierungsproblem

kirdie

Bekanntes Mitglied
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:

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?
 

Wildcard

Top Contributor
Gibt deine Schablone eine Struktur vor, also welche 'Properties' valide für diese Art Objekt sind usw?

Du sprichst ja schon selbst von Modellierung, warum verwendest du kein Modellierungstool? Ich kann immer nur zu EMF raten.
Wenn ich das mit den Schablonen richtig verstanden habe, könnte deine Schablone eine EClass sein die alle Features (Properties) dieses Typs von Objekt beschreiben.
Mit EMF kannst du aus einer solchen EClass schablone dann einfach ein passendes Objekt instanzieren das diese Properties aufnehmen kann.
Wenn ich das soweit richtig verstanden habe bräuchtest du also eigentlich gar keine Klasse, weil du alles per dynamic Ecore erledigen kannst
 

kirdie

Bekanntes Mitglied
Die Clientseite ist mit Google Web Toolkit implementiert, der Javacode wird also in Javascript übersetzt, das heißt ich kann die meisten externen Libraries nicht anwenden.

Genau, die "Schablone" gibt vor, welche Properties valide sind. Im Prinzip gibt es aber nur diese 4 Schablonen (simple, complex, parameter, property), das was der Server nur zurückgibt ist die Anzahl, Namen und gegebenenfalls Defaultwerte dieser die Schablonen erfüllenden Dinge.
 

Neue Themen


Oben