Schritt 8 - Sondierende Methoden
In den ersten sieben Schritten haben Sie eine einfache Klasse Waage implementiert, die hauptsächlich aus drei Methoden besteht:
- Einer Methode zur Eingabe des Gewichts einer Person,
- einer Methode zur Eingabe der Körpergröße und
- einer Methode zur Ausgabe der beiden Attributwerte von gewicht und groesse.
⇒ Speichern Sie Ihr Projekt "Waage01" nun unter "Waage02" ab, um Ihren bisherigen erfolgreichen Arbeitsstand zu sichern. Verändern Sie den Quelltext der Klasse Waage dann in dem Projekt "Waage02" wie folgt:
Die neue Version des Quelltextes
Der Quelltext wurde gegenüber der letzten Version um zwei sondierende Methoden erweitert, und die Namen der manipulierenden Methoden wurden verändert. Statt wiegen() heißt die Methode jetzt setGewicht(), und statt messen() nennt sich die Methode jetzt setGroesse().
Mit diesem Refactoring (Umbau eines Quelltextes) wurden aus den allgemeinen sondierenden Methoden spezielle get-Methoden.
Wenn Sie den Unterschied zwischen einer sondierenden Methode und einer get-Methode bzw. zwischen einer manipulierenden Methode und einer set-Methode nicht kennen, gehen Sie doch bitte auf den Lernbaustein get- und set-Methoden. Dort wird Ihnen alles erklärt.
Die return-Anweisung einer sondierenden Methode
Betrachten wir die Methode getGewicht() mal etwas näher:
public double getGewicht() { return gewicht; }
Was geschieht, wenn wir diese Methode mit der rechten Maustaste aufrufen?
Der Objektinspektor zeigt den Rückgabewert einer sondierenden Methode an
Es erscheint ein kleines Info-Fenster, in dem wir den aktuellen Attributwert sehen.
Die Anweisung
return gewicht;
besagt nichts anderes, als dass beim Beenden der Methode der Attributwert von gewicht als Ergebnis zurückgeliefert werden soll. Da das Attribut gewicht den Datentyp double hat, muss auch der Methode mitgeteilt werden, dass das Ergebnis der Abfrage eine double-Zahl sein soll. Dies geschieht durch Voranstellen des Datentyps vor den Bezeichner der Methode:
public double getGewicht()
Schritt 9 - Berechnung des Idealgewichts
Wir wollen das Programm nun um eine sondierende Methode erweitern, welche das Idealgewicht der Person als Ergebnis zurückgibt. Die Formel zur Berechnung des Idealgewichts ist recht einfach: Körpergröße - 100, und davon noch mal 10% abziehen:
Idealgewicht = (Körpergröße - 100) * 0,9
Es gibt nun zwei Wege, eine entsprechende sondierende Methode zu schreiben. Hier der erste Weg:
public double idealgewicht() { double ideal; ideal = (groesse-100)*0.9; return ideal; }
Hier wird zunächst eine lokale Variable ideal zum Speichern des Idealgewichts anlegt. In der Zeile danach steht dann die Formel zur Berechnung des Idealgewichts, das Ergebnis dieser Berechnung wird in ideal gespeichert. In der nächsten Zeile wird dann der Wert von ideal als Ergebnis der Abfrage zurückgegeben, gleichzeitig wird die Methode durch den Aufruf des return-Befehls beendet.
Eine Profi-Programmiererin würde einen kürzeren Weg wählen:
public double idealgewicht() { return (groesse-100)*0.9; }
Diese Version der Methode idealgewicht() leistet das Gleiche wie die erste Version, nur ist sie wesentlich kürzer. Der return-Befehl gibt direkt das Ergebnis der Berechnung zurück und beendet die Methode dabei. Eine lokale Variable als Zwischenspeicher ist hier nicht notwendig.
Aufgabe 3.2-1
Begründen Sie, warum die Methode idealgewicht() keine get-Methode ist, warum sie also nicht getIdealgewicht() heißen darf.
Lösungen der Aufgaben und Übungen (Zugangsdaten erforderlich)
/ Lösungen für Schüler(innen))Vor den beiden nächsten Übungen müssen wir noch eine neue Sache behandeln: Methoden können nämlich Methoden aufrufen.
Methoden können Methoden aufrufen!
Angenommen, die anzeigen()-Methode soll neben dem Gewicht und der Größe einer Person auch deren Idealgewicht anzeigen. In der Klasse Waage existiert bereits die sondierende Methode idealgewicht(), die nichts anderes tut, als das Idealgewicht zu berechnen.
Aufgabe 3.2-2
Quelltext 1:
public void anzeigen() { System.out.println ("Sie wiegen "+gewicht+ " kg!"); System.out.println ("Sie sind "+groesse+ " cm groß!"); double ideal; ideal = (groesse-100)*0.9; System.out.println ("Ihr Idealgewicht betraegt "+ideal+" kg!") }
Quelltext 2:
public void anzeigen() { System.out.println ("Sie wiegen "+gewicht+ " kg!"); System.out.println ("Sie sind "+groesse+ " cm groß!"); System.out.println ("Ihr Idealgewicht betraegt "+idealgewicht()+" kg!") }
- Begründen Sie, wieso der Quelltext 2 besser ist als der Quelltext 1.
- Erläutern Sie, auf welche Weise hier die sondierende Methode idealgewicht() aufgerufen und ausgewertet wird!
Lösungen der Aufgaben und Übungen (Zugangsdaten erforderlich) / Lösungen für Schüler(innen))
Übung 3.2-3
Schreiben Sie eine sondierende Methode gibDifferenz(), welche die Differenz zwischen tatsächlichem Gewicht und dem Idealgewicht berechnet und als Ergebnis zurückliefert.
Fallbeispiele:
- Gewicht = 75.3 kg, Idealgewicht = 72.3 kg, Rückgabewert = 3.0
- Gewicht = 70.3 kg, Idealgewicht = 72.3 kg, Rückgabewert = -2.0
Ergänzen Sie die Methode anzeigen() so, dass auch diese Differenz ausgegeben wird. Beachten Sie dabei die Ergebnisse der Aufgabe 3.2-2.
Lösungen der Aufgaben und Übungen (Zugangsdaten erforderlich) / Lösungen für Schüler(innen))
Aufgabe 3.2-4
Eine Informatik-Schülerin, die auch gleichzeitig das Fach Ernährungslehre belegt hat, findet, dass die Formel für das Idealgewicht zu einfach ist. Man müsste doch beim Idealgewicht auch das Geschlecht der Person berücksichtigen. Sie hat sich also Folgendes ausgedacht:
- Idealgewicht für Männer = (Körpergröße - 100) * 0.9
- Idealgewicht für Frauen = (Körpergröße - 100) * 0.85
Die Methode idealgewicht() hat diese Schülerin entsprechend umgeschrieben.
Betrachten Sie nun die beiden Alternativen der Methode anzeigen() in Übung 3.2-2 und beurteilen Sie dann, welche der beiden Alternativen weniger Arbeitsaufwand und weniger Fehleranfälligkeit bedeutet, wenn man die Berechnung des Idealgewichts verändert.
Lösungen der Aufgaben und Übungen (Zugangsdaten erforderlich) / Lösungen für Schüler(innen))
Seitenanfang -
Weiter mit der Folge 3.3 - Fallunterscheidungen...