Die Programmiersprache Ruby

Blog| Forum| Wiki  

Inhaltsverzeichnis

Kurz und knapp

Duck Typing bezeichnet im Prinzip die Behandlung eines Objektes nach den Methoden, die es implementiert (Method Signature).

Wortherkunft

Der Begriff "Duck Typing" wurde Anfang August 2003 von Dave Thomas in der Ruby-Community geprägt. Er geht auf James Whitcomb Rileys Gedicht "When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck." zurück, was übersetzt bedeutet: "Wenn ich einen Vogel sehe, der wie eine Ente läuft, wie eine Ente schwimmt und wie eine Ente schnattert, dann nenne ich diesen Vogel eine Ente."

Konzept

Duck Typing ist ein Gegenkonzept zu typisierten Sprachen. Bei diesen wird streng darauf geachtet, dass Variablen immer vom korrekten definierten Typ sind. Ruby funktioniert nach einem anderen Konzept. Auch hier gibt es Klassen, welche die Eigenschaften von Objekten festlegen. Im Grunde ist es aber egal, welcher Klasse ein Objekt auch immer angehört, Hauptsache es kann auf die Botschaften antworten bzw. hat die Methoden implementiert, die man aufruft. Grundforderung ist also nicht mehr "Das Objekt muss von diesem Typ sein." sondern "Das Objekt muss eine bestimmte Funktionalität zur Verfügung stellen.". So kann man beispielsweise in C/C++ einer Methode, die einen String erwartet, auch nur einen solchen übergeben, selbst wenn es andere Objekte gibt, die alle Forderungen dieser Methode erfüllen, nur eben kein String sind. Vom Blickwinkel des Aufrufers kann man auch sagen: "Mir ist es egal, wer auch immer du bist, solange du meine Forderungen (=Methodenaufrufe) erfüllen kannst."

Annahme bei den Programmierern

Das Konzept ist für Programmierer, die typisierte Sprachen gewohnt sind, erstmal starker Tobak. Auch geht die Sorge um, dass man so keine sauberen und robusten Programme schreiben kann. Es gibt jedoch mittlerweile genügend praktische Erfahrung, die zeigt, dass dieses Konzept funktioniert und einiges an Vorteilen bietet. Mitunter handelt man sich jedoch auch Probleme ein, die man in streng typisierten Sprachen nicht hat. Der Ausdruck "Duck Typing" entspringt dieser Aussage, die sinngemäß im Pickaxe-II-Buch steht: "Wenn ein Objekt läuft wie eine Ente und spricht wie eine Ente, dann ist der Interpreter glücklich und behandelt es so, als wäre es eine Ente."

Beispiel

Programm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Schaf
  def sag_was
    "Maeh Maeh..."
  end
  def wer_bist_du
    "Ein Schaf"
  end
end
class WolfImSchafspelz
  def sag_was
    "Maeh Maeh grrr..."
  end
  def wer_bist_du
    "Ein Schaf"
  end
end
def schafstest( schaf )
  puts "--"
  puts schaf.sag_was
  puts schaf.wer_bist_du
  if schaf.wer_bist_du =~ /Ein Schaf/
    puts "Das ist wirklich ein Schaf"
  end
end

schaf1 = Schaf.new
schaf2 = WolfImSchafspelz.new

schafstest( schaf1 )
schafstest( schaf2 )


Ausgabe

--
Maeh Maeh...
Ein Schaf
Das ist wirklich ein Schaf

--
Maeh Maeh grrr...
Ein Schaf
Das ist wirklich ein Schaf

Siehe auch

Ein sehr interessantes Dokument zum Thema Duck Typing, bzw. Äquivalenz und Irrelevanz ist dort zu finden: http://www.informatik.hu-berlin.de/~kalnbach/philo/duck_typing.pdf