Wir haben uns vorgenommen, dass wir Duplikate im Code vermeiden möchten. Im Programm UserDialog
listen wir dem User an zwei Stellen im Code seine Auswahlmöglichkeiten auf:
// Menue Anzeigen System.out.println(); System.out.println("=============================================="); System.out.println("Was möchten Sie mit dieser Applikation machen?"); System.out.println("Wählen Sie 'r' für Taschenrechner"); System.out.println("Wählen Sie 'h' für Hasen und Hühner Problem"); System.out.println("Wählen Sie 's' für Soccermanager"); System.out.println("Wählen Sie 'x' um das Programm zu beenden!"); System.out.print(">> ");
Wir möchten diesen Programmteil nun in eine externe Methode packen. Wir arbeiten uns also durch unsere 3 Schritte durch:
private
System.out.print
gibt aber keinen Wert zurück, also void
printMenue
, printDialog
, etc.()
private void printMenue(){}
Ein kurzer beschreibender Satz.
/** * Diese Methode zeigt dem User das Menue an. */ private void printMenue(){}
import java.util.Scanner; /** * UserDialog-Klasse um die Verwendung von Methoden zu üben * * @author Kevin Maurizi * @since 2042.01.01 * @version 0.1 */ public class UserDialog { static Scanner scanner; public UserDialog(){ scanner = new Scanner(System.in); } public static void main(String[] args) { UserDialog userDialog = new UserDialog(); userDialog.run(); scanner.close(); } private void run() { char auswahl; double zahl1, zahl2, summe; int shirtNo, countRating; double totalRating, rating; int animals, legs, rabbit, chicken, maxLegs, minLegs; System.out.println("Lieber Benutzer, herzlich willkommen zu diesem Programm"); printMenue(); auswahl = scanner.nextLine().charAt(0); while (auswahl != 'x'){ if(auswahl == 'r'){ System.out.println("Bitte geben Sie die erste Zahl ein"); while(!scanner.hasNextDouble()){ System.out.println("Bitte eine Zahl eingeben"); scanner.nextLine(); } zahl1 = scanner.nextDouble(); scanner.nextLine(); System.out.println("Bitte geben Sie die zweite Zahl ein"); while(!scanner.hasNextDouble()){ System.out.println("Bitte eine Zahl eingeben"); scanner.nextLine(); } zahl2 = scanner.nextDouble(); scanner.nextLine(); summe = zahl1 + zahl2; System.out.println("Die Summe ist: " + summe); }else if(auswahl == 'h'){ System.out.print("Anzahl Tiere >"); while(!scanner.hasNextInt()){ System.out.print("Bitte eine Zahl eingeben. Anzahl Tiere >"); scanner.nextLine(); } animals = scanner.nextInt(); scanner.nextLine(); maxLegs = animals * 4; minLegs = animals *2; System.out.print("Anzahl Beine >"); while(!scanner.hasNextInt()){ System.out.print("Bitte eine Zahl eingeben. Anzahl Beine >"); scanner.nextLine(); } legs = scanner.nextInt(); scanner.nextLine(); while(legs > maxLegs || legs < minLegs){ System.out.print("Anzahl Beine ungültig, bitte erneut eingeben (Min: "+minLegs +" Max: " + maxLegs +") >"); while(!scanner.hasNextInt()){ System.out.print("Bitte eine Zahl eingeben. Anzahl Beine >"); scanner.nextLine(); } legs = scanner.nextInt(); scanner.nextLine(); } rabbit = animals; chicken = 0; while ((rabbit * 4 + chicken * 2) > legs) { rabbit = rabbit - 1; chicken = chicken + 1; } System.out.println("Es sind " + rabbit + " Hasen und " + chicken + " Huehner"); }else if(auswahl == 's'){ System.out.print ("Trikotnummer (1 - 99 / 0=Ende) >"); shirtNo = scanner.nextInt (); scanner.nextLine(); while (shirtNo != 0) { totalRating = 0.0; countRating = 0; System.out.print ("Bewertung (1.0 - 6.0 / 0=Ende) >"); rating = scanner.nextDouble (); scanner.nextLine(); while (rating > 0) { totalRating = totalRating + rating; countRating = countRating + 1; System.out.print ("Bewertung (1.0 - 6.0 / 0=Ende) >"); rating = scanner.nextDouble (); scanner.nextLine(); } System.out.println ("Spieler: " + shirtNo + " / Durchschnitt: " + (totalRating / countRating)); System.out.print ("Trikotnummer (1 - 99 / 0=Ende) >"); shirtNo = scanner.nextInt (); scanner.nextLine(); } }else{ System.out.println("Buchstabe nicht bekannt, bitte erneut eingeben!"); } printMenue(); auswahl = scanner.nextLine().charAt(0); } } /** * Diese Methode zeigt dem User das Menue an. */ private void printMenue(){ System.out.println(); System.out.println("=============================================="); System.out.println("Was möchten Sie mit dieser Applikation machen?"); System.out.println("Wählen Sie 'r' für Taschenrechner"); System.out.println("Wählen Sie 'h' für Hasen und Hühner Problem"); System.out.println("Wählen Sie 's' für Soccermanager"); System.out.println("Wählen Sie 'x' um das Programm zu beenden!"); System.out.print(">> "); } }
Um die Übersichtlichkeit des Codes zu erhöhen, lagern wir die Unterprogramme (Rechner, Hasen- und Hühnerproblem und Soccermanager) in eigene Methoden aus.
Sichtbarkeit | Rückgabewert | Name | Parameter | Methodenkopf | |
---|---|---|---|---|---|
Rechner | private | void | rechner | () | private void rechner(){} |
Hasen & Hühner | private | void | hasenUndHuehner | () | private void hasenUndHuehner(){} |
Soccermanager | private | void | soccermanager | () | private void soccermanager(){} |
Methodenkopf | |
---|---|
Rechner | Verrechnet zwei Werte zu einer Summe |
Hasen & Hühner | Löst das Hasen- und Hühnerproblem |
Soccermanager | Anhand der Spielernummern können Bewertungen vergeben werden |
import java.util.Scanner; /** * UserDialog-Klasse um die Verwendung von Methoden zu üben * * @author Kevin Maurizi * @since 2042.01.01 * @version 0.1 */ public class UserDialog { static Scanner scanner; public UserDialog(){ scanner = new Scanner(System.in); } public static void main(String[] args) { UserDialog userDialog = new UserDialog(); userDialog.run(); scanner.close(); } private void run() { char auswahl; System.out.println("Lieber Benutzer, herzlich willkommen zu diesem Programm"); printMenue(); auswahl = scanner.nextLine().charAt(0); while (auswahl != 'x'){ if(auswahl == 'r'){ rechner(); }else if(auswahl == 'h'){ hasenUndHuehner(); }else if(auswahl == 's'){ soccermanager(); }else{ System.out.println("Buchstabe nicht bekannt, bitte erneut eingeben!"); } printMenue(); auswahl = scanner.nextLine().charAt(0); } } /** * Diese Methode zeigt dem User das Menue an. */ private void printMenue(){ System.out.println(); System.out.println("=============================================="); System.out.println("Was möchten Sie mit dieser Applikation machen?"); System.out.println("Wählen Sie 'r' für Taschenrechner"); System.out.println("Wählen Sie 'h' für Hasen und Hühner Problem"); System.out.println("Wählen Sie 's' für Soccermanager"); System.out.println("Wählen Sie 'x' um das Programm zu beenden!"); System.out.print(">> "); } /** * Verrechnet zwei Werte zu einer Summe */ private void rechner(){ double zahl1, zahl2, summe; System.out.println("Bitte geben Sie die erste Zahl ein"); while(!scanner.hasNextDouble()){ System.out.println("Bitte eine Zahl eingeben"); scanner.nextLine(); } zahl1 = scanner.nextDouble(); scanner.nextLine(); System.out.println("Bitte geben Sie die zweite Zahl ein"); while(!scanner.hasNextDouble()){ System.out.println("Bitte eine Zahl eingeben"); scanner.nextLine(); } zahl2 = scanner.nextDouble(); scanner.nextLine(); summe = zahl1 + zahl2; System.out.println("Die Summe ist: " + summe); } /** * Löst das Hasen- und Hühnerproblem */ private void hasenUndHuehner(){ int animals, legs, rabbit, chicken, maxLegs, minLegs; System.out.print("Anzahl Tiere >"); while(!scanner.hasNextInt()){ System.out.print("Bitte eine Zahl eingeben. Anzahl Tiere >"); scanner.nextLine(); } animals = scanner.nextInt(); scanner.nextLine(); maxLegs = animals * 4; minLegs = animals *2; System.out.print("Anzahl Beine >"); while(!scanner.hasNextInt()){ System.out.print("Bitte eine Zahl eingeben. Anzahl Beine >"); scanner.nextLine(); } legs = scanner.nextInt(); scanner.nextLine(); while(legs > maxLegs || legs < minLegs){ System.out.print("Anzahl Beine ungültig, bitte erneut eingeben (Min: "+minLegs +" Max: " + maxLegs +") >"); while(!scanner.hasNextInt()){ System.out.print("Bitte eine Zahl eingeben. Anzahl Beine >"); scanner.nextLine(); } legs = scanner.nextInt(); scanner.nextLine(); } rabbit = animals; chicken = 0; while ((rabbit * 4 + chicken * 2) > legs) { rabbit = rabbit - 1; chicken = chicken + 1; } System.out.println("Es sind " + rabbit + " Hasen und " + chicken + " Huehner"); } /** * Anhand der Spielernummern können Bewertungen vergeben werden */ private void soccermanager() { int shirtNo, countRating; double totalRating, rating; System.out.print("Trikotnummer (1 - 99 / 0=Ende) >"); shirtNo = scanner.nextInt(); scanner.nextLine(); while (shirtNo != 0) { totalRating = 0.0; countRating = 0; System.out.print("Bewertung (1.0 - 6.0 / 0=Ende) >"); rating = scanner.nextDouble(); scanner.nextLine(); while (rating > 0) { totalRating = totalRating + rating; countRating = countRating + 1; System.out.print("Bewertung (1.0 - 6.0 / 0=Ende) >"); rating = scanner.nextDouble(); scanner.nextLine(); } System.out.println("Spieler: " + shirtNo + " / Durchschnitt: " + (totalRating / countRating)); System.out.print("Trikotnummer (1 - 99 / 0=Ende) >"); shirtNo = scanner.nextInt(); scanner.nextLine(); } } }
Wir haben noch duplizierten Code in unserer Anwendung.
Sowohl in der Methode rechner() wie auch in der Methode hasenUndHuehner() machen wir eine Inputvalidierung. Wir überprüfen mehrfach, ob ein int
respektive ein double
eigegeben wurde. Wir können diese Funktionalität auslagern und so einfach wiederverwenden.
Sichtbarkeit | Rückgabewert | Name | Parameter | Methodenkopf | |
---|---|---|---|---|---|
double-Validierung | private | double | getValidDouble | () | private double getValidDouble(){} |
int-Validierung | private | int | getValidInt | () | private int getValidInt(){} |
Methodenkopf | @return | |
---|---|---|
double-Validierung | Prüft ob ein Double eingegeben wurde, wenn nicht, wird ein Fehler ausgegeben und erneut eingelesen. | gibt das eingelesene Double zurück. |
int-Validierung | Prüft ob ein Int eingegeben wurde, wenn nicht, wird ein Fehler ausgegeben und erneut eingelesen. | gibt das eingelesene Int zurück. |
Beispiel:
/** * Prüft ob ein double eingegeben wurde, wenn nicht, wird ein Fehler ausgegeben und erneut eingelesen. * @return gibt das eingelesene Double zurück. */ private double getValidDouble(){}
import java.util.Scanner; /** * UserDialog-Klasse um die Verwendung von Methoden zu üben * * @author Kevin Maurizi * @since 2042.01.01 * @version 0.1 */ public class UserDialog { static Scanner scanner; public UserDialog(){ scanner = new Scanner(System.in); } public static void main(String[] args) { UserDialog userDialog = new UserDialog(); userDialog.run(); scanner.close(); } private void run() { char auswahl; System.out.println("Lieber Benutzer, herzlich willkommen zu diesem Programm"); printMenue(); auswahl = scanner.nextLine().charAt(0); while (auswahl != 'x'){ if(auswahl == 'r'){ rechner(); }else if(auswahl == 'h'){ hasenUndHuehner(); }else if(auswahl == 's'){ soccermanager(); }else{ System.out.println("Buchstabe nicht bekannt, bitte erneut eingeben!"); } printMenue(); auswahl = scanner.nextLine().charAt(0); } } /** * Diese Methode zeigt dem User das Menue an. */ private void printMenue(){ System.out.println(); System.out.println("=============================================="); System.out.println("Was möchten Sie mit dieser Applikation machen?"); System.out.println("Wählen Sie 'r' für Taschenrechner"); System.out.println("Wählen Sie 'h' für Hasen und Hühner Problem"); System.out.println("Wählen Sie 's' für Soccermanager"); System.out.println("Wählen Sie 'x' um das Programm zu beenden!"); System.out.print(">> "); } /** * Verrechnet zwei Werte zu einer Summe */ private void rechner(){ double zahl1, zahl2, summe; System.out.println("Bitte geben Sie die erste Zahl ein"); zahl1 = getValidDouble(); System.out.println("Bitte geben Sie die zweite Zahl ein"); zahl2 = getValidDouble(); summe = zahl1 + zahl2; System.out.println("Die Summe ist: " + summe); } /** * Löst das Hasen- und Hühnerproblem */ private void hasenUndHuehner(){ int animals, legs, rabbit, chicken, maxLegs, minLegs; System.out.print("Anzahl Tiere >"); animals = getValidInt(); maxLegs = animals * 4; minLegs = animals *2; System.out.print("Anzahl Beine >"); legs = getValidInt(); while(legs > maxLegs || legs < minLegs){ System.out.print("Anzahl Beine ungültig, bitte erneut eingeben (Min: "+minLegs +" Max: " + maxLegs +") >"); legs = getValidInt(); } rabbit = animals; chicken = 0; while ((rabbit * 4 + chicken * 2) > legs) { rabbit = rabbit - 1; chicken = chicken + 1; } System.out.println("Es sind " + rabbit + " Hasen und " + chicken + " Huehner"); } /** * Anhand der Spielernummern können Bewertungen vergeben werden */ private void soccermanager() { int shirtNo, countRating; double totalRating, rating; System.out.print("Trikotnummer (1 - 99 / 0=Ende) >"); shirtNo = scanner.nextInt(); scanner.nextLine(); while (shirtNo != 0) { totalRating = 0.0; countRating = 0; System.out.print("Bewertung (1.0 - 6.0 / 0=Ende) >"); rating = scanner.nextDouble(); scanner.nextLine(); while (rating > 0) { totalRating = totalRating + rating; countRating = countRating + 1; System.out.print("Bewertung (1.0 - 6.0 / 0=Ende) >"); rating = scanner.nextDouble(); scanner.nextLine(); } System.out.println("Spieler: " + shirtNo + " / Durchschnitt: " + (totalRating / countRating)); System.out.print("Trikotnummer (1 - 99 / 0=Ende) >"); shirtNo = scanner.nextInt(); scanner.nextLine(); } } /** * Prüft ob ein Double eingegeben wurde, wenn nicht, wird ein Fehler ausgegeben und erneut eingelesen. * @return gibt das eingelesene Double zurück. */ private double getValidDouble(){ double zahl; while(!scanner.hasNextDouble()){ System.out.print("Bitte eine Zahl eingeben."); scanner.nextLine(); } zahl = scanner.nextDouble(); scanner.nextLine(); return zahl; } /** * Prüft ob ein Int eingegeben wurde, wenn nicht, wird ein Fehler ausgegeben und erneut eingelesen. * @return gibt das eingelesene Int zurück. */ private int getValidInt(){ int zahl; while(!scanner.hasNextInt()){ System.out.print("Bitte eine Zahl eingeben."); scanner.nextLine(); } zahl = scanner.nextInt(); scanner.nextLine(); return zahl; } }
/** * Anhand der Spielernummern können Bewertungen vergeben werden */ private void soccermanager() { int shirtNo, countRating; double totalRating, rating; System.out.print("Trikotnummer (1 - 99 / 0=Ende) >"); shirtNo = getValidInt(); while (shirtNo != 0) { totalRating = 0.0; countRating = 0; System.out.print("Bewertung (1.0 - 6.0 / 0=Ende) >"); rating = getValidDouble(); while (rating > 0) { totalRating = totalRating + rating; countRating = countRating + 1; System.out.print("Bewertung (1.0 - 6.0 / 0=Ende) >"); rating = getValidDouble(); } System.out.println("Spieler: " + shirtNo + " / Durchschnitt: " + (totalRating / countRating)); System.out.print("Trikotnummer (1 - 99 / 0=Ende) >"); shirtNo = getValidInt(); } }
Sichtbarkeit | Rückgabewert | Name | Parameter | Methodenkopf | |
---|---|---|---|---|---|
double-Validierung | private | double | getValidDouble | (String ausgabe) | private double getValidDouble(String ausgabe){} |
int-Validierung | private | int | getValidInt | (String ausgabe) | private int getValidInt(String ausgabe){} |
Methodenkopf | @return | @param ausgabe | |
---|---|---|---|
double-Validierung | Gibt den Text aus dem Parameter ausgabe auf der Konsole aus. Prüft anschliessend ob ein Double eingegeben wurde, wenn nicht, wird ein Fehler ausgegeben und erneut eingelesen. | gibt das eingelesene Double zurück. | Text der zuerst ausgegeben wird. |
int-Validierung | Gibt den Text aus dem Parameter ausgabe auf der Konsole aus. Prüft anschliessend ob ein Double eingegeben wurde, wenn nicht, wird ein Fehler ausgegeben und erneut eingelesen. | gibt das eingelesene Int zurück. | Text der zuerst ausgegeben wird. |
Beispiel:
/** * Gibt den Text aus dem Parameter ausgabe auf der Konsole aus. Prüft anschliessend ob ein Double eingegeben wurde, wenn nicht, wird ein Fehler ausgegeben und erneut eingelesen. * @param ausgabe Text der zuerst ausgegeben wird. * @return gibt das eingelesene Double zurück. */ private double getValidDouble(String ausgabe){
import java.util.Scanner; /** * UserDialog-Klasse um die Verwendung von Methoden zu üben * * @author Kevin Maurizi * @since 2042.01.01 * @version 0.1 */ public class UserDialog { static Scanner scanner; public UserDialog(){ scanner = new Scanner(System.in); } public static void main(String[] args) { UserDialog userDialog = new UserDialog(); userDialog.run(); scanner.close(); } private void run() { char auswahl; System.out.println("Lieber Benutzer, herzlich willkommen zu diesem Programm"); printMenue(); auswahl = scanner.nextLine().charAt(0); while (auswahl != 'x'){ if(auswahl == 'r'){ rechner(); }else if(auswahl == 'h'){ hasenUndHuehner(); }else if(auswahl == 's'){ soccermanager(); }else{ System.out.println("Buchstabe nicht bekannt, bitte erneut eingeben!"); } printMenue(); auswahl = scanner.nextLine().charAt(0); } } /** * Diese Methode zeigt dem User das Menue an. */ private void printMenue(){ System.out.println(); System.out.println("=============================================="); System.out.println("Was möchten Sie mit dieser Applikation machen?"); System.out.println("Wählen Sie 'r' für Taschenrechner"); System.out.println("Wählen Sie 'h' für Hasen und Hühner Problem"); System.out.println("Wählen Sie 's' für Soccermanager"); System.out.println("Wählen Sie 'x' um das Programm zu beenden!"); System.out.print(">> "); } /** * Verrechnet zwei Werte zu einer Summe */ private void rechner(){ double zahl1, zahl2, summe; zahl1 = getValidDouble("Bitte geben Sie die erste Zahl ein >"); zahl2 = getValidDouble("Bitte geben Sie die zweite Zahl ein >"); summe = zahl1 + zahl2; System.out.println("Die Summe ist: " + summe); } /** * Löst das Hasen- und Hühnerproblem */ private void hasenUndHuehner(){ int animals, legs, rabbit, chicken, maxLegs, minLegs; animals = getValidInt("Anzahl Tiere >"); maxLegs = animals * 4; minLegs = animals *2; legs = getValidInt("Anzahl Beine >"); while(legs > maxLegs || legs < minLegs){ legs = getValidInt("Anzahl Beine ungültig, bitte erneut eingeben (Min: "+minLegs +" Max: " + maxLegs +") >"); } rabbit = animals; chicken = 0; while ((rabbit * 4 + chicken * 2) > legs) { rabbit = rabbit - 1; chicken = chicken + 1; } System.out.println("Es sind " + rabbit + " Hasen und " + chicken + " Huehner"); } /** * Anhand der Spielernummern können Bewertungen vergeben werden */ private void soccermanager() { int shirtNo, countRating; double totalRating, rating; shirtNo = getValidInt("Trikotnummer (1 - 99 / 0=Ende) >"); while (shirtNo != 0) { totalRating = 0.0; countRating = 0; rating = getValidDouble("Bewertung (1.0 - 6.0 / 0=Ende) >"); while (rating > 0) { totalRating = totalRating + rating; countRating = countRating + 1; rating = getValidDouble("Bewertung (1.0 - 6.0 / 0=Ende) >"); } System.out.println("Spieler: " + shirtNo + " / Durchschnitt: " + (totalRating / countRating)); shirtNo = getValidInt("Trikotnummer (1 - 99 / 0=Ende) >"); } } /** * Prüft ob ein Double eingegeben wurde, wenn nicht, wird ein Fehler ausgegeben und erneut eingelesen. * @return gibt das eingelesene Double zurück. */ private double getValidDouble(){ double zahl; while(!scanner.hasNextDouble()){ System.out.print("Bitte eine Zahl eingeben >"); scanner.nextLine(); } zahl = scanner.nextDouble(); scanner.nextLine(); return zahl; } /** * Prüft ob ein Int eingegeben wurde, wenn nicht, wird ein Fehler ausgegeben und erneut eingelesen. * @return gibt das eingelesene Int zurück. */ private int getValidInt(){ int zahl; while(!scanner.hasNextInt()){ System.out.print("Bitte eine Zahl eingeben >"); scanner.nextLine(); } zahl = scanner.nextInt(); scanner.nextLine(); return zahl; } /** * Gibt den Text aus dem Parameter ausgabe auf der Konsole aus. Prüft anschliessend ob ein Double eingegeben wurde, wenn nicht, wird ein Fehler ausgegeben und erneut eingelesen. * @param ausgabe Text der zuerst ausgegeben wird. * @return gibt das eingelesene Int zurück. */ private int getValidInt(String ausgabe){ System.out.print(ausgabe); int zahl; while(!scanner.hasNextInt()){ System.out.print("Bitte eine Zahl eingeben >"); scanner.nextLine(); } zahl = scanner.nextInt(); scanner.nextLine(); return zahl; } /** * Gibt den Text aus dem Parameter ausgabe auf der Konsole aus. Prüft anschliessend ob ein Double eingegeben wurde, wenn nicht, wird ein Fehler ausgegeben und erneut eingelesen. * @param ausgabe Text der zuerst ausgegeben wird. * @return gibt das eingelesene Double zurück. */ private double getValidDouble(String ausgabe){ System.out.print(ausgabe); double zahl; while(!scanner.hasNextDouble()){ System.out.print("Bitte eine Zahl eingeben >"); scanner.nextLine(); } zahl = scanner.nextDouble(); scanner.nextLine(); return zahl; } }
Wie sie erkennen können, habe ich die getValidInt()
und die getValidDouble()
nicht gelöscht oder angepasst, sondern einfach so stehen lassen. Obwohl die neuen Methoden getValidInt(String ausgabe)
und getValidDouble(String ausgabe)
denselben Namen haben kann Java diese unterscheiden. Man nennt das Methoden überladen