Software auf modernem Billettautomat: 500`000 Zeilen

Werbung
Abteilung Informatik, Fach Programmieren
FHZ
Hochschule für Technik+Architektur Luzern
K08 METHODEN UND PARAMETER
K08 METHODEN UND PARAMETER
1 Motivation und Einleitung
Grosse Programme können hunderttausende von Zeilen umfassen.
Software auf modernem Billettautomat:
500’000 Zeilen Code!
Solche Programme müssen gut strukturiert werden, damit sie
überhaupt noch verstanden werden können. Eines der wichtigsten
Mittel um dies zu tun, ist das Zusammenfassen von Programmanweisungen, welche immer wieder gebraucht werden. Diesen
wird dann ein eigener Name gegeben. Im Programm muss nur
noch dieser Name geschrieben werden. Der Computer führt dann
die dahinter stehenden Anweisungen selbständig aus.
Dieses Konzept ist nicht neu. Schon in den Anfängen der Programmierung wurde es unter dem Begriff Subroutine eingeführt
(siehe Assembler). Später wurde es zum Konzept der Prozeduren
und Funktionen ausgebaut (strukturierte Programmierung).
In der objektorientierten Programmierung wurde dieses Konzept
schliesslich mit dem Konzept der Klassen und Objekte verbunden und so sind Methoden entstanden.
Eine Methode ist nichts anderes, als ein Programmteil bestehend
aus zusammengehörenden Anweisungen (vgl. Algorithmus,
Struktogramm), welcher einer bestimmter Klasse zugeordnet ist.
Ihre Ausführung ist immer an ein Objekt gebunden. Letzteres
tritt in dieser Lektion allerdings nicht offen zu Tage.
K08_Methoden-L, V14
© H. Diethelm
Seite 1/13
Abteilung Informatik, Fach Programmieren
FHZ
Hochschule für Technik+Architektur Luzern
K08 METHODEN UND PARAMETER
Beispiel:
Wir möchten ein gleichschenkliges Dreieck mit der Basisbreite
100 Pixel und der Höhe 50 Pixel an der Position (20, 200), entsprechend den Koordinaten der linken, unteren Ecke, auf den
Bildschirm zeichnen. Wie sieht das entsprechende Programm
aus? Führen Sie Variablen für die Basisbreite, die Höhe und die
Koordinaten ein.
import java.awt.*;
import.java.applet.Applet;
public class Triangle extends Applet {
public void paint(Graphics g){
int basis = 100;
int hoehe = 50;
int x = 20;
int y = 200;
g.drawLine(x, y, x + basis, y);
g.drawLine(x, y,
x +(basis / 2), y - hoehe);
g.drawLine(x + basis, y,
x + (basis / 2), y - hoehe);
}
}
K08_Methoden-L, V14
© H. Diethelm
Seite 2/13
FHZ
Hochschule für Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K08 METHODEN UND PARAMETER
Wenn man nur die Zeilen zum Zeichnen der Linien anschaut,
dann sind diese absolut unabhängig von den oben gegebenen
Werten für Basisbreite, Höhe und Ort. Das heisst, wenn wir ein
zweites Dreieck zeichnen wollten, müssten wir zuerst die Werte
der Variablen ändern und dann die genau gleichen Zeilen nochmals hinschreiben. Beim dritten Dreieck ...
Dies schreit förmlich nach einer Methode!
Wir nennen die Methode drawTriangle(). Ein erster Versuch
könnte so aussehen:
import java.awt.*;
import.java.applet.Applet;
public class Triangle exends Applet {
public void paint(Graphics g) {
drawTriangle(g);
}
private void drawTriangle(Graphics g) {
int basis = 100;
int hoehe = 50;
int x = 20;
int y = 200;
g.drawLine(x, y, x + basis, y);
g.drawLine(x, y, x + basis/2, y - hoehe);
g.drawLine(x + basis, y, x + basis/2, y - hoehe);
}
}
Allerdings sind wir damit noch nicht viel weiter. Wir können zwar
die Methode drawTriangle() beliebig viele Male aufrufen, aber
sie zeichnet immer dasselbe Dreieck an derselben Stelle!!
K08_Methoden-L, V14
© H. Diethelm
Seite 3/13
Abteilung Informatik, Fach Programmieren
FHZ
Hochschule für Technik+Architektur Luzern
K08 METHODEN UND PARAMETER
2 Methoden mit Parametern
Unser Problem ist, dass wir den Variablen in der Methode
drawTriangle() beim Aufruf keine neuen Werte zuweisen können. Die Lösung für dieses Problem heisst Parameter. Statt Basisbreite, Höhe etc. als Variablen innerhalb der Methode zu deklarieren verschieben wir diese in den Kopf der Methode:
private void drawTriangle(Graphics g,
int basis, int hoehe, int x, int y) {
g.drawLine(x, y, x + basis, y);
g.drawLine(x, y, x + basis/2, y - hoehe);
g.drawLine(x + basis, y, x + basis/2,
y - hoehe);
}
g, basis, hoehe, x und y sind jetzt Parameter, genauer formale
Parameter, der Methode drawTriangle(). Sie erhalten ihre
Werte bei jedem Aufruf neu:
drawTriangle(g, 100, 50, 20, 200);
drawTriangle(g, 40, 80, 100, 150);
Die Werte 100, 50, etc. werden als aktuelle Parameter bezeichnet. Sie werden beim Aufruf in der Reihenfolge ihres Auftretens
den formalen Parametern zugewiesen. Es muss für jeden
formalen Parameter ein passender aktueller Parameter, in der
richtigen Reihenfolge vorhanden sein.
K08_Methoden-L, V14
© H. Diethelm
Seite 4/13
Abteilung Informatik, Fach Programmieren
FHZ
Hochschule für Technik+Architektur Luzern
K08 METHODEN UND PARAMETER
Noch ein Wort zu g: In der Methode drawTriangle() ist g ein
formaler Parameter. In der Methode paint(), ist g auch ein formaler Parameter. Es handelt sich aber um zwei verschiedene
Parameter! Der Appletviewer ruft beim Darstellen des Applets die
Methode paint() auf und weist g einen entsprechenden aktuellen Parameter zu. Es handelt sich dabei um ein Objekt der Klasse Graphics, welches den Bildschirmausschnitt repräsentiert,
auf welchen wir zeichnen wollen. Dieses Objekt wird von der Methode paint() an die Methode drawTriangle() weitergereicht.
K08_Methoden-L, V14
© H. Diethelm
Seite 5/13
FHZ
Hochschule für Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K08 METHODEN UND PARAMETER
Beispiel:
Schreiben Sie eine Methode, welche einen Stern in der folgenden
Art zeichnet:
(x, y)
width
g, x, y und width sind Parameter der Methode.
private void drawStar(Graphics g,
int x, int y,
int width) {
g.drawLine(x - width, y, x + width, y);
g.drawLine(x, y + width, x, y - width;
g.drawLine(x - width, y - width,
x + width, y + width);
g.drawLine(x + width, y - width,
x - width, y + width);
}
K08_Methoden-L, V14
© H. Diethelm
Seite 6/13
Abteilung Informatik, Fach Programmieren
FHZ
Hochschule für Technik+Architektur Luzern
K08 METHODEN UND PARAMETER
3 Lokale Variablen
Variablen, welche innerhalb einer Methode deklariert sind,
nennt man auch lokale Variablen. Diese Variablen existieren nur
so lange, wie eine aufgerufene Methode aktiv ist. Lokale
Variablen müssen initialisiert werden, bevor auf sie zugegriffen
werden kann.
4 Die Sichtbarkeit von lokalen Variablen und Parametern
Variablen und Parameter sind nur innerhalb der Methode sichtbar, in welcher sie deklariert wurden. Das heisst, man kann zwei
Methoden haben, welche Parameter oder Variablen mit dem selben Namen deklarieren. Es entsteht kein Problem. Die geschweiften Klammern bilden einen Sichtbarkeitsbereich oder Scope.
5 Was ist die Bedeutung von public und private?
Methoden sind immer innerhalb einer Klasse definiert. Beim
Aufruf einer Methode unterscheiden wir, ob die Methode von ausserhalb der Klasse (von einem Objekt einer anderen Klasse) oder
von innerhalb der Klasse (von einer anderen Methode der selben
Klasse bzw. vom aktuellen Objekt) aufgerufen wird.
Der erste Fall ist nur möglich, wenn die Methode als public deklariert wurde. Ist sie hingegen als private deklariert, so ist nur
der zweite Fall möglich.
Die Methode paint() wird vom Appletviewer, also von aussen
aufgerufen, deshalb muss sie public sein. Die Methode
drawTriangle() wird nur innerhalb der Klasse Triangle gebraucht. Deshalb kann sie private sein.
K08_Methoden-L, V14
© H. Diethelm
Seite 7/13
Abteilung Informatik, Fach Programmieren
FHZ
Hochschule für Technik+Architektur Luzern
K08 METHODEN UND PARAMETER
6 Rückgabe eines Resultats
Aus der Mathematik sind wir uns an Funktionen gewohnt, welche
in Abhängigkeit von einem oder mehreren Werten irgend ein Resultat liefern.
Beispiel:
sin(Π/2) = 1 (Achtung kein Java!)
Analog können wir in Java Methoden definieren, welche ein Resultat liefern.
Beispiel:
private int flaeche(int breite,
int laenge) {
int resultat = breite * laenge;
return resultat;
}
Folgendes fällt sofort auf:
§ Vor der Methode steht int statt void. Damit wird ausgesagt,
dass die Methode als Resultat einen Wert vom Typ int zurückgibt. (Entsprechend heisst void, die Methode gibt nichts zurück.)
§ Am Schluss der Methode steht return resultat. Damit
wird der Wert von resultat zurückgegeben.
K08_Methoden-L, V14
© H. Diethelm
Seite 8/13
Abteilung Informatik, Fach Programmieren
FHZ
Hochschule für Technik+Architektur Luzern
K08 METHODEN UND PARAMETER
Die Methode kann wie folgt aufgerufen werden:
int f = flaeche(20, 30);
Eine Methode mit dem Typ int kann überall dort aufgerufen
werden, wo auch ein einfacher Wert desselben Typs stehen
könnte. Das heisst folgende Anweisung ist möglich:
g.drawString("Flaeche = " +
flaeche(20, 30), 20, 20);
Auf der anderen Seite kann jeder Aufruf einer Methode mit einem von void verschiedenen Typ durch einen einfachen Wert
desselben Typs ersetzt werden.
Für die obige Anweisung könnte man also auch schreiben:
int f = 600;
Wichtige Bemerkungen:
§ Sobald in der Methode eine return-Anweisung steht, wird die
Methode abgebrochen. Dass heisst, nachfolgende Anweisungen innerhalb der Methode werden nicht mehr ausgeführt.
§ Die letzte Anweisung in einer Methode mit Rückgabewert
muss eine return-Anweisung sein!
§ Der Rückgabewert einer Methode darf ignoriert werden bzw.
muss nicht zwingend "konsumiert" werden! Der Compiler lässt
dies zu.
K08_Methoden-L, V14
© H. Diethelm
Seite 9/13
Abteilung Informatik, Fach Programmieren
FHZ
Hochschule für Technik+Architektur Luzern
K08 METHODEN UND PARAMETER
Abschlussbeispiel:
Wir wollen unser Programm um eine Methode drawHouse() erweitern. Diese zeichnet ein Haus auf den Bildschirm:
hoehe / 2
hoehe
(x, y)
breite
Dazu brauchen wir eine Methode zum Zeichnen von Rechtecken.
Anders als bei den Dreiecken, müssen wir diese Methode nicht
selber implementieren. Statt dessen importieren wir sie aus der
Klassenbibliothek java.awt.* (genaugenommen importieren wir
die Klasse Graphics, welche diese Methode, wie auch die Methode drawString() etc. implementiert).
import java.awt.*;
import.java.applet.Applet;
public class House extends Applet {
public void paint(Graphics g){
drawHouse(g,160,20,100,80);
}
K08_Methoden-L, V14
© H. Diethelm
Seite 10/13
FHZ
Hochschule für Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K08 METHODEN UND PARAMETER
private void drawTriangle(Graphics g,
int basis,
int hoehe,
int x, int y) {
g.drawLine(x, y, x + basis, y);
g.drawLine(x, y,
x + (basis / 2), y - hoehe);
g.drawLine(x + basis, y,
x + (basis / 2), y - hoehe);
}
private void drawHouse(Graphics g,
int breite,
int hoehe,
int x, int y) {
g.drawRect(x, y - hoehe,
breite, hoehe);
drawTriangle(g, breite, hoehe / 2,
x, y - hoehe);
}
}
K08_Methoden-L, V14
© H. Diethelm
Seite 11/13
Abteilung Informatik, Fach Programmieren
FHZ
Hochschule für Technik+Architektur Luzern
K08 METHODEN UND PARAMETER
Wichtige Bemerkungen:
§ In Java ist es zulässig, dass eine Methode bereits vor ihrer
Deklaration aufgerufen werden kann, vgl. oben Aufruf von
drawHouse().
§ In Java ist es nicht zulässig, innerhalb bzw. lokal in einer
Methode weitere Methoden zu deklarieren. Oben könnte man
also die Methode drawTriangle() nicht innerhalb von
drawHouse() deklarieren!
K08_Methoden-L, V14
© H. Diethelm
Seite 12/13
Abteilung Informatik, Fach Programmieren
FHZ
Hochschule für Technik+Architektur Luzern
K08 METHODEN UND PARAMETER
Der Ablauf beim Aufruf der Methode drawHouse() mit den Parametern 160, 20, 100, 50 sieht wie folgt aus:
Sequenzdiagramm in UML-Notation (Unified Modeling Language):
:House
g:Graphics
paint(g)
drawHouse(g)
drawRect()
drawTriangle(g)
drawLine()
drawLine()
drawLine()
K08_Methoden-L, V14
© H. Diethelm
Seite 13/13
Herunterladen