Frage zu get-Methode

ChristianS
Neuling
Neuling
Beiträge: 7
Registriert: 1. Okt 2007 20:13

Frage zu get-Methode

Beitrag von ChristianS » 7. Okt 2007 15:13

Hi, ich habe da ein paar Fragen zu der Get-Methode...Es geht speziell um die Vektoren-Aufgaben.

1. Es wird eine integer Variable (int elt) als Parameter übergeben. Ich sehe aber nirgendwo in dem Vektor-Programm wo diese Variable initiialiesiert wird. Irgendwie leuchtet mir das nicht so ganz ein...Ist das vielleicht irgendwas spezielles was bei jeder get-Methode dabe sein muss ??? Oder was hat es damit auf sich ?


2. In der Methode kommen dann if-Anweisungen. Ich interpretiere das so : Wenn elt 1 entspricht dann soll er die Varaible x zurückgeben. Wenn es 2 ist soll er die Variable y zurückgeben. Hier ist meine erste Frage : Bei dem Vektor soll er doch eigtl alle 3 Werte zurückgeben. Also x, y, und z. Wieso dann überhaupt eine If-Abfrage ? Ich könnte doch auch einfach folgende Methode schreiben :

public int get(int x, int y, int z) {
return x;
return y;
return z;
}

Für z wird dann gar keine if-else-Abfrage mehr gemacht. Logisch wäre es doch gewesen, wenn man auch hier eine If-Abfrage einbauen würde. Also quasi :
if (elt ==3) return z.
Kann mir das einer erklären ?

Danke für eure Antworten schonmal im vorraus :wink:

Christoph B
Computerversteher
Computerversteher
Beiträge: 370
Registriert: 15. Okt 2006 18:28
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Christoph B » 7. Okt 2007 15:52

Ohne jetz die genaue Aufgabe zu kennen:

Wenn du in der Methoden Signatur (public void IchBinEineMethode(int x) )
eine Variable als Parameter hast, gilt sie als initialisiert, mit dem Wert der Variable die du dieser Methode beim Aufrufen übergibst
(meinObject.IchBinEineMethode(5))
bzw bei Objekten wäre es nur der Verweis der übergeben wird.

Zum Andren:
public int get(int x, int y, int z) {
return x;
return y;
return z;
}
wird so nicht funktionieren, weil du nur EINEN Wert zurückgeben kannst, in dem Fall würde die Methode IMMER x zurückliefern, return y und return z wärend nicht erreichbarer code

Prinzipiell sind GET und SET methoden GANZ NORMALE METHODEN, das einzige was sie in gewisser weise "besonders" macht ist wie sie eigentlich IMMER implementiert werden:
Um Werte eines Objectes zu setten oder halt zu getten, deshalb heißen sie Set und Get Methoden, sonst aus keinem andrem Grund ;)

Benutzeravatar
kahler
Computerversteher
Computerversteher
Beiträge: 351
Registriert: 17. Apr 2004 11:24

Re: Frage zu get-Methode

Beitrag von kahler » 7. Okt 2007 15:57

ChristianS hat geschrieben:...Es wird eine integer Variable (int elt) als Parameter übergeben. Ich sehe aber nirgendwo in dem Vektor-Programm wo diese Variable initiialiesiert wird...
In der Klasse VektorHauptProgramm wird get() in der Methode addieren() direkt mit Werten aufgerufen. Die Werte sind hartcodiert in dieser Methode enthalten.
Wie du ja schon richtig bemerkt hast ist int elt ein Parameter der Methode get() (und damit eigentlich auch keine Variable wenn mans genau nimmt) und muss daher nicht nochmal explizit irgendwo initialisiert werden.
Alles was du an Parametern bekommst kannst du direkt in der entsprechenden Methode verwenden.
ChristianS hat geschrieben:...Ist das vielleicht irgendwas spezielles was bei jeder get-Methode dabe sein muss ?...
Das ist eher was spezielles, was bei dieser Methode dabei ist.
Generell haben Getter eigentlich keine Parameter und Setter keinen Rückgabewert (void).
ChristianS hat geschrieben:...In der Methode kommen dann if-Anweisungen. Ich interpretiere das so : Wenn elt 1 entspricht dann soll er die Varaible x zurückgeben. Wenn es 2 ist soll er die Variable y zurückgeben...
Korrekt.
ChristianS hat geschrieben:...Bei dem Vektor soll er doch eigtl alle 3 Werte zurückgeben. Also x, y, und z. Wieso dann überhaupt eine If-Abfrage ? Ich könnte doch auch einfach folgende Methode schreiben :

public int get(int x, int y, int z) {
return x;
return y;
return z;
}
Bei deiner Methode würde immer der erste Parameter (x) zurückgegeben. Bei einem Return-Statement "springt" der Interpreter wieder zurück zur aufrufenden Methode und alles weitere wird nicht mehr beachtet.
Zusätzlich übergibst du in deiner Parameterliste den Wert x, der dann ohne weitere Behandlung/Verarbeitung direkt wieder im return Statement auftaucht.
Du könntest alternativ 3 Methoden (getX(), getY(), getZ()) schreiben, die dann jeweils den Wert der einzelnen Komponenten liefern.
ChristianS hat geschrieben:...Für z wird dann gar keine if-else-Abfrage mehr gemacht. Logisch wäre es doch gewesen, wenn man auch hier eine If-Abfrage einbauen würde. Also quasi :
if (elt ==3) return z...
Für die letzte Komponente ist keine Abfrage mehr nötig, weil diese ja die Einzige ist, die noch übrig bleibt (vergleiche auch meine Ausführungen zu return weiter oben). Wenn du also nicht Komponente 1 oder 2 ausgewählt hast, dann willst du wohl Komponente 3 haben (grob gesprochen).

Man könnte sich jetzt Gedanken über eine eventuelle Fehlerbehandlung mit den entsprechenden Mitteln, die Java zur Verfügung stellt, machen, wenn die Eingabe elt größer 3 oder kleiner 1 ist. Aber das ist für die Programme hier wohl nicht unbedingt nötig und würde auch den Rahmen eines Einführungskurses sprengen.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GIT d- s:+ a-- C++++ UL++++$ P+>+++ L++ E--- W+++$ N+ o+ K? w O M V- PS+ PE++ Y+ PGP- t--- 5--- X-- R tv b DI++ D+ G e h r y?+
------END GEEK CODE BLOCK------

Christoph B
Computerversteher
Computerversteher
Beiträge: 370
Registriert: 15. Okt 2006 18:28
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Christoph B » 7. Okt 2007 15:59

oh, da hat sich jemand noch mehr mühe gemacht ^^

Yen
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 184
Registriert: 2. Sep 2004 16:54
Wohnort: Langen

Beitrag von Yen » 7. Okt 2007 16:01

Parameter müssen nicht initialisiert werden, der Variable wird einfach der übergebene Wert zugewiesen. Z.B. myVektor.get(2); ruft die Methode get mit dem Parameter 2 auf, d.h. in elt steht die 2.

Methoden können grundsätzlich nur einen "Wert" zurückgeben. Das Wert steht absichtlich in Anführungszeichen, da es eigentlich Objekt heißen müsste, möchte man in einer Methode mehrere Werte zurückgeben benötigt man ein Objekt einer Klasse, die diese Werte kapselt und kann dann dieses Objekt zurückgeben.

Hat eine Methode einen Rückgabetyp muss sie in jedem Fall einen Wert dieses Typs zurückgeben, d.h. bei Fallunterscheidungen (Wie zum Beispiel if) muss entweder ausserhalb dieser Fallunterscheidung noch ein return existieren oder in jedem Pfad inkl. else-Zweig muss ein return sein.
Daher würde ein if (elt ==3) return z; nicht funktionieren, da im Fall elt ist 4 kein return erreicht wird, eigentlich sollte elt zwar nie den Wert 4 haben aber es ist theoretisch möglich, dass irgendwer der diese Methode benutzt ihr doch den Wert 4 übergibt.
Allerdings wird nach dem Aufruf eines return Befehls die Methode automatisch beendet, dadurch kann man auf das letzte if verzichten, da im Fall elt ist 1 oder 2 dieser Punkt nie erreicht wird.
Hier muss man sich halt überlegen, wie man mit fehlerhaften Eingaben umgehen will. wenn man einfach return z; benutzt wird bei allen Eingaben die nicht 1 oder 2 sind einfach das dritte Element zurückgegeben. Möchte man stattdessen immer das erste Element zurückgeben muss man nur die Reihenfolge ändern. Evtl. macht es aber Sinn bei fehlerhaften Aufrufen immer 0 zurück zu geben, dafür benötigt man wieder das dritte if und ergänzt das ganze noch um ein return 0;.

ChristianS
Neuling
Neuling
Beiträge: 7
Registriert: 1. Okt 2007 20:13

Beitrag von ChristianS » 7. Okt 2007 16:04

Vielen Dank für die Antwort, das erklärt dann ja eigtl. alles. Kannte das bisher aus anderen Sprachen nur so dass ich mehr als einen Wert zurückgeben kann :) Erklärt dann ja auch wozu die if-Anweisungen sind. Werden also quasi als Trick verwendet um mehrere Daten zurückzugeben, jenachdem welchen Wert das elt hat.

Benutzeravatar
kahler
Computerversteher
Computerversteher
Beiträge: 351
Registriert: 17. Apr 2004 11:24

Beitrag von kahler » 7. Okt 2007 16:49

ChristianS hat geschrieben:Vielen Dank für die Antwort, das erklärt dann ja eigtl. alles. Kannte das bisher aus anderen Sprachen nur so dass ich mehr als einen Wert zurückgeben kann...
In welchen Sprachen geht das denn?
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GIT d- s:+ a-- C++++ UL++++$ P+>+++ L++ E--- W+++$ N+ o+ K? w O M V- PS+ PE++ Y+ PGP- t--- 5--- X-- R tv b DI++ D+ G e h r y?+
------END GEEK CODE BLOCK------

Tillmann
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 131
Registriert: 5. Dez 2003 21:27
Wohnort: Frankfurt

Beitrag von Tillmann » 7. Okt 2007 19:01

kahler hat geschrieben:
ChristianS hat geschrieben:Vielen Dank für die Antwort, das erklärt dann ja eigtl. alles. Kannte das bisher aus anderen Sprachen nur so dass ich mehr als einen Wert zurückgeben kann...
In welchen Sprachen geht das denn?
Manche Sprachen unterstützen explizit die Rückgabe mehrerer Werte einer Funktion, zum Beispiel viele Lisp-Dialekte oder die Skriptsprache von Matlab.

Code: Alles auswählen

Lisp:

(defun get-three-values ()
    (values 1 2 3))

Matlab:

(x, y, z) = function ()
x = 1
y = 2
z = 3
Andere Sprachen erlauben es, Datenstrukturen wie Arrays oder Listen anonym zu erstellen. Das sieht dann so ähnlich aus wie die Rückgabe mehrerer Werte. Beispiele dafür sind c und seine "Nachkommen" (anonyme Arrays) und die meisten funktionalen Sprachen (anonyme Listen). c# hat für das Erstellen einer anonymen Aufzählung sogar spezielle Syntax eingebaut:

Code: Alles auswählen

c:

int[3] getThreeValues() {
    return {1, 2, 3};
}

python:

def getThreeValues():
    return [1, 2, 3]

haskell:

getThreeValues = [1, 2, 3]

c#:

IEnumeration<int> getThreeValues() {
  yield return 1;
  yield return 2;
  yield return 3;
}

Manche Sprachen ermöglichen eine Form von Nicht-Determinismus (das bedeutet in diesem Zusammenhang meist: eine Berechnung kann nicht nur einen Wert haben, sondern es werden verschiedene Ergebnisse probiert, bis ein geeignetes gefunden wird), entweder direkt wie Prolog, oder indirekt wie z.B. Haskell durch die Listen-Monade. (Das c#-Beispiel könnte man auch unter dieser Rubrik einordnen).

Code: Alles auswählen

Prolog:

eval(getThreeValues, 1).
eval(getThreeValues, 2).
eval(getThreeValues, 3).

Haskell:

getThreeValues = return 1 `mplus`
                 return 2 `mplus` 
                 return 3
Schließlich gibt es sogar Sprachen, die sich speziell mit Ausdrücken beschäftigen, die mehrere Werte haben können, zum Beispiel SQL.

Antworten

Zurück zu „Archiv“