Methode
Aus 4webmaster.de
|
Objekte stellen Methoden / Operationen zur Verfügung. Da gleichartige Objekte die gleichen Methoden zur Verfügung stellen, werden diese in der Klasse des Objektes deklariert. Methoden lassen sich durch ihre Signatur charakterisieren:
| Name | Wie wird die Methode identifiziert, unter welchem Namen ist sie aufrufbar? |
| Parameterliste | was für Parameter nimmt sie an? Die Parameter werden jeweils etwa wie Attribute notiert, d.h. man kann für jeden Parameter den Typ, die Multiplizität, den Standardwert und besondere Eigenschaften wie etwa {ordered} angeben. |
| Rückgabetyp | welcher Typ wird zurückgegeben? |
| Klassenmethode | oder normale Methode (eines Objektes)? Nicht nur Objekte, sondern auch Klassen können Methoden haben. In Java werden diese Klassenmethoden static methods genannt, in Ruby heißen sie class methods. |
| Sichtbarkeit | Wer kann die Methode aufrufen? Durch Einschränkung der Sichtbarkeit kann Kapselung realisiert werden. |
Im body der Methode wird die Signatur dann programmtechnisch realisiert: Was genau macht die Methode? Signatur und Body bilden zusammen die Deklaration.
Damit ein Objekt eine bestimmte Methode ausführt, sendet man ihm eine Botschaft ("führe die Methode xy aus"):
einObjekt.xy
Darstellung von Operationen in UML
In UML spricht man von Operationen statt von Methoden. Operationen lassen sich in die Darstellung von Klassen integrieren. Dazu wird die Signatur der relevanten Operationen im dritten / untersten Teil der Klassendarstellung (zuständig für das Verhalten der Klasse) eingetragen — komplett oder teilweise.
Regeln für die Notation von Operationen in UML:
| Beispiel | angegeben wird | Erklärung |
|---|---|---|
| sendeMail() | Name | In der einfachsten Form wird nur der Name der Operation angegeben. Der Name einer Operation beginnt mit einem Kleinbuchstaben. Die leeren Klammern werden immer mit notiert, damit man Operationen von Attributen unterscheiden kann. |
| sendeRundmail() | Name, ist Klassenoperation | Um Klassenoperationen von Objektoperationen unterscheiden zu können, werden Klassenoperationen in UML unterstrichen dargestellt. |
| +sendeMail() | Sichtbarkeit, Name | Die Kapselung wird mit - # ~ + charakterisiert, siehe Sichtbarkeit |
| bucheMitgliedsbeitrag():Erfolgsstatus | Name, Rückgabetyp | Als Typen können UML-eigene Typen, Typen der Implementierungssprache oder Klassen verwendet werden. Am besten verwendet man eigene Typen, siehe Attribute. |
| bucheMitgliedsbeitrag(einheiten, tarif) | Name, Parameterliste | In diesem Beispiel werden nur die Namen der Parameter genannt. Zusätzlich lässt sich für jeden Parameter der Typ, die Multiplizität, der Standardwert und besondere Eigenschaften wie etwa {ordered} angeben. Dazu verwendet man die gleiche Notation wie bei Attributen. |
| sendeMail(in mailtext, in absender) | Name, Parameterliste mit Richtung | Als Richtung kann eine der folgenden Werte angegeben werden:
|
| Person::sendeMail() | Klasse, Name | Wenn nicht klar ist, zu welcher Klasse die Operation gehört, dann kann sie mit doppeltem Doppelpunkt vor dem Operationsnamen notiert werden. |
Getter- und Setter-Methoden werden meist nicht erwähnt, da sie das Diagramm unnötig aufblähen.
Methodendeklaration in Java
In einer Java-Methodendeklaration muss der Rückgabetyp festgelegt werden. Es kann aber auch Object als Rückgabetyp gewählt werden.
Beispiel:
public class Person { // Sichtbarkeit = public // Rückgabe = keiner (void) // Identifier = gehen // Parameter = keine // Body = Text ausgeben public void gehen() { System.out.println("Ich gehe"); } // Sichtbarkeit = protected // Rückgabetyp = String // Identifier = sprechen // Parameterliste = ein Element vom Typ String // Body = Text zurückgeben protected String sprechen(String s) { return "Ich sage: " + s; } }
Penible Parameterliste
Java ist nicht auf Eleganz optimiert. So unterstützt Java weder optionale Parameter noch Parameter mit variablen Typ. Statt dessen muss mit Overloading die Methode mehrfach deklariert werden, je einmal für jede einzelne Signatur. Dadurch kann der Code sehr lang und häßlich werden. Vor allem aber wird Redundanz erzeugt ─ eine Methode lässt sich z.B. nicht einfach umbenennen, statt dessen muss man Methodenfamilien managen.
Optionale Parameter kann man simulieren, indem man
- Vektoren oder Hashes als Parameter verwendet
- optionale Parameter als null-Werte übergibt :-(
- oder gleich eine extra Klasse für die Parameter baut, deren Konstruktor Standardwerte für die Attribute setzt
Statische Methoden in Java
Analog zu den static fields werden in Java Klassenmethoden als statische Methoden deklariert, d.h. sie sind einfach für alle Objekte einer Klasse identisch. Man kann sie auf die Klasse anwenden, aber auch auf ein beliebiges Objekt der Klasse. Erkennbar sind statische Methoden durch das Schlüsselwort static:
public static String eltern() { return "Mutter und Vater"; } Person.eltern() -> "Mutter und Vater" einePerson.eltern() -> "Mutter und Vater"
Methodendeklaration in Ruby
In Ruby ist für eine Methode nicht festgelegt, welchen Typ sie zurückgibt. Es gibt daher keine Deklaration des Rückgabetyps. Jede Methode liefert einen Rückgabewert, egal ob er verwendet wird oder nicht. Zurückgegeben wird stets der letzte Ausdruck (der z.B. nil sein kann). Alternativ kann man mit return die Ausführung einer Methode an diesem Punkt beenden und den angegebenen Wert zurückgeben lassen.
Beispiel:
public // alle folgenden Methoden sind public
// (ist aber sowieso Standard erstmal)
def gehen // Identifier, keine Parameter
puts 'Ich gehe'
end // Rückgabe ist nil
protected // alle folgenden Methoden sind protected
def sprechen(s) // Identifier und Parameterliste
return 'Ich sage: ' + s // explizite Rückgabe
end
Optionale Parameter
Durch Angabe eines Standardwertes wird ein Parameter zu einem optionalen Parameter:
def zaehlen( a=1, b=2, c=3 ) // Parameterliste mit Standardwerten a.to_s + b.to_s + c.to_s end zaehlen -> '123' zaehlen('Eins') -> 'Eins23' zaehlen('Eins','Zwei') -> 'EinsZwei3' zaehlen('Eins','Zwei','Drei') -> 'EinsZweiDrei'
Außerdem können Parameterlisten variabler Länge definiert werden. Dazu wird der letzte Parameter in der Liste mit einem Sternchen gekennzeichnet:
def zaehlen( a, *b ) // Parameterliste mit variabler Länge // im Body sind jetzt die Variablen a und b verwendbar. // b ist ein Array. Es nimmt alle auf a folgenden Parameter auf. end
Klassenmethoden in Ruby
Klassenmethoden werden durch ein vorangestelltes self. von normalen Instanzmethoden unterschieden:
def self.eltern // Klassenmethode 'Mutter und Vater' end Person.eltern -> 'Mutter und Vater' einePerson.eltern -> Error: Methode nicht definiert
Siehe auch