ein Projekt von goloroden.de
Skip Navigation Linksguide to C# > Guide > Objektorientierung

Objektorientierung

Prozedurales Paradigma

In den vergangenen Kapiteln wurde C# als objektorientierte Sprache bezeichnet, wobei dieser Begriff bislang noch nicht näher erläutert wurde.

Um das Konzept der Objektorientierung zu verstehen, muss man wissen, wie Programmiersprachen früher aufgebaut waren. Im vorherigen Kapitel wurde die Entwicklung von Anwendungen im wesentlichen als Modellierung und Organisation von Datenstrukturen und als Aufbau der entsprechenden datenverarbeitenden Verfahren bezeichnet.

Weil Daten ein dermaßen grundlegendes Element für die Entwicklung von Anwendungen darstellen, kann de facto keine Anwendung ohne Daten bestehen. Damit diese aber überhaupt verarbeitet werden können, müssen sie der Anwendung zunächst als Eingabe vorliegen. Zudem wird eine Ausgabemöglichkeit benötigt, um die verarbeiteten Daten an den Benutzer zurückzugeben.

Diese Aspekte jeder Anwendung - das ursprüngliche Einlesen der zu verarbeitenden Daten, die eigentliche Verarbeitung und schließlich die Ausgabe von Ergebnissen - werden in der Informatik als EVA-Prinzip bezeichnet, wobei EVA als Akronym für Eingabe, Verarbeitung und Ausgabe steht.

Allerdings darf dabei nicht vergessen werden, dass verschiedene Arten von Daten bestehen, die dementsprechend auch unterschiedlich modelliert und gehandhabt werden müssen. Zudem muss dieser Diversität in Programmiersprachen Rechnung getragen werden, weshalb es dort sogenannte Typen gibt, die jeweils eine spezielle Art von Daten repräsentieren.

In klassischen Programmiersprachen gibt es nur einfache Typen, um elementare Daten aufzunehmen, wie beispielsweise Typen zur Speicherung einer Ganzzahl, einer Dezimalzahl oder eines Buchstaben. Die Verwendung nur dieser einfachen Typen reicht bereits aus, um alle möglichen Daten abzubilden, allerdings ist dafür teilweise eine aufwändige Umwandlung komplexer Daten in einfache Typen notwendig.

Neben der potenziell aufwändigen Umwandlung birgt dieses Verfahren noch einen weiteren essenziellen Nachteil: Ein komplexer Typ wird nicht als komplexer Typ verarbeitet, sondern als Menge von einfachen Typen. Dass diese einfachen Typen gemeinsam einen komplexen Typ darstellen, kann nicht explizit abgebildet werden, statt dessen ist dieses Wissen nur noch implizit vorhanden.

Ein komplexer Typ, wie beispielsweise eine Person, der auf die einfachen Typen Nachname, Vorname und Alter abgebildet wird, ist demzufolge in der Anwendung nicht mehr als komplexer Typ vorhanden, sondern er besteht nur noch in den eigenständigen einfachen Typen für Nachname, Vorname und Alter. Die Entscheidung, diese einfachen Typen wieder zu einem komplexen Typ zusammenzufügen, obliegt dem Entwickler.

Außerdem werden einzelne Typen in klassischen Programmiersprachen nicht voneinander abgeschirmt, das heißt, jeder Teil der Anwendung kann auf sämtliche Daten unbeschränkt zugreifen. Dass dies nicht nur die gezielte, sondern auch die unbeabsichtigte Veränderung von Daten ermöglicht und damit potenziell eine Quelle für zahlreiche, aber nicht offensichtliche Fehler darstellt, liegt auf der Hand.

Aus all diesen Gründen liegt der Schwerpunkt bei der Entwicklung von Anwendungen in den klassischen Programmiersprachen auf dem Code, der die Typen und damit die Daten verarbeitet, und nicht auf den Typen selbst. Da dabei häufig benötigte Codezeilen in Funktionen - sogenannten Prozeduren - zusammengefasst werden, wird diese Art der Entwicklung als prozedurales Paradigma bezeichnet.

Objektorientiertes Paradigma

Für die Entwicklung komplexer Anwendungen ist das prozedurale Paradigma allerdings nicht tragfähig und stößt schnell an seine Grenzen. Die wesentlichen Probleme dabei sind neben den ungenügenden Typen und den fehlerhaften und ungültigen Zugriffen zumeist das redundante Zurverfügungstellen von Daten an verschiedenen Stellen der Anwendung sowie häufig eine nicht überschaubare Komplexität.

Betrachtet man die reale Welt, dann fällt auf, dass man in der Regel mit komplexen Typen in Berührung kommt, deren Komplexität deutlich über der einer Zahl oder eines Buchstaben liegt. Die in den klassischen Programmiersprachen gängigen einfachen Typen treten hingegen nur selten eigenständig auf.

Die Objekte der realen Welt haben wie komplexe Typen gewisse Eigenschaften, verfügen zudem aber noch über Aktionen, die sie ausführen können. So verfügt eine Person als Objekt neben den bereits erwähnten Daten wie Nachname, Vorname und Alter auch über Aktionen, wie beispielsweise laufen, lesen und schlafen. Auf diese Art, nämlich die Zweiteilung in Eigenschaften und Aktionen, kann fast jedes Objekt hinreichend beschrieben werden.

Der entscheidende Punkt bei dieser Darstellung ist, dass jedes Objekt für sich über die Information verfügt, welche Aktionen es in einem gegebenen Kontext ausführen kann - es handelt autonom. Außerdem sind die Eigenschaften eines Objektes von außen nicht einsehbar, denn um Daten zu erhalten, muss eine entsprechende Anfrage gestellt werden, die einer Aktion entspricht.

Dieses Prinzip, die internen Daten zu verbergen und nach außen nur über kontrollierte Aktionen zur Verfügung zu stellen, wird als Information Hiding bezeichnet und ist eine weitere wesentliche Voraussetzung für die Autonomie von Objekten. Diese Autonomie wiederum ist die Basis für die Entwicklung komponentenorientierter Anwendungen.

Der komplexe Typ, der einem Objekt zu Grunde liegt, wird dabei als Klasse bezeichnet. Im Gegensatz zum Objekt, das eine konkrete Ausprägung darstellt, repräsentiert die Klasse lediglich den Bauplan für dieses Objekt. Daher kann es zwar zahlreiche Objekte geben, die auf der selben Klasse basieren, allerdings hat jedes Objekt nur genau eine Klasse, die den Aufbau des Objektes beschreibt.

Die Klasse Person definiert also, welche Eigenschaften und Aktionen eine konkrete Person auszeichnen - sie stellt aber keine konkrete Person dar, ebenso wenig wie ein Bauplan eines Hauses ein konkretes Haus darstellt. Erst ein Objekt der Klasse Person repräsentiert eine konkrete Person. Da ein Objekt also eine konkrete Ausprägung darstellt, wird es auch als Instanz einer Klasse und seine Erzeugung als Instanziierung bezeichnet.

Im Unterschied zum prozeduralen Paradigma ist der Code, der die Objekte verarbeitet, in den Objekten selbst enthalten, weshalb auf Klassen und Objekten basierende Anwendungen deutlich weniger codezentrisch aufgebaut sind als klassische Anwendungen. Statt dessen wird sehr viel mehr Augenmerk auf die Modellierung und Organisation der notwendigen Klassen und der Verbindungen zwischen ihnen gelegt.

Auf Grund der Fokussierung auf Objekte wird diese Art, Anwendungen zu entwickeln, als objektorientiertes Paradigma oder auch als objektorientierte Programmierung bezeichnet. Dieses Paradigma ist die Basis jeglicher modernen Anwendungsentwicklung und wird von fast allen modernen Programmiersprachen unterstützt oder - bei konsequent objektorientierten Sprachen wie C# - sogar gefordert.