Björn Klippstein

Methode

Klippstein IT Service

Aus 4webmaster.de

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

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:
  • in: Eingabeparameter, über den Daten an die Operation übergeben werden
  • out: Ausgabeparameter, über den Daten an den Aufrufer zurückgegeben werden
  • inout: Parameter wird während der Ausführung der Operation verändert
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