Im Tutorial über abstrakte Datentypen haben wir uns angesehen, wie ADTs verwendet werden können, um bestimmte Daten und Operationen auf diese Daten in einer Weise zu modellieren, die nicht implementierungsspezifisch ist.
Die Objektorientierung erweitert dieses Konzept und bietet eine Möglichkeit, das Programmierproblem in einzelne Einheiten – Objekte – aufzuteilen, die das ADT und alle damit verbundenen Funktionen vollständig kapseln, aber so konzipiert sind, dass sie miteinander interagieren und ein ganzes System bilden.
OO Entwurf
Die Objektorientierung muss zunächst unter dem Aspekt des Entwurfs betrachtet werden, da wir wissen müssen, aus welchen Objekten unser System bestehen wird und welche Schnittstellen sie bieten werden, bevor wir mit der Implementierung beginnen.
In dieser Phase entscheiden wir auch über die Granularität des gewünschten Systems und darüber, welche Objekte wir aus früheren Projekten wiederverwenden können. Damit soll nicht gesagt werden, dass OO nur für große Systeme geeignet ist, sondern nur, dass es als Paradigma vor der Ausführung der Implementierung durchdacht werden muss, da Fehler im Nachhinein schwer zu korrigieren sind.
Wenn wir zum Beispiel entscheiden, dass wir in unserem System ein Buch als ein einziges Dokument speichern können, wäre es schwierig, diese Entscheidung während der Implementierung rückgängig zu machen, wenn wir plötzlich feststellen, dass wir, um es zu drucken, in Seiten denken müssen.
Im Allgemeinen ist es für Programmierer sinnvoller, vom kleinstmöglichen Objekt auszugehen und von dort aus ein System zu entwickeln – Bücher bestehen aus Seiten, diese aus Sätzen, diese aus Wörtern, diese aus Buchstaben…
Jedes Objekt muss in Bezug auf die Daten definiert werden, die es bearbeiten soll (sein eigenes ADT oder in Bezug auf andere Objekte im System), und die Methoden, die es anderen Objekten im System, die es verwenden möchten, zur Verfügung stellen wird.
Wir sagen, dass die Informationen im Objekt versteckt oder gekapselt sind und die einzige Möglichkeit, auf sie zuzugreifen, darin besteht, eine bestimmte Methode aufzurufen, die die Daten in einem bestimmten Format zurückgibt. Dieses Format ist wahrscheinlich nicht ganz dasselbe wie die interne Darstellung, aber als Programmierer braucht man diese Informationen an der Schnittstelle nicht.
OO-Programmierung
Die Umsetzung des OO-Entwurfs erfordert die Erstellung von Klassen zur Definition der Objekte und von Instanzen dieser Klassen für die Laufzeitelemente, die zur Bereitstellung des Systems zusammenwirken.
Jede Klasse benötigt eine Möglichkeit, sich selbst zu initialisieren (den Konstruktor), eine Möglichkeit, den Speicher zu löschen, der für die Speicherung ihres internen Zustands verwendet wurde, eine Definition der Daten, aus denen ihr interner Zustand besteht, und eine Methode für jede Interaktion, die das Objekt erlaubt.
Das bedeutet, dass es für jede Art von Daten, die das Objekt verwaltet, eine Methode zum Abrufen und Setzen von Daten gibt. Bei einer Adressbuchanwendung könnte jede Adresse in einem Objekt enthalten sein, das Methoden zum Abrufen und Setzen von Name, Adresse, Telefonnummer usw. bereitstellt.
Das Adressbuch-Objekt selbst könnte viele Adressen enthalten, zusammen mit grundlegenden Suchfunktionen, die uns eine Interaktion wie die folgende ermöglichen:
oAddressBook-FindEntryByName(szName)-SetPhoneNumber(szNumber);
(Die obige Darstellung ist C++-spezifisch, aber andere Sprachen erlauben ähnlich gestaltete Ausdrücke).
Schlussfolgerung
Zu OO-Analyse, -Entwurf und -Programmierung gehört noch viel mehr, aber die obigen Ausführungen geben einen guten Überblick über einige der Grundsätze und Begriffe, die in diesem komplexen Bereich der Computerprogrammierung verwendet werden.
Im Allgemeinen werden fortgeschrittene Programmierer die Objektorientierung aktiv nutzen, während Anfänger sich entscheiden können, einen Teil der Prinzipien zu nutzen und zu einer Arbeitsweise zu gelangen, die für sie angenehm ist.
Bei der industriellen Programmierung hilft der Einsatz von OO-Techniken beim Aufbau einer Bibliothek oder von wiederverwendbaren Objekten, die den Vorteil haben, dass sie getestet sind und ein genau definiertes, vorhersehbares Verhalten aufweisen und sofort verwendet werden können. Im Laufe der Zeit führt dies zu einer Produktivitätssteigerung, auch wenn der anfängliche Aufwand höher ist als bei der Verwendung anderer Techniken.