Lokale Variablen an nächste Methode

Hallöchen :slight_smile:
Einige kennen den Beitrag vielleicht schon aus dem JF, aber aufgrund der dortigen Situation probier ich’s jetzt hier (und kopier erstmal meine Frage :x)

Hallo zusammen,

ich habe mal wieder ein kleines Problem. Nachdem ich nun in allen Aufgaben immer mit globalen Variablen gearbeitet habe, wurde mir gesagt, dass es besser wäre mit lokalen Variablen zu arbeiten. Jetzt ist mein Problem, dass ich nicht weiß, wie ich eine lokal definierte Variable und ihren Wert in einer weiteren Prozedur verwenden kann.

Als Beispiel habe ich einen Währungsrechner:

public class Aufgabe_20 {
 
    /* ----------Hauptprozedur---------- */
    public static void main(String[] args) {
        abfrage();
        berechnung();
        ausgabe();
    }
    
    
    /* ----------Prozeduren---------- */
    public static void abfrage() {
        int auswahl = IO.readInt("0 = Umrechnung von Euro in DM, 1 = Umrechnung von DM in Euro: ");
        if (auswahl == 0) {
            double euro = IO.readDouble("Euro: ");
        } else if (auswahl == 1) {
            double dm = IO.readDouble("DM: ");
        }
    }
    
    
    public static void berechnung() {
        if (auswahl == 0) {
            double dm = euro * 1.95583;
        } else if (auswahl == 1) {
            double euro = dm / 1.95583;
        }
    }
    
    
    public static void ausgabe() {
        if (auswahl == 0) {
            System.out.println("DM: "+dm);
        } else if (auswahl == 1) {
            System.out.println("Euro: "+euro);
        }
    }
}

Wie kann ich jetzt die Variablen auswahl, euro und dm aus „abfrage“ in „berechnung“ und „ausgabe“ weiterverwenden?

Und warum sollte man eher lokale als globale Variablen nutzen?

Vielen Dank schonmal im Voraus!

Als Ansatz hatte ich nach ein paar Antworten folgendes:

Ich habe jetzt mal als Beispiel die Methode abfragenUndBerechnen gebaut:

public static double abfragenUndBerechnen (double auswahl, double euro, double dm) {
    auswahl = IO.readDouble("0 = DM in Euro, 1 = Euro in DM: ");
    if (auswahl == 0) {
        dm = IO.readDouble("DM: ");
        euro = dm / 1.95583;
        return euro;
    } else {
        euro = IO.readDouble("Euro: ");
        dm = euro * 1.95583;
        return dm;
    }
}

Jetzt hab ich dazu zwei Fragen:

Wie rufe ich die Methode jetzt in der main-Methode auf?
Wie verwende ich die return-Werte in der nächsten Methode weiter?

Es wäre total super, wenn mir hier jemand weiterhelfen könnte! :slight_smile:

warum gibst du sie aus Eingabe nicht einfach zurück und übergibst sie in den nächsten?

Deswegen frag ich ja, weil ich nicht weiß, wie’s geht :frowning: Ich hab bisher immer mit globalen Variablen gearbeitet, bis mir gesagt wurde, dass die böse seien :o

Ich würde es so machen:

public static double abfragenUndBerechnen (double auswahl, double wert) {
    auswahl = IO.readDouble("0 = DM in Euro, 1 = Euro in DM: ");
    if (auswahl == 0) {
        double euro = dm / 1.95583;
        return euro;
    } else {
        dm = euro * 1.95583;
        return dm;
    }
}

in der Main liest du zuerst die auswahl und den wert ein:

int auswahl = IO.readInt();
double wert = IO.readInt();

Diese Werte gibts du dann einfach aus:

System.out.println(abfragenUndBerechnen (auswahl, wert));

Du könntest zusätzlich noch eine getWährung() Methode vom Typ String erstellen:

private String getWährung(int auswahl)
 {
if(auswahl == 0) return "Euro";
if(auswahl == 1) return "DM";
}

Die Main sähe dann so aus:

int auswahl = IO.readInt();
double wert = IO.readInt();

System.out.println(getWährung(auswahl) + abfragenUndBerechnen (auswahl, wert));

Ich würde da eher eine Klasse mit Member Variablen erstellen (die sind dann in allen Funktionen verfügbar) und die noch statischen Methoden als Klassen Methoden ausführen :slight_smile:

Die Methoden “abfrage”, “berechnung” und “ausgabe” so zu kombinieren ist nicht unbedingt sinnvoll. Meistens ist es schon ein schlechtes Zeichen, wenn in einer Methode das Wort “und” vorkommen könnte/sollte. Die Tendenz sollte eher zu kleinen, kurzen Methoden gehen, die GENAU eine Aufgabe erfüllen. Deswegen war die ursprüngliche Struktur schon nicht verkehrt. “Schwierig” wird das eigentlich nur, weil schon in “abfrage” zwei Sachen gemacht werden - nämlicht ‘auswahl’ UND den Betrag abzufragen. Das weiter zu unterteilen wirkt vielleicht im ersten Moment umständlich oder gekünstelt, aber … überleg’ vielleicht mal, ob das dann in der main nicht ungefähr (!) so aussehen könnte:

int modus = abfrageModus(); 
double betrag = abfrageBetrag();
double ergebnis = berechne(betrag, modus);
ausgabe(ergebnis);

(Hätte z.B. auch den Vorteil, dass man es leicht dahingehend erweitern könnte, dass man EINmal den Modus abfragt und dann z.B. so oft Beträge eingeben und umrechnen lassen kann, bis mal als Betrag “0.0” eingibt. Bisher müßte man vor JEDER Umrechnung erneut sagen, in welche Richtung man umrechnen will. Aber das ist erstmal nur ein Detail).

EDIT: Hui, ja da kamen schon andere Antworten dazwischen - und die Einwände sind insofern berechtigt, dass eine eigene Klasse dafür sinnvoll sein könnte, und eine eigene (statische) Methode für sowas wie

public void eingabe()
{
    System.out.println("Gib was ein");
    return IOThing.readInput();
}

nicht soo sinnvoll scheint (oder, wie angedeutet, etwas “umständlich” ist). Aber das Grundprinzip, dass eine Methode möglichst nur eine, klar definierter Aufgabe haben sollte, gilt ganz allgemein.

Vielen Dank für die Vorschläge :slight_smile:
Das größte Problem ist eigentlich, dass ich’s relativ simpel brauche und dass ich bisher noch gar nicht objektorientiert programmiert habe und es deswegen erstmal so probieren muss :o

Schau dir vllt das hier mal an:
http://openbook.galileocomputing.de/javainsel/javainsel_05_001.html#dodtp7486d436-0724-4407-8e7b-b27c2225e1e8

Ich hab mir da jetzt irgendwie wieder was gebastelt und zwar folgendes:

public class Test {
	
	
	/* ----------Hauptmethode---------- */
	public static void main(String[] args) {
		abfrageModus(0);
		abfragenBetrag(0.0);
		berechnen(0.0);
		ausgeben();
	}
	
	
	/* ----------Methoden---------- */
	public static int abfrageModus (int auswahl) {
		auswahl = IO.readInt("0 = DM in Euro, 1 = Euro in DM: ");
		return auswahl;
	}
	
	
	public static double abfragenBetrag (double betrag) {
		if (auswahl == 0) {
			betrag = IO.readDouble("DM: ");
			return betrag;
		} else {
			betrag = IO.readDouble("Euro: ");
			return betrag;
		}
	}
	
	
	public static double berechnen (double ergebnis) {
		if (auswahl == 0) {
			ergebnis = betrag / 1.95583;
			return ergebnis;
		} else {
			ergebnis = betrag * 1.95583;
			return ergebnis;
		}
	}
	
	
	public static double ausgeben() {
		if (auswahl == 0) {
			System.out.println("Euro: "+ergebnis);
		} else {
			System.out.println("DM: "+ergebnis);
		}
	}
}

Das funktioniert leider immernoch nicht, ich weiß nur nicht genau, wie ich die Fehler jetzt rauskriege :o

public static void main(String[] args) 
{
    int modus = abfrageModus();
    ...
}

public static int abfrageModus () 
{
    int auswahl = IO.readInt("0 = DM in Euro, 1 = Euro in DM: ");
    return auswahl;
}

Der Modus/Asuwahl wird ja nicht ÜBERgeben, sondern soll ZURÜCKgegeben werden…

Mhmm, okay. Aber wie verfahre ich dann weiter, wenn ich’s jetzt so wie in deinem Beispiel machen würde?

Das ist schon arg zäh.

Wie gesagt, man könnte die Struktur in Frage stellen, ob es diese Methoden denn so geben sollte, oder ob es denn nicht geschicktere oder anderweitig “bessere” Lösungen gäbe, aber EINE Möglichkeit wäre

public class Test {


    /* ----------Hauptmethode---------- */
    public static void main(String[] args) {
        int modus= abfrageModus();
        double betrag = abfragenBetrag(modus);
        double ergebnis = berechnen(modus, betrag);
        ausgeben(modus, ergebnis);
    }


    /* ----------Methoden---------- */
    public static int abfrageModus () {
        int auswahl = IO.readInt("0 = DM in Euro, 1 = Euro in DM: ");
        return auswahl;
    }


    public static double abfragenBetrag (int modus) {
        if (modus == 0) {
            double betrag = IO.readDouble("DM: ");
            return betrag;
        } else {
            double betrag = IO.readDouble("Euro: ");
            return betrag;
        }
    }


    public static double berechnen (int modus, double betrag) {
        if (modus == 0) {
            double ergebnis = betrag / 1.95583;
            return ergebnis;
        } else {
            double ergebnis = betrag * 1.95583;
            return ergebnis;
        }
    }


    public static void ausgeben(int modus, double ergebnis) {
        if (modus == 0) {
            System.out.println("Euro: "+ergebnis);
        } else {
            System.out.println("DM: "+ergebnis);
        }
    }
}

Okay, jetzt hab ich’s verstanden, dankeschöööön :slight_smile:

Noch ein kleiner Denkanstoß:

Streng genommen ist Java Klassenorientiert was viele Objektorientierte Aspekte impliziert. Reine Objektorientierung hat zunächst nichts mit Klassen zu tun (z.B. Javascript). Kann nicht schaden, wenn du zu dem Thema etwas liest und dein Beispiel mal entsprechend umbaust.

Edit: Bin gerade schockiert, dass auf Wikipedia unter Objektorientierung steht dies impliziere zwingend Klassen und so weiter o.O … Bin da zwar nicht aktiv aber mir juckts gerade gewaltig … Mannomann…

This solution was brought to you by the Single Responsibility Principle.

black_droid, wie wärs wenn du erstmal einfach anfängst? Wie dir auch im JF schon gesagt wurde.
Eine Main die eine Methode aufruft und dort einfach einen String zurückgegeben (zum Beispiel).
Ohne Nutzereingaben etc

[QUOTE=MiMi]black_droid, wie wärs wenn du erstmal einfach anfängst? Wie dir auch im JF schon gesagt wurde.
Eine Main die eine Methode aufruft und dort einfach einen String zurückgegeben (zum Beispiel).
Ohne Nutzereingaben etc[/QUOTE]

Ich hab’s doch jetzt hingekriegt?! :o :smiley:

Ja nachdem Marco dir eine (komplette) Lösung gepostet hat.
Einfach nur zum Verständnis ist es halt besser, erstmal einfach anzufangen :slight_smile:

Naja, das Problem der Aufgabenstellung war, dass es mit Nutzereingabe erfolgen sollte :confused:

Das muss dich ja nicht davon abhalten, es erstmal ohne Nutzereingabe zu machen, wenn das läuft kannst du die Nutzereingabe hinzufügen :slight_smile:
Vorallem wenn man sich noch nicht so gut auskennt (wie das einfache übergeben von Parametern), sollte man erstmal mit kleinen Teilproblemen beginnen und dann erst das Programm weiter erweitern.

Nur ein gutgemeinter Tipp :slight_smile: