Collections Eigene Methodenzusicherung bei Collections als Parameter

oopexpert

Mitglied
Ich schrieb einen Testfall für eine Methode mit folgender Signatur:
Java:
String buildString(Collection<X> collection)
Ich bestückte die Methode mit einem HashSet und 2 Elementen. Nun hatte ich eine bestimmte Vorstellung, wie diese Methode arbeitet:

Gebe die Elemente innerhalb der Collection durch Komma getrennt aus.

Ich bin aber darauf reingefallen, dass HashSet natürlich die Einfügereihenfolge nicht betrachetet. Der Testfall schlug einmal fehl, einmal lief er durch, weil ich im Test nicht die beiden möglichen Ergebnisse berücksichtigte. Ein Kollege meinte, dass die Ausgabe natürlich abhängig ist von der Art der Collection, die übergeben wird und der nachfolgende Aufrufer auch keine Zusicherung der Reihenfolge benötigt.

Ich persönlich finde Methoden, die zufällig ein Element eines Ergebnisraums liefern, etwas seltsam. Deshalb hätte ich in jedem Fall das Ziel verfolgt, das Ergebnis des Rückgabewertes nicht abhängig zu machen vom Typ der konkreten Implementierung einer Collection, die der Aufrufer übergibt, unabhängig davon, ob der Aufrufer mit jedem Element des Ergebnisraumes zurechtkommt. Ich stelle mir da insbesondere die Fehlersuche und das Testen schwerer vor, zumal mit zunehmer Komplexität der Ergebnisraum stetig zunimmt.

Erster Gedanke: Unter der Voraussetzung, dass mir die Reihenfolge egal ist, was sie definitiv ist, würde ich intern den Typ X total ordnen, sodass das Ergebnis meiner Methode, egal in welcher Reihenfolge die Elemente aus der Collection kommen, immer gleich ist.

Zweiter Gedanke: Auch wenn mir die Reihenfolge egal ist, könnte ich die den Parameter weiter konkretisieren und dem Aufrufer zwingen, etwas zu übergeben wo er sich über die Ordnung der Elemente Gedanken machen muss (z.B. SortedSet).

Dritter Gedanke: Auch wenn mir die Reihenfolge egal ist, könnte ich den Parameter weiter konkretisieren und dem Aufrufer eine Abstraktionsstufe anbieten, wo er sich über die Reihenfolge Gedanken machen kann, aber nicht muss (Einfügereihenfolge, LinkedHashSet). Der Aufrufer hätte die Option, dass Ergebnis nach seinen Wünschen zu gestalten, oder er lässt es halt bleiben. In jedem Fall wäre für ihn das Verhalten manchmal vielleicht egal aber immer klar nachzuvollziehen. Nachteil wäre, dass man sich auf eine konkrete Implementierung festlegt, die aber aus meiner Sicht vollständige Transparenz und Nachvollziehbarkeit garantiert.

Vierter Gedanke: Einfach nur das Verhalten der Methode dokumentieren und beim Testen mit allen Ergebnissen aus dem Ergebnisraum rechnen.

Zusatzinformationen:
Das o.g. Beispiel ist eine Vereinfachung der Struktur, mit der ich es zu tun habe. Im Endeffekt wird objektorientiert versucht eine HQL-Abfrage aufzubauen (ähnlich der Criteria-Abfragen von Hibernate). Ich lasse mir als Tester der API den HQL-String geben, und der sieht halt jedesmal anders aus, wenn ich ein HashSet für bestimmte Definitionen verwende. Setzte man das HQL tatsächlich ab, würde man zwar jedes mal das gleiche Ergebnis bekommen, aber ich würde gerne isoliert den Aufbau des Query-Strings testen und nicht Hibernate, Hibernate-Mapping, Netzwerk, Datenbank und/oder Tabellenschema. Deshalb war die Idee, dass ich mir den HQL-String nach dem Aufbau der Query geben lasse und gegen den Erwartungswert vergleiche.

Beispiel:
Erwartungswert:
select o1 from DummyClassA o1 left join fetch o1.childrenBImpl o2 left join fetch o2.childrenCImpl o3 left join fetch o2.childrenDImpl o4
Tatsächlich:
select o1 from DummyClassA o1 left join fetch o1.childrenBImpl o2 left join fetch o2.childrenDImpl o3 left join fetch o2.childrenCImpl o4

Ich bin nicht ganz sicher, was man anstreben sollte. Über Anregungen würde ich mich freuen.
 
N

nillehammer

Gast
Wenn Dir die Reihenfolge wirklich egal ist, sollstest Du die Tests reihenfolgeunabhängig schreiben. Sprich mit equals() auf dem kompletten HQL-String geht es dann nicht, sondern eher mit contains() für jedes einzelne Element der übergebenen Collection<X>.
Dritter Gedanke: Auch wenn mir die Reihenfolge egal ist, könnte ich den Parameter weiter konkretisieren und dem Aufrufer eine Abstraktionsstufe anbieten, wo er sich über die Reihenfolge Gedanken machen kann, aber nicht muss (Einfügereihenfolge, LinkedHashSet). Der Aufrufer hätte die Option, dass Ergebnis nach seinen Wünschen zu gestalten, oder er lässt es halt bleiben. In jedem Fall wäre für ihn das Verhalten manchmal vielleicht egal aber immer klar nachzuvollziehen. Nachteil wäre, dass man sich auf eine konkrete Implementierung festlegt, die aber aus meiner Sicht vollständige Transparenz und Nachvollziehbarkeit garantiert.
Diese Möglichkeit hat Dein Aufrufer bei der jetzigen Methodensignatur schon. Wenn er sich über die Reihenfolge Gedanken machen will, kann er bereits jetzt eine List oder ein LinkedHashSet übergeben.

//Edit2
In JPA 2.0 gibt es übrigens jetzt auch eine Criteria-API. Vielleicht ist das eine Option für Dich.
 
Zuletzt bearbeitet von einem Moderator:

oopexpert

Mitglied
Wenn Dir die Reihenfolge wirklich egal ist, sollstest Du die Tests reihenfolgeunabhängig schreiben. Sprich mit equals() auf dem kompletten HQL-String geht es dann nicht, sondern eher mit contains() für jedes einzelne Element der übergebenen Collection<X>.

Das Problem ist, dass als Ergebnis eben ein String herauskommen soll. Den Syntax-Baum baut man selber auf. Das Generieren des HQL-String soll getestet werden.

Diese Möglichkeit hat Dein Aufrufer bei der jetzigen Methodensignatur schon. Wenn er sich über die Reihenfolge Gedanken machen will, kann er bereits jetzt eine List oder ein LinkedHashSet übergeben.

Die API hat mehr Effekte, als Aufrufer erwartet. Die Schnittstelle definiert Collection. Die Frage ist: Soll der Aufrufer die API sorglos verwenden können oder muss er sich über die Effekte konkreter Collection-Implementationen auf das Ergebnis Gedanken machen, die er der Methode übergibt? Er muss nämlich Implementations-Details kennen, um sich den Effekt zu erklären und ggf. für sich nutzen zu können.

//Edit2
In JPA 2.0 gibt es übrigens jetzt auch eine Criteria-API. Vielleicht ist das eine Option für Dich.

Grundsätzlich steht die auch zur Verfügung. Aber leider nicht unseren GUI-Entwicklern. Und man will den GUI-Extwicklern auch keine so mächtige Abfragesprache zur Verfügung stellen. Des Weiteren wirkt JPA bzw. HQL nicht auf dem Client in unserer Applikations-Server-Architektur. Deshalb so eine Eigenentwicklung. Ich habe in diesem Vorgehen keine konzeptionelle Hoheit. Ich soll nur ein paar Testfälle schreiben. :(
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Eigene Datenstruktur um eine Menge zu speichern Allgemeine Java-Themen 3
_user_q Was brauche ich, um eine eigene "Search for updates"-Funktion einzubauen? Allgemeine Java-Themen 1
pizza_dox_9999 Wie füge ich eine "eigene" ScriptEngine dem ScriptEngineManager? Allgemeine Java-Themen 3
E Input/Output Eigene Datei mit java öffnen Allgemeine Java-Themen 9
missy72 Klassen Eigene Klasse MessageWindow ähnlich der Alert Klasse Allgemeine Java-Themen 2
J Eigene Api erstellen und dann auch verwenden - Ordnerstruktur Allgemeine Java-Themen 1
RalleYTN Eigene ScriptEngine? Allgemeine Java-Themen 14
L Eigene Dependency Injections definieren? Allgemeine Java-Themen 4
K Eigene API erstellen? Allgemeine Java-Themen 13
T Best Practice Eigene GUI programmieren | MouseMotion Detection Allgemeine Java-Themen 3
M Eigene forEach()-Methode funktioniert nicht. Allgemeine Java-Themen 2
J eigene Java Bibliothek Allgemeine Java-Themen 2
M Output einer anderen/externen .jar in eigene JTextArea Allgemeine Java-Themen 4
B Klassen Eigene Klasse als Array benutzen Allgemeine Java-Themen 3
D Eigene/r Collection/Container Allgemeine Java-Themen 3
F Eigene .jar mit anderer .jar öffnen Allgemeine Java-Themen 7
X Eigene Annotation - mit Bedingung für ganze Klassen oder Methoden Allgemeine Java-Themen 2
H Best Practice Ideensuche: Flexibel hinzufügbare eigene Parser Allgemeine Java-Themen 6
T OOP Die eigene Bruchklasse Allgemeine Java-Themen 11
P Eigene Exception Klasse Allgemeine Java-Themen 7
J Java - Eigene DLL importieren Allgemeine Java-Themen 25
B JTable eigene Daten Add Methode Allgemeine Java-Themen 2
S OOP Problembereichsmodell: Bestehende Framework Klasse in eigene Klassenstruktur einbinden Allgemeine Java-Themen 9
E Eigene Exception Klasse erstellen Allgemeine Java-Themen 3
S Methoden Eigene Klasse als Rückgabewert Allgemeine Java-Themen 6
S eigene regEx schreiben Allgemeine Java-Themen 4
M Eigene Klasse verschlüsselt in Datei speichern Allgemeine Java-Themen 13
N Geodaten für eigene Routenplanung Allgemeine Java-Themen 5
M Problem beim schreiben einer eigene generische Klasse Hashtable Allgemeine Java-Themen 11
C Eigene Sounddateien schreiben Allgemeine Java-Themen 12
M Problem beim schreiben einer eigene generische Klasse LinkedList Allgemeine Java-Themen 34
M Best Practices Exception Handling für eigene library Allgemeine Java-Themen 8
M Eigene Factory Klasse Allgemeine Java-Themen 21
M eigene Klasse durch Composition mit java.io.File erweitern Allgemeine Java-Themen 3
S eigene Update Funktion Allgemeine Java-Themen 5
H2SO3- getMethods(): eigene methoden rausfinden Allgemeine Java-Themen 4
C eine eigene Javadoc erstelen Allgemeine Java-Themen 3
Kr0e Eigene RMI Implementierung Allgemeine Java-Themen 3
S Eigene Bibliothek Allgemeine Java-Themen 2
M Eigene Dateiendung? Allgemeine Java-Themen 3
M Plugins für eigene Programme Allgemeine Java-Themen 3
S Eigene Events feuern Allgemeine Java-Themen 3
S Instanz in einer Klasse erstellen, und dem Konstruktor die eigene Klasse mitgeben Allgemeine Java-Themen 4
A Eigene Java Plugins entwickeln - wie optimal? Allgemeine Java-Themen 14
R Eigene ArrayList vom Typ Short, Integer oder Double Allgemeine Java-Themen 4
U Eigene "Dining Philosopher" Interpretation weckt Philos nie auf Allgemeine Java-Themen 2
0x7F800000 Wovon eigene Events für spezialisierte JComponents ableiten? Allgemeine Java-Themen 2
SuperSeppel13 Packete der Java Bibliothek ins eigene Prjekt integrieren Allgemeine Java-Themen 4
P Eigene Klasse kopieren die auf sich selbst refferenziert Allgemeine Java-Themen 8
G Umgebungsvariabeln auslesen (Path, Temp, oder eigene) Allgemeine Java-Themen 2
T Eigene PID ermitteln! Allgemeine Java-Themen 3
D Icon für eigene Dateiendung Allgemeine Java-Themen 7
G Eigene "Speicherverwaltung" Allgemeine Java-Themen 5
H eigene Annotations Allgemeine Java-Themen 2
S eigene Klasse die JButton extended - als Liste! Allgemeine Java-Themen 6
D Performance: ArrayList vs. Array vs. "Eigene Liste&quot Allgemeine Java-Themen 8
A Eigene Wrapper-Klassen Allgemeine Java-Themen 2
J Kann eigene Klasse nicht ermitteln Allgemeine Java-Themen 4
M Wann verwendet man PropertyChangedEvents, wann eigene? Allgemeine Java-Themen 3
J OpenOffice.org Events in eigene Anwendung umleiten Allgemeine Java-Themen 4
U eigene Datenstruktur ArrayList<String> nach Object [][ Allgemeine Java-Themen 2
N Observer/Observable der JAVA-API od. eigene Implementierung Allgemeine Java-Themen 2
B eigene Klassen verkaufen Allgemeine Java-Themen 2
W eigene event-Klasse, event posten Allgemeine Java-Themen 2
reibi Eigene exception mit feld "serialVersionUID" Allgemeine Java-Themen 3
M Eigene .jar in anderes Programm importieren[eclipse] Allgemeine Java-Themen 6
T Eigene Libary Allgemeine Java-Themen 6
E Eigene Exception Allgemeine Java-Themen 11
Q Bibliotheken mit ins eigene Jar aufnehmen Allgemeine Java-Themen 4
M Eigene Exception Klasse Allgemeine Java-Themen 4
M eigene Objekte vergleichen Allgemeine Java-Themen 6
K log4j - eigene Info-Ausgaben Allgemeine Java-Themen 5
G Performance JDOM - DOM - eigene HashMap (SAX) Allgemeine Java-Themen 2
G JWindow verschieben bei mousedragged auf eigene titelleiste Allgemeine Java-Themen 3
N Methoden in eigene Dateien auslagern? Allgemeine Java-Themen 10
B Eigene Datentypen Allgemeine Java-Themen 5
G Brauche hilfe bei JMF: Wie eigene Streaming Data Source! Allgemeine Java-Themen 4
G eigene klassen die ein jar verwenden als neues jar erstellen Allgemeine Java-Themen 4
O Externe Jars in eigene JAr packen in Eclipse Allgemeine Java-Themen 5
R Updateprozedur ü. Internet fürs eigene Programm? Allgemeine Java-Themen 24
G eigene uhrzeit in einer java applikation führen Allgemeine Java-Themen 19
R Eigene Konfigurationsdatei für größere Projekte. Allgemeine Java-Themen 4
J Eigene Callback Methode? Allgemeine Java-Themen 3
S eigene evetns erstellen Allgemeine Java-Themen 5
K eigene GUI Komponente wird nicht angezeigt Allgemeine Java-Themen 3
D Eigene Classes aus anderen .java-Dateien Allgemeine Java-Themen 2
G Eigene PrintService Implementierung. Allgemeine Java-Themen 5
C Die Konsole ins eigene Programm einbauen Allgemeine Java-Themen 5
K jackson deserializer - Collections Allgemeine Java-Themen 6
D Collections.sort funktioniert nicht in exportierten .class Dateien Allgemeine Java-Themen 10
Hacer Generics & Collections Allgemeine Java-Themen 8
C Generic collections und static typing Allgemeine Java-Themen 4
J Collections, Locks und volatile ? Allgemeine Java-Themen 1
A Compiler-Fehler Woher kommt der NullPointer? (Collections & Iterator) Allgemeine Java-Themen 7
E Collections Collections die Subojekte einer Klasse enthält? Allgemeine Java-Themen 7
D generische Klasse für alle Maps (nicht Collections :-)) Allgemeine Java-Themen 11
B zwei-dimensionale Collections bzw. Array mit Indizes Allgemeine Java-Themen 3
Landei immutable Collections Allgemeine Java-Themen 27
J Collections in Instanzattributen als Kopie übergeben Allgemeine Java-Themen 4
J Rätselhaftes Verhalten von Collections Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben