Sie sind hier: Startseite / Dokumentation und Support / FAQs / Was bedeutet Objektorientierung?

Was bedeutet Objektorientierung?

Die dynamische Programmiersprache Python gehört zur sogenannten vierten Generation von Programmiersprachen. Diese Klasse von Programmiersprachen folgt dem Programmier-Paradigma der Objektorientierung. Dieser Beitrag versucht eine Begriffserklärung und soll eine Einführung in die Terminologie der Objektorientierung geben.

Objektorientierte Programmiersprachen (OOP) wie Python, aber auch weitere Sprachen wie C++, Ruby, Java, Java-Script oder LISP u.a. gehören zur vierten Generation (4GL) von Programmiersprachen. Jede neue Generation von Programmiersprachen hat u.a. die Verbesserung von Software-Entwicklungsmethoden zum Ziel. Diese Weiterentwicklung von Sprachen dient in erster Linie der Qualitätsicherung und damit vor allem der Zuverlässigkeit von Software, um so deren mögliche Fehlerfreiheit einfacher zu ermöglichen.

Die Entwicklungen von Programmiersprachen begann in den 50ziger Jahren mit der Maschinensprache. In den 60ziger Jahren wurden dann sogenannte Assembler-Sprachen entwickelt. Die erste Steigerung der Abstraktion bei Erstellung von Software ergab sich in den 70ziger Jahren mit der Einführung sogenannter Prozeduraler bzw. Strukturierter Programmiersprachen. Bis zu diesem Zeitpunkt wurde aller Programmcode von allen Daten einer Software im Arbeitsspeicher in getrennten Speicherbereichen verwaltet. Alle Programmroutinen konnten auf alle Daten im Datenspeicherbereich zugreifen. Das führte mit zunehmender Komplexität von Softwareprogrammen zu kaum noch unlösbaren Testproblemen. Diese zunehmenden Testprobleme führten dann in den 80ziger Jahren zur verstärkten Entwicklung bzw. Weiterentwicklung der sogenannten objektorientierten Programmiersprachen, wie z.B. C++.

Mit dieser Entwicklung gab man die bis dahin übliche Unterscheidung des inneren Aufbaus von Software in Programm-Strukturen und Daten-Strukturen dann auch auf.

Parallel zu diesen sogenannten statischen Compiler-Sprachen entwickelten sich mit der zunehmenden Rechenleistung von neueren Computersystemen auch die dynamische Interpreter-Sprache Perl. In den 90ziger Jahren kamen dann noch Python und Ruby hinzu. Man nennt diese dynamischen Sprachen auch Protoyping-Sprachen, da sie eine schnelle und effektive Softwareentwicklung erlaubt und erst in einem nachfolgenden zweiten Entwicklungsschritt werden zeitkritische Softwareanteile in statische Sprachen wie z.B. C übersetzt.

Die Einführung von OOP erlaubte es die Anzahl von Programmierzeilen einer Software durch Einführung von Abstraktionskonzepten drastisch zu verringern, was wiederum die Produktivität der Softwareerstellung als auch ihre Testbarkeit signifkant verbesserte. Die gesamte Software-Entwicklung wurde dadurch sehr viel effektiver für die Modelierung, aber auch effizienter in der Programmerstellung und damit kostengünstiger.

Programme im Arbeitsspeicher von Rechnersystemen sollten also möglichst nicht unkontrolliert auf die Datenbereiche des Arbeitsspeichers zugreifen können, da dies einer der Hauptfehlerursachen in der Software-Entwicklung darstellt. Deshalb hat man u.a. das Abstraktionskonzept von Objekt(en) entwickelt, die den Datenbereich mit den Programmteilen, die auf sie zugreifen (dürfen) vereint bzw. verkapselt, nämlich zu einem Objekt.

Daten werden nicht mehr direkt in frei zugänglichen Variablen oder Datenstrukturen, sondern in Form eines Objektes in seinen ihm zugeordneten sogenannten Attributen gespeichert. Programme bzw. Funktionen oder Prozeduren, die auf diese eingegrenzte Datenmenge zugreifen darf werden zu sogenannten Methoden des jeweiligen Objektes. Nun sind die Daten nur noch über das Objekt erreichbar. Namen von Attributen, die die Daten beinhalten gelten nur noch im Rahmen des sogenannten Namensraums des jeweiligen Objektes.

Der Begriff der Objektorientierung ist ein neuzeitlicheres Programmier-Paradigma, das im Wesentlichen auf folgenden Modellierungskonzepten basiert:

Eine kleine Einführung in Deutsch zu diesen Begriffen im Kontext der Programmiersprachen Python.

Kapselung

Das Modelierungskonzept Kapselung vereint Programmroutinen mit den Datenbereichen, auf die sie zugreifen dürfen, in ein sogenannten Objekt. Somit können andere Programmteile nicht mehr direkt auf die Daten des Objektes zugreifen. Das geht nun nur noch über das Interface des Objektes, also seiner sogenannten Attribute.

Attribut ist der Oberbegriff für Daten-Attribute und Methoden-Attribute eines Objektes.

Ein Objekt kann sowohl eine Klasse sein, als auch eine sogenannte Instanz einer Klasse. Aber auch Atrribute und somit auch Methoden sind Objekt. Methoden-Objekte können nicht zu Instanzen, sondern nur zu Klassen hinzugefügt werden.

Eine Klasse kann sich wie einen Bauplan für Instanzen dieser Klasse vorstellen. Würde man z.B. einen Bauplan für ein Haus nutzen, um den darin dargestellten Haustyp zu erstellen, so sind der Bauplan die Klasse und die gebauten Häuser die Instanzen der Klasse.

Eine Instanz ist also ein erstelltes Objekt, das nach einem "Bauplan", also entsprechend der Definition einer Klasse erstellt wurde.

Somit ist eine Klasse eine Art Blaupause für davon abgeleiteten Objekte, die sogenannte Instanzen.

Das Konzept der Kapselung von Daten (Attribute) und Programmroutinen (Methoden) ermöglciht die Komplexität der Software zu "verstecken". Dadurch wird für Programmierer, die mit OOP vertraut sind, dier gesamte Souce-Code einer Software wesentlich besser lesbar, was der Team basierten Software-Entwicklung sehr zu entgegen kommt und damit mehr Transparenz in die Software-Entwicklung bringt.

Vererbung

ist ein Konzept der Modelierung vom Allgemeinen hin zum Speziellen. D.h. man fügt allgemeine Eigenschaften einer Klasse in in Form von Attributen zu einer Klasse hinzu und fügt auch noch die dazu passenden allgemeinen Fähigkeiten (Methoden) zu eben dieser Klasse hinzu. Attribute bilden damit den jeweiligen Zustand eines Softwaresystems ab und die Methoden beinhalten das mögliche Verhalten des Softwaresystems und beinhalten damit alle kodierten Programmzeilen eines Softwaresystems gruppiert in eine Art Container namens Methode(n).

Als nächstes fasst man schon etwas speziellere Eigenschaften (Attribute) und Fähigkeiten (Methoden) zu einer sogenannten Unterklasse zusammen und lässt solch eine sogenannte Unterklasse die Eigenschaften und Methoden der allgemeinen Klasse erben.

Solch ein Modelierungskonzept hilft, um jeden Aspekt eines Programmes auch nur einmal kodieren zu müssen, also um keine Programmzeile wiederholen zu müssen. Man spricht auch vom Programmierparadigma DRY (Don't-Repeat-Yourself).

Die Abstraktionsebenen von Objekten lassen sich in Meta-Klassen, Klassen, Unterklassen und Instanzen unterteilen. Aber alle diese Kategorien von Klassen sind eben auch Objekt! Alles ist Objekt in der OOP und damit eben auch und vor allem in der Programmiersprache Python.

Schon die Mehrfachverwendung von Basisklassen durch Unterklassen verringert die Anzahl von Source-Code Zeilen signifikant und erhöht dadurch nicht nur deutlich die Lesbarkeit, sondern auch die Testbarkeit von Software.

Die Programmiersprache Python unterstützt auch andere Programmier-Paradigma wie Mehrfachvererbung und Funktionale Programmierung. Ein Konzept, das es ermöglicht auch Aspect-Oriented-Programming (AOP) Konzepte umzusetzen.

Beispiel: Licht kann sowohl Wellen- wie auch Teilchen-Charakter zeigen. Nun könnte man in Python verschiedene Klassen modelieren, die jeweils alle Welleneigenschaften sowie andererseits alle Teilcheneigenschaften modelieren. Eine zusätzliche Klasse für Licht bzw Lichtquanten könnten dann von beiden Klassen für Wellen- und Teilcheneigenschaften erben.

Polymorphismus

Dieses Konzept bezeichnet im Wesentlichen das Überladen von Operatoren. D.h. das z.B. der Operator '+' bzw die Addition auf verschieden Typen von Daten angewendet werden können.

Z.B. lassen sich Zahlen ebenso wie Zeichenketten (Strings) addieren bzw. verketten. Dafür wird in Python der selbe Operator '+' verwendet.

Beispiel:

>> 7 + 5

12

>> "abc" + "efg"

abcefg

In beiden Fällen wird der selbe Operator '+' verwendet. Für eigenen Klassen wäre die Definition einer Methode '__add__' für diese Klasse zu erstellen, damit auch für eigene Objekte der Operator '+' verwendet werden kann.

Abstraktion

Das Konzept der Abstraktion soll in erster Linie dabei helfen Softwareanteile in generischer Form zu erstellen, um dadurch eine Wiederverwendbarkeit in anderen Projekten zu ermöglichen. Als Ergebnis aus dieser Entwicklung haben sich sogenannte Framework mittlerweile weit verbreitet.

Teil der Entwicklung solcher Abstraktionen ist die Entwicklung von Komponenten. Sie soll helfen die Entwicklung von generischer Software zu vereinheitlichen. Zudem ist sie eine neue Form der Interface basierten Softwareentwicklung.

Abstraktion hilft außerdem den Umfang von Source-Code Zeilen erheblich zu verringern und damit auch die Lesbarkeit und dadurch auch die Testbarkeit signifikant zu verbessern.

Das CMS Plone baut auf solch einem Framework namens Zope 2. Zope wurde in der OOP-Sprache Python entwickelt. Wer den inneren Aufbau des CMS Plone und vor allem des ihm zugrundeliegenden Frameworks Zope 2, sowie das ihm zugrunde liegenede Komponenten-Model verstehen möchte, kommt nicht umhin, sich damit eingehender zu beschäftigen. Leider gibt es diese Einführung zum Komponenten-Model von Zope nur in der englischen Sprache.

Hat man das Komponenten-Model von Zope verstanden wird es allerdings möglich das CMS Plone auch selbst zu gestalten und zwar nicht nur in seiner Erscheinungsform (Schemes), sondern auch und vor allem in seinem Verhalten und der Gestaltung seiner User-Interfaces.