Zu dem, was in der OOP oft als sehr kompliziert wahrgenommen wird, gehört wohl eindeutig die dynamische Bindung. Hier mal eine kurze Erläuterung dazu:
Statischer und dynamischer Typ
Um dynamische Bindung zu verstehen, ist es zuerst einmal notwendig, zwischen statischem und dynamischem Typ zu unterscheiden. Bei der Typisierung geht es immer um den Typ, der einer Variablen zugewiesen wird. Jede Variable hat einen Typ, der angibt, was die Variable beinhalten bzw. referenzieren kann.
Wird eine Variable vom Typ Foo deklariert, kann sie alle Objekte vom Typ Foo referenzieren. Dazu gehören aber auch alle Objekte von Subtypen. Ein Objekt eines Subtyps ist gleichzeitig auch immer Objekt aller Supertypen (Subtyppolymorphie). Beispiel:
weiter lesen »
oder: Wie man objektorientiert denkt
Abstract
Zielgruppe: OOP-Einsteiger und -Fortgeschrittene, sowie alle, die das Gefühl haben, die OOP noch nicht ganz verstanden zu haben. Ein OOP-Tutorial sollte man aber zumindest mal gelesen haben.
Die ersten Gehversuche in der OOP fallen oft recht schwer. Und in der Tat klappt das, was dabei heraus kommt, meinst mehr schlecht als recht.
Die OOP erweitert erst einmal die Möglichkeiten, Fehler zu machen. Eine der Ursachen dafür ist, dass Objektorientierung eine andere Denkweise erfordert. Ohne diese objektorientierte Denkweise programmiert man vielleicht “prozedural mit Klassen”, nicht aber wirklich objektorientiert. Und so bleiben auch die schönen Vorteile der OOP wie Wiederverwendbarkeit und Änderbarkeit aus. Wie aber denkt man objektorientiert? Dieser Vortrag stellt einige objektorientierte Denkmuster und Prinzipien vor und zeigt, dass Objektorientierung mehr ist als Klassen und Vererbung.
Folien
Das war Thema meines Vortrags auf den diesjährigen Delphi-Tagen. Die Folien gibts wie versprochen zum Download: weiter lesen »
Vor einiger Zeit hab ich mal Multimethoden vorgestellt. Dabei hab ich auch angedeutet, dass man Multiple Dispatch über das Visitor-Pattern simulieren kann. Das hab ich jetzt mal selbst gebraucht. Da bietet sich direkt mal die Gelegenheit, das vor zu führen. Der Einfachheit halber bleibe ich bei meinem Asteroids-Beispiel.
Normalerweise gibt es beim Visitor-Pattern zwei getrennte Hierarchien: Elemente und Visitor. In unseren Fall fallen beide Hierarchien zusammen. Wir haben nur eine Hierarchie, nämlich die Hierarchie der Objekte, die kollidieren können. Im folgenden betrachten wir daraus Raumschiffe und Asteroiden.
Das Problem ist ja eigentlich, wie im oben verlinkten Blog-Post erläutert, dass der dynamische Typ des Parameters bzw. der Parameter nicht bekannt ist. Zumindest nicht direkt. Der Parameter selbst kennt natürlich seinen dynamischen Typ. Und das ist auch schon die Idee, die man braucht um Multiple Dispatch zu simulieren: Der Parameter weiß den Typ, also kann der Parameter auch gleich die ganze Arbeit machen.
Und so sieht das Ganze im Code aus:
weiter lesen »
Vor mittlerweile über 40 Jahren schrieb Edsger Dijkstra seinem Aufsatz Go To Statement Considered Harmful. Darin ruft er dazu auf, das goto-Statement nicht mehr zu verwenden und stattdessen strukturiert zu programmieren, was u.a. bedeutet, dass man sich auf die drei Kontrollanweisungen Sequenz, Auswahl (if) und Wiederholung (Schleifen) beschränken soll, d.h. nicht wild im Code herum springt. Das ist mittlerweile auch größtenteils anerkannt, d.h. goto wird mittlerweile sehr sparsam und wenn, dann nur in begründeten Ausnahmefällen eingesetzt.
Geht es jetzt auch dem if-Statement an den Kragen? Die Anti-If Campaign(via) scheint nun genau das vor zu haben.
weiter lesen »
Ein Feature, das ich bei den etablierten objektorientierten Programmiersprachen vermisse, sind Multimethoden, auch bekannt unter dem Namen “multiple dispatch”. Ein kurzes Beispiel soll verdeutlichen, was Multimethoden sind und was sie so interessant macht.
“Asteroids” ist manchem vielleicht ein Begriff. Es handelt sich dabei um ein Arcade-Spiel aus dem Jahre 1979 (mit diversen Klonen, Abwandlungen, Portierungen, etc.). Der Spieler steuert ein kleines Raumschiff und muss Asteroiden und gegnerischen Raumschiffen ausweichen bzw. sie durch Abschießen unschädlich machen. Wird das Raumschiff von gegerischem Feuer oder von Asteroiden getroffen, wird es zerstört. Vielleicht hat das Raumschiff noch einen Schild, aber um so Feinheiten gehts mir hier nicht. Die Frage ist: Wie implementiert man sowas?
weiter lesen »