Vorteile von objektorientierter Programmierung


Für Außenstehende ist es mitunter schwer einzusehen, warum sie objektorientiert programmieren sollen, wenn man doch mit normaler prozeduraler Programmierung ebenfalls ansehnliche Ergebnisse erzielt. Diese Frage nimmt auch innerhalb der Computergeschicht einen festen Platz ein. Branchenübergreifend hat man erst relativ spät die Vorteile von OOP erkannt. So richtig los mit C++ ging es erst Mitte der 1980’er und dort eher gemächlich. Später kamen dann weitere OOP-Sprachen hinzu wie Delphi, Java, C# und Python. Das Geheimnis hinter objektorientier Programmierung will ich im folgenden darlegen. Das Hauptproblem mit dem Programmierer zu kämpfen haben sind Lines of Code. Damit ist gemeint, dass jede Programmiersprache geeignet ist wenn man kurze Programme schreiben will. Selbst in Assember lässt sich übersichtlicher Code schreiben, wenn man mit 100 Lines of Code auskommt. Doch wehe die Probleme sind größer und erfordern zwingend 1000 Lines of Code oder noch mehr. Dann wird deutlich was der Vorteil von OOP ist. Sehr allgemein gesagt besteht der Hauptvorteil darin, dass man zuerst Klassen erzeugt, die dann nicht in der Lage sind auf andere Klassen zuzugreifen.

Vielleicht ein Beispiel: Angenommen man definiert in Python eine neue Klasse. Erweitert also die vorhandenen 1000 Lines of Code um zwei weitere Zeilen. Dann ist es so, dass diese neue Klasse die Variablen im restlichen Programm nicht ändern darf, nicht lesen darf, und auch auf die anderen Methoden nicht zugreifen darf. Das heißt, man definiert sich eine neue Klasse nur um zu erfahren, dass alles verboten ist, was irgendwie nützlich wäre. Jetzt fragt man sich: was soll der Betrug? Aber genau darum geht es bei OOP. Man startet in einer seperaten Box und muss einzeln freischalten wenn man Zugriffsrechte benötigt. Nehmen wir mal an, die neue Klasse möchte auf eine vorhandene Klasse zugreifen. Dann geht das relativ leicht, man kann das in der Vererbungshierarchie einstellen. Aber, sie darf dann wirklich nur diese eine Klasse verwenden, will man Zugriff auf weitere Klassen muss das extra einstellen.

Ein wenig erinnert das an eine sehr restriktiv eingestellte Firewall, wo standardmäßig jeder Netzwerktraffic blockiert ist und man Einzeln Ausnahmen definiert. Die Hauptfrage mit der sich OOP Programmierer beschäftigen ist, wie sie Zugriff erhalten auf den Code der schon da ist. Das mag jetzt wie ein Nachteil klingen, gegenüber der Prozeduralen Programmierung wo solche Probleme nicht auftreten. Erleichtert aber die Programmierung ungemein. Man kann sich das so vorstellen: egal wie umfangreich der vorhandene Code ist, die neu eingebaute Klasse ist immer extrem gut aufgeräumt und sehr übersichtlich. Es ist jedesmal eine frische Sandbox, ein Programm im Programm. Wenn man dort eine Variable definiert, kann ist ihre Reichweite auf diese Klasse beschränkt.

Jetzt schauen wir uns ein UML Diagramm an. Im Grunde besagen die Verbindungslinien zwischen den Klassen nichts anderes, als dass vom Standard abgewichen wurde, und man einzeln den Klassen zugriffsrechte gewährt. Befinden sich die Klassen in einer gemeinsamen Vererbungshierarchie haben sie ausnahmsweise doch Zugriff auf die anderen Methoden und Variablen. Und wurden sie instanziert, kann man ebenfalls von außen Werte abändern. Die UML Verbindungslinien sind eine Art von Prozessfluss um zwischen abgeschotteten Bereichen doch noch Informationen fließen zu lassen. Es wäre nicht sehr zielführend, wenn die Klassen komplett isoliert wären, dann würde das Programm am Ende nicht gut zusammenarbeiten.

Jetzt vergleichen wir das OOP Konzept mit prozeduraler Programmierung. In einem prozeduralen Programm aus 2000 Lines of Code würde man eine Handvoll von Methoden definieren, vielleicht 20 vielleicht aber auch etwas mehr (30). Diese greifen dann auf einen gemeinsamen Datenbereich zu. Soweit die Theorie. Aus Compiler Sicht gibt es da keinerlei Probleme zu befürchten. Der Code wird sauber übersetzt und wird in Rekordzeit butterweich auf der CPU ausgeführt. Wenn man dann noch effiziente Algorithmen benutzt, beispielsweise Quicksort anstatt das langweilige Bubblesort, erhält man hocheffizienten Code. Aber, das Problem macht sich bemerkbar wenn man plant den Code zu verändern. Man sitzt dann vor 2000 Lines of Code, der auf 30 Methoden verteilt ist, die irgendwie zusammenarbeiten und wo unklar ist, wer was macht. Das Programm funktioniert als großes Ganzes, ist also über 2000 Zeilen verteilt. Es ist so, als wenn man eine große Megaklasse mit 2000 Zeilen hat. Will man auch nur 10 Zeilen hinzufügen, muss man die kompletten 2000 Zeilen im Blick haben, sonst gibt es Seiteneffekte.

Auf den ersten Blick macht prozedurale Programmierung Sinn, weil man ohne große Nachzudenken jede Variable ändern darf und aus Prozedur #12 die Prozedur #22 aufrufen kann. Nur, in der Praxis ist es so, dass genau diese Freiheit dazu führt, dass man als Programmierer den Überblick verliert. Man verzettelt sich im Code, ist nicht in der Lage den Code in seiner Gesamtheit zu überblicken. und 2000 Zeilen sind noch relativ wenig, bei größeren Projekten wird es noch schlimmer.

Um ein Gefühl für objektorientiere Programmierung zu erhalten ist es sinnvoll mit einem simplen Beispiel anzufangen. Man definiert sich in Python 2 Klassen, die ganz normal mit Print etwas ausgeben. Und jetzt versucht man aus Klasse 1 eine Methode aus Klasse aufzurufen. Wenn man alles richtig gemacht hat, wird der Python Interpreter mit einer Fehlermeldung antworten und sagen, dass man es nicht darf. Weil sich die Methode in der anderen Klasse befindet und die ist per Definition Feindesland. Genau dieses verwehrte Zugriff ist das eigentliche Feature von OOP. Weil jetzt der Programmierer gefordert ist nachzugrübeln, wie er eben doch Zugriff erlangt. Er muss sich überlegen, wie die beiden Klassen inhaltlich zueinander stehen und wo er im UML Diagramm die Verbindungslinie ziehen will. Macht er es nicht, erhält er keinen Zugriff.

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s