Hallöchen
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!
Deswegen frag ich ja, weil ich nicht weiß, wie’s geht Ich hab bisher immer mit globalen Variablen gearbeitet, bis mir gesagt wurde, dass die böse seien :o
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
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
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
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…
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);
}
}
}
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…
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]
Das muss dich ja nicht davon abhalten, es erstmal ohne Nutzereingabe zu machen, wenn das läuft kannst du die Nutzereingabe hinzufügen
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.