Design / Implementierung

Status
Nicht offen für weitere Antworten.

kama

Top Contributor
Hallo,

ich habe eine SOAP Schnittstelle programmiert (http://jagosi.soebes.de).
Jetzt habe ich aber ein paar Fragen:

Die Schnittstelle selbst ist ja "flach", sprich viele Methoden in einer Klasse, die die Funktionalitäten darstellen:

Manche Methoden haben jetzt aber eine lange Reihe von Parameter.

Code:
JaGoSI gf = new JaGoSI ("http://gforge.domain/soap/index.php");
gf.login("username", "password");
..
JaGoSIArtifact[]  artifactList = jg.getArtifacts(Group, ArtifactType, assignedTo, state);
Ok. Ist ja schon ok....

Mein erster Weg zur "verschönerung" ist der Folgende:
Code:
JaGoSIGroup group = gf.getGroups().get("SVN Test Project");

JaGoSIArtifactType artifactType = gf.getGroups().get("SVN Test Project").getArtifactTypes().get("Bugs");
Das obige wollte ich auch mit "getArtifacts" machen, in etwa so:
Code:
JaGoSIArtifact[] artifacts = gf.getGroups()
    .get("SVN Test Project").getArtifactTypes()
    .get("Bugs").getAssigned()
    .get("ANY").getStates()
    .get("OPEN");

Das Problem was auftaucht ist, dass in der Klasse JaGoSIGroup nun eine Instanz (JaGoSI) gehalten werden muss, um die Verkettung durchführen zu können und ich muss selbstverständlich die Methode getArtifactTypes in die Klasse JaGoSIGroup entprechend implementieren. Auch wenn die Implementation lediglich aus einem Delegator besteht...
Das bedeutet, das ich in jeder Klasse den Delegator implementieren muss, damit die Verkettung wie oben gewünscht funktioniert.

Die Frage ist zum einen, ob es einen geschickten(ren) Weg gibt eine solche flache Schnittstelle besser (was auch immer das heißen mag) zu verpacken?

und zum anderen, ob es einen Besseren Weg gibt als mit den og. Delegatoren in den anderen Klassen.....


Vielen Dank im Voraus.
MfG
Karl Heinz Marbaise
 
kama hat gesagt.:
Manche Methoden haben jetzt aber eine lange Reihe von Parameter.

Code:
JaGoSI gf = new JaGoSI ("http://gforge.domain/soap/index.php");
gf.login("username", "password");
..
JaGoSIArtifact[]  artifactList = jg.getArtifacts(Group, ArtifactType, assignedTo, state);

Wo ist da die lange Reihe von Parametern? Meinst Du die vier Parameter für getArtifacts?

Ab dann versteh ich ehrlich gesagt nur noch Bahnhof, was allerdings auch gut an mir liegen kann.
 
das mit den Exemplarvariablen stimmt, wobei man schlecht sagen kann, wie aufwendig das ist,
ohne die andere Art zu kennen,

ich halte diese Verknüpfung von Exemplarvariablen jedenfalls spontan für eine ganz normale Struktur?


> und ich muss selbstverständlich die Methode getArtifactTypes in die Klasse JaGoSIGroup entprechend implementieren.
> Auch wenn die Implementation lediglich aus einem Delegator besteht...
> Das bedeutet, das ich in jeder Klasse den Delegator implementieren muss, damit die Verkettung wie oben gewünscht funktioniert.

das habe ich jetzt nicht verstanden,
zu welcher Klasse gehört denn getArtifactTypes() stattdessen?

die meisten Operationen scheinen mir nur die getter für die entsprechenden Exemplarvariablen zu sein,
dagegen gibts ja nix zu sagen,

und dann noch in den passenden Klassen etwas mehr Logik, solche Operationen jeweils nur einmal

wüßte jetzt gar nicht warum du überhaupt einen Delegator brauchst?
außer sowas wie get() auf die interne ArrayList oder so, das ist ja auch ganz normal
 
Hallo,

erst einmal vielen Dank für die Antwort...

NTB hat gesagt.:
Wo ist da die lange Reihe von Parametern? Meinst Du die vier Parameter für getArtifacts?
Ja das ist z.B. etwas was mich dann stört bzw. sehr unschön ist...

NTB hat gesagt.:
Ab dann versteh ich ehrlich gesagt nur noch Bahnhof, was allerdings auch gut an mir liegen kann.
Kann auch an mir liegen, dass ich mich nicht klar genug ausgedrückt habe.... sorry..

Mein obiges Code Beispiel hat noch einen Schönheitsfehler:
Code:
JaGoSIArtifact[] artifacts = gf.getGroups()
    .get("SVN Test Project").getArtifactTypes().get("Bugs")
    .getAssigned().get("ANY")
    .getStates().get("OPEN")
    .getArtifacts();
So sieht das Ganze etwas eleganter aus....eben das Problem, dass ich die Delegatoren implementieren muss....

MfG
Karl Heinz Marbaise
 
Hallo,

zuerst einmal vielen Dank für die Antwort. Hat auch ein wenig gedauert...

SlaterB hat gesagt.:
zu welcher Klasse gehört denn getArtifactTypes() stattdessen?

getGroups() gehört zur Klasse JaGoSI:
Code:
public HashMap<String, JaGoSIGroup> getGroups() {.......}

Hiest ist die Methode getArtifactTypes() aus der Klasse JaGoSIGroup:
Code:
public HashMap<String, JaGoSIArtifactType> getArtifactTypes() {
    return jagosi.getArtifactTypes(this);
}
Und genau diese Art von Methoden werden ich dann in verschiedenen anderen Klassen ebenfalls einbauen müssen...

Aber bis dato sehe ich nicht wirklich eine bessere Möglichkeit...

MfG
Karl Heinz Marbaise
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben