Architekturproblem

basti1902

Mitglied
Ich habe ein kleinens Architekturproblem. Vielleit hat jemand eine Idee wie man das am einfachsten lösen kann.

Ist Stand:

Es gibt eine Klasse AbstractProceeding, von der sind mehrere Klassen abgeleitet, z.B. SampleCounting1D, SampleCounting2D, SampleCounting3D, EvnetCounting1D,...

Die abstrakte Klasse enthält verschiedene Metadaten die für alle Unterklassen gleich sind.
Die unterklassen unterscheiden siche anhand der Werte die sie enthalten. Außerdem implementieren sie verschiedene interfaces mit set() und get().

SampleCounting1D z.B. int[]
SampleCounting2D z.B. int[][]
SampleCounting3D z.B. int[][][]

Es kommen manchmal neue Klassen hinzu die sich in kleinigkeiten von den anderen unterscheiden können. Die Klassen enthalten immer einen Array 1D, 2D oder 3D.

Um die Daten aus den Unterklassen auszuelesen brauche ich natürlich verschiedene Methoden mit verschiedenen Rückgabewerten. z.B. int[] getData();
Object möchte ich eigentlich nicht als rückgabewert haben, da ich wenn möglich nicht casten will.


Gibt es vielleicht ein Pattern mit dem ich das ganze vereinfachen kann, um die Daten einfacher auslesen zu können? Ich habe schon ein wenig mit dem Bridge Pattern experimentiert. Hat
 

Michael...

Top Contributor
Wenn ich das Problem richtig verstanden habe, könnte man das mit Generics lösen:
Java:
interface GetSetInterface<T> {
	public void set(T t);
	public T get();
}

class Test1D implements GetSetInterface<int[]> {
	private int[] data;
	
	public int[] get() {
		return data;
	}

	public void set(int[] data) {
		this.data = data;
	}
}

class Test2D implements GetSetInterface<int[][]> {
	private int[][] data;
	
	public int[][] get() {
		return data;
	}

	public void set(int[][] data) {
		this.data = data;
	}
}
 

Andi_CH

Top Contributor
Generics - hm, wenn es wirklich nur darum geht Daten zu speichern ein bestechender Gedanke, allerdings dürften sich impementierte Algorithmen bei 1D 2D und 3D Klassen doch wesentlich unterscheiden und dann ist dieser Ansatz möglicherweise nicht so geeignet.

Eine Ableitung ist es dann, wenn man sagen kann:
A ist ein B. z.B. ein LKW ist ein "mobiles Ding", ein PKW auch, ein Motorrad auch, aber ein LKW ist kein PKW und auch kein Motorrad

SampleCounting1D ist ein AbstractProceeding - ok

Die Frage stellt sich ob SampleCounting2D ein SampleCounting1D ist.
1D hat ein int[] -> 1. Dimension
2D hat ein int[] -> 2. dimension (die 1.wird ja geerbt)
3D hat ein weiteres int[] ......
(Nein, ich behaupte nicht, dass ich das so umsetzen würde - ich müsste mehr wissen und genauer darüber nachdenken)

Allerdings werden sich setter und getter zwingend unterscheiden, wenn die Klassen unterschiedliche Daten enthalten - das liegt in der Natur der Sache. Die Interfaces können nicht 100% gleich sein.

getLadung() macht beim LKW Sinn, beim PKW vielleicht, beim Motorrad definitiv nicht.
getTreibstoffmenge() kennen alle und betanken(double liter) auch.

getKoordinaten wird je nach Klasse einen int[], einen int[][] oder einen int[][][] zurückgeben.
es sei denn es gibt getXKoordinaten, getYKoordinaten und getZKoordinaten (Was ich persönlich allerdings nicht mag. Ich möchte lieber einen Datensatz erhalten.)

Einfach so meine Gedanken - was für dich das Beste ist, musst du selbst herausfinden.
 

basti1902

Mitglied
Bei SampleCounting 3D ist es nicht wirklich ein int[][][], das war nur um es leichter zu erklären.

Es sollte auch einfach erweiterbar sein falls irgendwann mal ein 4D dazu kommt.

Zum Hintergrund:
AbstractProceeding ist ein Verfahren.
SampleCounting1D, -2D,... sind auch alles Verfahren die die selben Datentypen beinhalten, nur eben mit mehreren Dimensionen.
 

Neue Themen


Oben