Schönheitsfrage, Ergebnisse von Klassenrechnungen per Return oder Referenz?
-
Morgen,
ich bastell mir gerade für die Uni eine Vektor-Klasse die über alle Rechenarten von Vektoren verfügen soll. Das wären
Summieren
Dividieren
Kreuzprodukt
Skalarprodukt
....Jetzt habe ich folgende Frage an Leute, die vielleicht aus Erfahrung sprechen können. Wie würdet ihr folgendes gestallten. Es geht um Rückgabearten und wie die Summanden übergeben werden...
//Bsp1 public void addVector(Vector v1, Vector result) { ... // Berechnung der Elemente von "result", "v1" und "this" wären die Summanden }
//Bsp2 public static void addVector(Vector v1, Vector v2, Vector result) { ... // Berechnung der Elemente von "result", v1 und v2 sind die Summanden }
Ich möchte keinen Vector als Return zurückgeben, da dieser auch noch einen Namen hat. Es sollen also wirklich nur die Elemente verändert werden. Keine Option ist folgendes:
//Bsp3 public void addVector(Vector v1, Vector v2) { .. // v1 und v2 sind die Summanden, das Ergebnis wird in "this" geschrieben }
Das Problem hier ist das viele Rechenarten keinen Vector sondern z.B. eine Zahl zurück geben und hier sollte man vielleicht bei einem gewissen Schema bleiben (z.B. alle static wie in Bsp 2)
Danke im Voraus
-
Und ich hab noch eine schöne Frage für euch.
Ich weiß, man benutzt in dem Fall exceptions aber damit beschäftigen wir uns noch net.
Wenn ich das Skalarprodukt berechnen möchte, soll er das Ergebnis (double) zurück geben, wenn die Elementanzahl identisch ist. (Beide Vektoren aus dem selben Raum,...)
Wenn nicht soll das Programm fürs erste nur eine Fehlermeldung mit Syste.out.pritln ausgeben. Dementsprechend habe ich in meiner Funktion jetzt in einem If-Bereich ein return something; in dem anderen aber nicht, also fehlt ein Rückgabewert. Wie werde ich das Problem los?
-
da dieser auch noch einen Namen hat.
Verstehe ich nicht. Normalerweise ruft man die Funktionalitaet so auf
vector v1, v2; v1.add(v2);
Du bist wohl noch nicht bei OOP angekommen. Auch ist der Methodenname addVector redundant, da addVector wahrscheinlich zu der Klasse Vector gehoert, da reicht dann ein einfaches add.
-
Also meine Vektoren sind intern noch mit Namen hinterlegt, ob das sinnvoll ist überleg ich mir später. Wenn ich es sein lasse, dann erleichtert sich das ganze weil ich dann einfach das Ergebnis einer Operation (Vektor) als Rückgabewert benutzen kann.
Edit: Weiteres Problem. Die Vektoren sind nicht alle aus dem selben Raum. Die Additions-Funktion würde das dann nicht mehr kontrollieren können. (eventuell weist die nem R4-Vektor nen R3-Vektor zu,...) Also lass ich das mit dem Rückgabewert definitiv.
Zu dem "v1.add(v2);"
Generell möchte ich keine Vektoren verlieren, solang es nicht gewollt ist.v1.add(v2); würde ja v1 und v2 addieren und dann das Ergebnis in v1 (oder v2) speichern. Aber was ist wenn ich den spaß in v3 haben möchte?
Das mi dem Redundant stimmt wohl, kann man ja noch ändern.
-
ruhig_brauner schrieb:
Zu dem "v1.add(v2);"
Generell möchte ich keine Vektoren verlieren, solang es nicht gewollt ist.v1.add(v2); würde ja v1 und v2 addieren und dann das Ergebnis in v1 (oder v2) speichern. Aber was ist wenn ich den spaß in v3 haben möchte?
Wieso solltest Du einen Vektor "verlieren"? Erstell doch einfach einen neuen in der Methode add.
public Vector add(Vector v) { return new Vector(this.x + v.x, this.y + v.y); }
-
Das Problem mit dem "verlieren" von Vektoren wäre nur da, wenn man die Funktion so schreibt, dass die Summe von v1 und v2 in einen der beiden Vektoren gespeichert werden. Mit Return geht es natürlich auch ohne aber dann habe ich wieder das Problem, dass man nicht innerhalb der Klasse kontrollieren kann, was da so addiert wird. (gleicher Raum, wie schon beschrieben)
Also momentan habe ich alle Funktionen, die einen Vektor zurück geben nach schema
public static void dosomething(Vector result, Vector v1, Vector v2)
{...}
geschrieben. So kann ich halt immer schön in der Klasse gucken, ob überhaupt addiert werden kann.Ausnahme sind die Funktionen, bei der das Ergebnis ne double ist, da arbeite ich einfach mit return,..
Najut, danke erstmal für die Hilfe
-
Also lass ich das mit dem Rückgabewert definitiv.
Deine Begruendungen sind einfach Schwachsinn. Pruefe doch einfach die Vorbedingung, dass die Vektoren aus dem gleichen Raum sind. Wenn nicht so gib eine Warnung aus und mache nix. Wo ist das Problem?
-
ruhig_brauner schrieb:
Ich möchte keinen Vector als Return zurückgeben,
Nicht den offensichtlichen Weg gehen? Das macht mich neugierig.
ruhig_brauner schrieb:
da dieser auch noch einen Namen hat.
Verstehe ich nicht.
-
Ja so langsam habt ihr mich ja auch überzeugt.
Also die Klasse hat die Attribute
double element[length];
int length;
String name;ob das Sinnvoll ist, weiß ich auch nicht mehr. Aber wegen dem Namen war es halt nicht möglich, den Vektor als Return zurück zu geben, da der Vektor sonnst einen neuen Namen bekommen hätte.
Wenn ich z.B. sagen würde (im Aufrufenden Programm)
v1 = v2.add(v3);
dann kann ich zwar gucken (in der Funktion) ob v2 und v3 die gleiche Dimension haben aber ob v1 auch in der selben Dimension ist weiß ich nicht.
Man braucht also eine äußere Konrolle um zu gucken ob v1, v2 und v3 in der selben Dimension sind. Mit
Vecotor.add(result, v1, v2);
wird in der Funktion selber geuckt, ob die Rechnung durchgeführt werden darf.
Aaaber ich glaube ihr habt mein Argument inzwischen ordentlich durch die Mangel genommen, was ja auch der Sinn des ganzen Threads war.
Danke für die Antworten