2. Objektorientierung

 
2.1 Eine Einführung - Programmiersprachen
Seitenfuß  Die Objektorientierte Sichtweise 
Eine Einführung  Seitenkopf 


Generationen
"Programmiersprachen sind Sprachen zur Formulierung von Rechenvorschriften, die von einem Computer ausgeführt werden können", so eine typische Definition des Begriffes Programmiersprache. Das bedeutet, dass Programmiersprachen die wichtigste Schnittstelle zwischen dem Benutzer und dem Computer darstellen, da sie sowohl vom Benutzer als auch vom Computer verstanden werden können.
Die ersten Programmiersprachen (Maschinensprachen) stellten den Befehlssatz des Prozessors einfach nur dem Benutzer zur Verfügung. Man programmiert mit ihnen, indem man jeden Befehl in Form von Nullen und Einsen, die vom Computer verstanden werden können, eingibt. Dadurch muss sich der Benutzer der Sprache des Computers vollständig anpassen.
In der nächsten Programmiersprachengeneration (Maschinenorientierte Sprachen) ersetzte man die Befehle aus Nullen und Einsen, durch einprägsame Abkürzungen der natürlichen Sprache. Diese Sprachen können vom Benutzer leichter verstanden, und vom Computer mit nahezu gleicher Geschwindigkeit interpretiert werden, da jeder Befehl nur durch sein Alias (aus Nullen und Einsen) ersetzt werden muss.
Maschinensprachen und Maschinenorientierte Sprachen können demnach sehr schnell verarbeitet werden. Es zeigen sich jedoch auch Probleme: Bei großen Programmen verliert man leicht den Überblick, Teile aus Programmen können nicht wiederverwendet werden und Programme müssen für jeden Prozessortyp neu geschrieben werden.
Mit den Höheren Programmiersprachen werden diese Probleme gelöst. Grundlegende Algorithmen werden per Norm mit der Sprache selbst zur Verfügung gestellt, wodurch man das Laufen von Programmen auf allen von der Sprache unterstützten Prozessoren gewährleistet. Weiterhin stellt man grundlegende Strukturierungsmittel zur Verfügung, welche einerseits die Übersichtlichkeit, andererseits die Wiederverwendbarkeit, erhöhen. Die Ablaufgeschwindigkeit des Programmes ist bei höheren Programmiersprachen jedoch geringer als bei Maschinensprachen, da jeder Befehl der höheren Programmiersprache in einen oder in mehrere Befehle des jeweiligen Prozessors übersetzt werden muss.
Insgesamt betrachtet ist zu erkennen, dass Programmiersprachen, bzw. die eingangserwähnte Schnittstelle zwischen dem Benutzer und dem Computer, immer mehr dem Benutzer angepasst wurden. Dem Benutzer wird es erleichtert Programme zu schreiben, der Computer benötigt jedoch mehr Ressourcen. Alle diese Anpassungen sind aber eher allgemeiner Art, erleichtern jedem Benutzer gleichermaßen den Umgang mit dem Computer.
 
Paradigmen
Bei den höheren Programmiersprachen tritt eine Differenzierung zwischen verschiedenen Benutzertypen ein. Verschiedene Benutzer haben verschiedene Sichtweisen. So entstanden verschiedene sogenannte Programmierparadigmen, bei welchen jeweils von einer grundsätzlichen Sicht der Dinge ausgegangen wird, und anhand dieser Sichtweise programmiert wird.
In der imperativen Programmierung geht man von Variablen und Anweisungen aus. Man programmiert, indem man Anweisungen auf Variablen ausführt, bis das gewünschte Ergebnis erreicht ist. Die wohl bekanntesten imperativen Programmiersprachen sind Pascal und C.
In der funktionalen Programmierung geht man von Funktionen als allen Dingen zugrundeliegendes Konzept aus. Beim Start eines Programmes wird eine Funktion mit Parametern aufgerufen, woraufhin diese Funktion weitere Funktionen, die zur Erledigung der Aufgabe notwendig sind, aufruft. Funktional kann man beispielsweise mit LISP programmieren.
Bei der logischen Programmierung möchte man nichts berechnen, sondern anhand von Tatsachen und Zusammenhängen beweisen. Programmiert wird, indem man Eigenschaften der gesuchten Lösung beschreibt, und nicht die Algorithmen zur Bestimmung der Lösung. In der logischen Programmierung wird hauptsächlich PROLOG verwendet.
Diese Sichtweisen haben alle eines gemeinsam: Sie haben mit der Realität nicht viel zu tun. Was sollen aber Programmierer tun, die sich gern an der Realität orientieren?


2.2 Die Objektorientierte Sichtweise
Seitenfuß  Objektorientierte Konzepte 
Eine Einführung  Seitenkopf 


In der Welt die uns umgibt haben wir es täglich mit Objekten zu tun. Ob nun mein Bleistift, Taschentuch, das Haus auf der gegenüberliegenden Straßenseite oder Minka, die Perserkatze der Nachbarn. Alle diese Dinge kann man umgangssprachlich als Objekte umschreiben.
Objekte haben bestimmte Eigenschaften: Mein Bleistift ist stumpf, mein Taschentuch ist sauber, das Haus gegenüber ist gelb. Weiterhin gibt es Tätigkeiten mit denen sich die Eigenschaften dieser Objekte ändern lassen. Das Haus kann man anstreichen, den Bleistift anspitzen. Wenn ich den Bleistift selbst anspitze, sind wir, ich und der Bleistift, zwei Objekte, die sich gegenseitig beeinflussen bzw. miteinander kommunizieren.
Dieses Prinzip der miteinander kommunizierenden Objekte ist die grundlegende Sichtweise der objektorientierten Programmierung (OOP).


2.3 Objektorientierte Konzepte
2.3.1 Kapselung - Daten und Methoden
Seitenfuß  Abstraktion 
Die Objektorientierte Sichtweise  Seitenkopf 


Wie schon beschrieben besitzen alle Objekte Eigenschaften, und Mittel mit denen die Eigenschaften geändert werden können. In der Objektorientierten Programmierung werden die Eigenschaften als Daten, Membervariablen, oder einfach nur als Eigenschaften bezeichnet. Die Mittel zur Änderung der Daten werden als Methoden bezeichnet. In der reinen Objektorientierung kann auf die Daten eines Objekts nur mithilfe der Methoden des Objekts zugegriffen werden. Vorstellen kann man sich das folgendermaßen:
Kapselung

Die Daten sind vollständig von den Methoden umgeben, ein Zugriff kann somit nur durch die Methoden erfolgen. So wird die Manipulation der Daten durch andere Objekte verhindert. Außerdem wird sichergestellt, dass die Daten nur Werte erhalten, die für sie vorgesehen sind. Bei diesem Vorgang, dass Daten nur durch objekteigene Methoden abgefragt und verändert werden können, spricht man von Kapselung, bzw. Datenkapselung.


2.3.2 Abstraktion - Objekte vs. Klasse
Seitenfuß  Beziehungen 
Kapselung  Seitenkopf 


Alle miteinander kommunizierende Objekte können in Gruppen eingeteilt werden. So würden Minka (zur Erinnerung: die Perserkatze der Nachbarn) und die Perserkatze von Meiers in die Gruppe der Perserkatzen eingeordnet werden können. In der Biologie spricht man bei solchen Gruppen von Klassen. Tiere mit annähernd gleichen Eigenschaften und Verhaltensweisen gehören zur selben Klasse. Perserkatzen wären also eine Klasse. Im Gegensatz dazu sind die konkreten Dinge Objekte. Beispielsweise wären Minka und Meiers Perserkatze Objekte. In der Objektorientierung sind Klassen quasi die Baupläne für Objekte dieser Klasse. In Klassen werden die Eigenschaften und Methoden von ähnlichen Objekten zusammengefasst und eine Anleitung zur Herstellung eines Objektes, das zu dieser Klasse von Objekten gehören soll, gegeben. Unwichtige Details, wie das eingerissene Ohr von Meiers Perserkatze, fließen in den Bauplan nicht mit ein. Es wird abstrahiert. Klassen sind die Abstraktionen von Objektgruppen, wohingegen Objekte konkrete Umsetzungen bzw. Ausführungen von Klassen sind.


2.3.3 Beziehungen - Aggregation, Verwendung und Vererbung
Seitenfuß  Polymorphismus 
Abstraktion  Seitenkopf 


In der Realität stehen Gegenstände mit anderen in Beziehung. Minka sitzt auf dem Tisch, welcher vor der Wand steht. Perserkatzen sehen anderen Katzen ähnlich, weisen aber auch Ähnlichkeit zu Hunden auf. Bestandteile von Hunden und Katzen sind Fell, Kopf, Füße, Organe usw. Diese Beziehungen zwischen Objekten werden in der OOP im Wesentlichen in drei Grundtypen eingeteilt:
"ist Teil von"-Beziehungen (Aggregationen)
Verwendungsbeziehungen (Assoziationen)
"ist ein"-Beziehungen (Vererbung)
 
Aggregationen
Die "ist Teil von"-Beziehung kann verwendet werden, um Objekte, die andere besitzen oder selber Teil von einem Objekt sind, darzustellen. Beispielsweise sind Festplatte, Motherboard und diverse Laufwerke, Teile eines Computers. Der Computer setzt sich aus diesen Teilen zusammen. Die Teile selbst bestehen aber auch wieder aus anderen Teilen. So bestehen Festplatten aus einer Magnetscheibe, Schaltkreisen und vielen anderen Dingen. Solche "ist Teil von"-Beziehungen werden in der Objektorientierung als Aggregationen bezeichnet. Sie werden durch Membervariablen(Eigenschaften) realisiert. Ein Computer würde Membervariablen, die jeweils Motherbord, Laufwerke oder Festplatten darstellen, besitzen. Die Eigenschaften des Computers sind jedoch selbst, wie der Computer, auch wieder Objekte. Dadurch kann die Festplatte wiederum Membervariablen für Schaltkreise, die Magnetscheibe usw. enthalten.
Aggregation

Im Allgemeinen spricht man von Aggregationen, wenn mindestens ein Objekt vom anderen abhängig ist. (Der Computer ist von der Existenz seiner Teile abhängig, ohne sie wäre er kein Computer.)
 
Assoziationen
Aggregationen ähnlich sind die Verwendungsbeziehungen, welche man auch als Assoziationen bezeichnen kann. Sie werden verwendet, um zu zeigen, dass ein Objekt ein anderes nur benötigt, um eine bestimmte Aufgabe zu erfüllen. Sobald die Aufgabe erledigt ist, wird das Objekt nicht mehr benötigt und kann aus dem Speicher gelöscht werden. Zum Beispiel könnte ich ein Blattpapier zerschneiden, wozu ich ein Blatt und eine Schere nehme, und mit der Schere das Blatt zerschneide. Aus objektorientierter Sicht könnte man diesen Vorgang folgendermaßen beschreiben: Ich bin ein Objekt der Klasse Mensch und besitze die Methode "schneide(Gegenstand)". Dieser Methode muss der zu schneidende Gegenstand übergeben werden, also das Blatt. Um das Blatt zu zerschneiden, würde "schneide(Gegenstand)" nun einen Gegenstand, mit dem das Schneiden erledigt werden soll, erstellen. Beispielsweise eine Schere, mit welcher das Schneiden dann ausgeführt wird:
Assoziation

Da die Schere nur hierfür erstellt wurde, kann sie danach wieder gelöscht werden. Es wird ein Objekt zur Erledigung nur einer Aufgabe erzeugt. Diese nur einmal benötigten Objekte sind quasi die Membervariablen von Methoden. Wie beim Löschen eines Objektes seine Eigenschaften gelöscht werden, werden bei der Beendigung von Methoden auch die von ihnen erzeugten Objekte gelöscht.
 
Vererbung
Die dritte Art der Beziehungen findet sich oft in der Realität wieder: Perserkatzen (wie Minka) können als Perserkatzen bezeichnet werden, es sind aber gleichzeitig auch Katzen. Hunde und Katzen sind Haustiere. Alle Haustiere sind Tiere. Solche "ist ein"-Beziehungen können meist als Hierarchien dargestellt werden. Die Tiere sind bei diesem Beispiel die allgemeinste Klasse, ihnen können alle anderen (Haustiere, Katzen, Perserkatzen...) untergeordnet werden, da alle anderen die Eigenschaften von Tieren besitzen. In der Objektorientierung, wie auch in der Realität, spricht man von Vererbung. Die Eigenschaften und Methoden der Tiere werden an Haustiere, Katzen und Perserkatzen vererbt. Bei jeder Verbungsstufe können neue Eigenschaften oder Methoden hinzukommen, wodurch die erbenden Klassen spezialisiert werden. Die Vererbungshierarchie der Tiere könnte demnach folgendermaßen aussehen:
Vererbungsschema

Allgemein wird die Vererbungsbeziehung in der Objektorientierung zur Darstellung von Ähnlichkeiten zwischen Klassen verwendet werden.


2.3.4 Polymorphismus
Seitenfuß  Zusammenfassung 
Beziehungen  Seitenkopf 


Das letzte wichtige Konzept der Objektorientierung ist der Polymorphismus. Polymorphismus kommt aus dem Griechischen und bedeutet soviel wie "Vielgestaltigkeit". Gemeint ist hiermit die Möglichkeit, einer Variablen bestimmten Typs, auch Objekte von aus diesem Typ abgeleiteten Klassen zuzuweisen. So kann eine Variable des Typs Tier auch Objekte der Klasse Perserkatze oder Schwertfisch aufnehmen. Jedes Tier kann sich bewegen. Im objektorientierten Sinn besitzt es eine Methode "bewege()". Da Perserkatze und Schwertfisch von Tier abgeleitet sind, besitzen sie ebenfalls diese Methode, können jedoch selbst entscheiden wie diese auszuführen ist. Ruft man beim Schwertfisch die Methode "bewege()" auf so schwimmt er, im Gegensatz dazu läuft die Perserkatze. Wenn nun einer Variablen des Typs Tier ein Schwertfisch und einer anderen eine Perserkatze zugewiesen wird, und auf beide Objekte "bewege()" ausgeführt wird, so reagieren beide Objekte unterschiedlich. Die Ausführung ist "vielgestaltig".


2.4 Zusammenfassung
Seitenfuß 
Zusammenfassung
Polymorphismus  Seitenkopf 


Objektorientierung ist ein Programmierkonzept welches sich sehr stark an die Realität anlehnt. Zusammenhänge aus unserer Umwelt können praktisch übernommen werden. Ein guter Nebeneffekt dieser Sichtweise ist die Wiederverwendung. Durch Abstraktion, Vererbung und Aggregation können einmal als Klassen beschriebene Objekte wiederverwendet, weitervererbt und beliebig kombiniert werden. Um diese Vorteile in Aktion zu sehen, sehen wir uns jetzt eine objektorientierte Programmiersprache genauer an!



©2002 by Th. Zeume