dedlfix: Ducktype

Beitrag lesen

Tach!

Was sind Ducktypes?

Das ist kein Ding, das ist ein Konzept. Das kann man nur in schwach typisierten Sprachen verwenden, in anderen braucht es Interfaces oder Vergleichbares.

"Wenn es quakt wie eine Ente, dann wird es wohl eine Ente sein", heißt der Spruch. Das beeinhaltet, dass es auch ein Fuchs sein kann, der wie eine Ente quakt. Das ist dem Programm an der Stelle aber egal, es will nur die Funktionalität des Quakens haben.

Angenommen es geht um Javascript und der Anwendungsfall ist, dass man eine Speicherroutine schreibt, die Objekte entgegennimmt, um deren Daten zu speichern. Die Objekte müssen dabei kooperieren, indem sie eine Methode namens serialize() haben, die die Daten in eine String-Form bringen muss. Man testet nun, ob ein übergebenes Objekt die Methode serialize() hat, und wenn es die hat, dann ruft man sie auf. Wenn nicht, ignoriert man das Objekt oder wirft Fehler oder was auch immer man grad für angebracht hält. Der Speicherroutine ist also egal, was da kommt, Hauptsache es lässt sich serialisieren.

Wenn also das Objekt eine Methode serialize() hat, ist es serialisierbar, wenn nicht, dann nicht. In C# müsste stattdessen die Klasse das Interface ISerializable implementieren, welches die Methode serializable() vereinbart. Oder es müsste eine Basisklasse geben, von der alle Kandidaten abgeleitet werden. Letzeres ist nciht unbedingt wünschenswert, besonders wenn die Klassen funktional nichts miteinander zu tun haben. Die Speicher-Funktion nähme jedenfalls ein Objekt vom Typ ISerializable oder von der Basisklasse entgegen. Dass das eingehalten wird, dafür sorgt der Compiler mit seiner Typprüfung. In Javascript gibt es keine Typangaben und so kann kein Compiler dafür sorgen, dass ein Fehler geworfen wird. Man muss dort selbst prüfen, ob man was passendes bekommen hat, sprich: irgendwas, das wie eine Ente quakt.

dedlfix.