# Datenhaltungsklasse für wenige Werte?



## kirdie (8. Sep 2009)

Situation
Ich habe eine Stichprobe, die mehrere Elemente enthält. Jetzt möchte ich die Stichprobe in verschiedene Klassen unterteilen und zu jeder Klasse die Anzahl der enthaltenen Elemente und die Anzahl derer, die davon korrekt sind, festhalten. "Class" bedeutet also hier nicht Java-Klasse, sondern "Stichproben-Unterteilungs-Klasse".

Die Frage ist nun, wie ich das modelliere:

Idee 1 - Mit einer Datenhaltungsklasse


```
public class ClassStatistics
{
	public String className;
	public int occurrences;
	public int goodMatches;
	
	public ClassStatistics(String className, int occurrences, int goodMatches)...	
}

public class Analyse
{
...
	private static ClassStatistics[] classStatistics(SampleEntry[] sample, Classifier classifier)
...
	ClassStatistics[] classStatistics = classStatistics(sample,classifier);
	for(ClassStatistics statistics: classStatistics)
		System.out.println(statistics.className+" enthält "+statistics.occurrences+" Elemente, davon korrekt: "+statistics.goodMatches);
...
}
```

Idee 2) Mit einem zweidimensionalen Array

```
public class Analyse
{
...
	private static int[][] classStatistics(SampleEntry[] sample, Classifier classifier)
...
	int[][] classStatistics = classStatistics(sample,classifier);
	for(int i=0;i<classStatistics;i++)
		System.out.println(classifier.getClasses[i]+" enthält "+classStatistics[i][0]+" Elemente, davon korrekt: "+classStatistics[i][1]);
...
}
```

Idee 3) Mit einer Map


```
public class Analyse
{
...
	private static Map<String,Integer>[] classStatistics(SampleEntry[] sample, Classifier classifier)
...
	Map<String,Integer>[] classStatistics = classStatistics(sample,classifier);
	for(int i=0;i<classStatistics;i++)
		System.out.println(classifier.getClasses[i]+" enthält "+classStatistics[i].get("occurrences")+" Elemente, davon korrekt: "+classStatistics[i].get("goodMatches"));
...
}
```

Frage)
Was meint ihr dazu?
Irgendwie finde ich es sinnlos, wegen 2 Integerwerten eine extra Klasse aufzumachen, die überhaupt nichts tut, als eben diese Werte zu speichern.
Vor allem passiert mir so etwas dauernd und ich habe dann jedesmal, wenn ich 2 oder mehr Elemente klammern will irgendeine neue kleine Klasse.
Andersherum ist das Speichern in arrays nicht typsicher und überhaupt kommt es mir nicht sehr elegant vor. Am liebsten wäre es mir, man könnte solche einfachen Klassen zur Laufzeit erzeugen.
Und das mit der Map find ich irgendwie nicht so prickelnd, das kommt mir so vor wie eine nichtstandardisierte Klassen-Emulation... Vor allem, wenn ich noch den Anteil in Prozent hinzufüge,
brauche ich ja noch float Werte und müsste die Map auf Object setzen und hin und her casten...

Das ist eine eher philosophische Frage. Ich weiss, dass alle 3 Möglichkeiten funktionieren, aber ich würde gerne wissen, welche die beste und eleganteste ist, vor allem weil ich dieses Problem öfters habe.

Antwort)

Ok vielen Dank! Ich werde also die Variante mit der Klasse nehmen.

P.S.)
Jetzt frage ich mich nur, ob ich den Namen der Klasse mit hineinnehme, da ich ihn im Beispiel über die Position des Objektes im Array bestimmen kann und dadurch einen inkonsistenten Zustand möglich mache (classifier.getClasses_ != classStatistics.className), bei anderen Benutzungsmöglichkeiten wäre der Name aber sicher nützlich..._


----------



## André Uhres (9. Sep 2009)

kirdie hat gesagt.:


> Ich weiss, dass alle 3 Möglichkeiten funktionieren...


Ich nehme dann die übersichtlichste, also die Klassendefinition


----------



## Verjigorm (9. Sep 2009)

kirdie hat gesagt.:


> Irgendwie finde ich es sinnlos, wegen 2 Integerwerten eine extra Klasse aufzumachen, die überhaupt nichts tut, als eben diese Werte zu speichern.



Nö, ist nicht sinnlos, sondern in vielen Fällen ratsam.
Stell dir mal vor, du musst dein "Datenkonstrukt" erweitern.
Ein neues Element oder eine neue Funktion.
Viel Spaß bei der Map, dem Array oder irgendwelchen Listen 
Von der Übersichtlichkeit mal ganz zu schweigen.

Was sich vielleicht noch anbieten würde wäre eine Klasse, die irgendeine Liste oder Map überschreibt, aber damit holt man sich sehr oft auch Probleme ins Haus.

mfg Verjigorm


----------



## bygones (9. Sep 2009)

kirdie hat gesagt.:


> Irgendwie finde ich es sinnlos, wegen 2 Integerwerten eine extra Klasse aufzumachen, die überhaupt nichts tut, als eben diese Werte zu speichern.


warum sich die Leute in einer OO umgebung immer scheuen Objekte zu nutzen.

Schau dir mal die 3 Versionen an - welche vermutest du ist wohl am verstaendlichsten ? int[][] ? mhm was steht im ersten index, was im zeiten... woche spaeter kommt noch ein dritter wert dazu und der ist diesmal ein double... mist

Map<String,Integer>[]... was speichert die ? warum ein array davon, [c]classStatistics_.get("occurrences")[/c] wer sichert dir zu dass es wirklich occurrences heisst ? und und und

man endet dann immer mit einer Loesung bei der man massig an Kommentaren braucht damit man selbst (und v.a. andere) verstehen warum man diese Loesung hat (was steht genau in der Map, was im array).

Einfachste, simpelste und sinnvollste Loesung ist ein Objekt zu haben mit sprechenden Namen...

Natuerlich haelt das nur irgendwelche Werte, aber dafuer sind solche ValueObjects da...



Verjigorm hat gesagt.:



			Was sich vielleicht noch anbieten würde wäre eine Klasse, die irgendeine Liste oder Map überschreibt, aber damit holt man sich sehr oft auch Probleme ins Haus.
		
Zum Vergrößern anklicken....

genau - deshalb lassen wir es lieber gleich v.a. von Maps / Collections zu erben !_


----------



## André Uhres (9. Sep 2009)

Verjigorm hat gesagt.:


> Von der Übersichtlichkeit mal ganz zu schweigen.


Übersichtlichkeit ist trotzdem das wichtigere Kriterium: ohne sie ist es schwer irgendwas zu erweitern


----------

