Objektorientierte Programmierung in Drupal


Vorwort

Irgendwie hat sich dieser Artikel in die Unendlichkeit verlängert, daher werde ich einen Zwei- oder Dreiteiler daraus machen. In diesem ersten Teil geht es lediglich um die Konzepte der Objektorientierten Programmierung und kann eigentlich getrost übersprungen werden, falls man damit bereits vertraut ist. Für alle anderen Empfehle ich doch schwer, sich diesen Artikel mal genüsslich zu lesen (und wahrscheinlich mal eine einfache Hello World Klasse zu schreiben und wohl via Google noch ein wenig mehr darüber zu lesen.

Wahrscheinlich hat schon jeder mal etwas von Objekten und Klassen gehört. Seit Java gross geworden ist, gehört es zu einer guten Software, dass sie eine Objekte Orientierte Architektur aufweist. Dieses Post soll in einigen Zeilen die Konzepte der Objekte Orientierten Programmierung (OOP) vermitteln und dann aufzeigen, wie diese für die Entwicklung von Drupal Modulen eingesetzt werden kann.

Was ist ein Objekt?

Das Konzept von Klassen und Objekten ist für den Anfänger nicht ganz so einfach zu verstehen. Ist der Groschen dann jedoch einmal gefallen, dann kann man es sich nicht mehr vorstellen, dass man es einmal nicht verstanden hat (wohl ähnlich wie beim Autofahren). Ich werde mal versuchen, es in meinen Worten zu erklären. Falls diese nicht verständlich sind, dann gibt es sehr viele Bücher, die versuchen es zu erklären. Google ist dein Freund.

Es gibt Klassen und es gibt Objekte. Klassen sind nicht gleich Objekten! Dies mal als Grundlage. Eine Klasse kann als Bauplan verstanden werden. Diese Klasse gibt vor, wie ein Objekt gebaut werden muss. Nehmen wir an, wir hätten eine Klasse "Auto". Diese Klasse kann nichts machen, sprich das Auto kann nicht fahren, denn es ist lediglich ein Bauplan für ein Auto. Die Klasse "Auto" schreibt jedoch folgende Dinge vor: Ein Auto hat: 4 Räder, es kann vorwärts und Rückwärts fahren und es ist grün. (ein sehr triviales Auto). Der Plan (die Klasse für dieses Auto würde in PHP wie folgt aussehen:

<!–?php
Class Auto{
private wheels = 4;
private color = "green";

public function driveForward(){
//Hier Code, damit Auto vorwärts fährt.
}

public function driveBackward(){
//hier Code, damit Auto rückwärts fährt.
}
}
?>

Es gibt Variablen und es gibt Methoden (oder auch Funktionen). Die Variablen beschreiben Eigenschaften des Autos, während die Methoden die Funktionen des Autos beschreiben. Das ist jetzt der Plan. Wie gesagt, der Plan alleine kann noch nicht machen, dass dieses Auto fährt. Es ist lediglich der Bauplan für das Objekt!!!

Jetzt wollen wir das Auto zum Fahren bringen. Dazu müssen wir es jedoch zuerst bauen:

<!–?php
$auto = new Auto();
?>

So, jetzt ist das Auto erstellt. Wir können jetzt dem Auto sagen, dass es vorwärts fahren soll:

<!–?php
$auto->driveForward();
?>

Oky, damit ist hoffentlich ungefähr, was eine Klasse ist und was ein Objekt ist. Nochmals: Eine Klasse ist der Bauplan für das Objekt. Ein Objekt ist als eine sog. Instanz einer Klasse. Es gibt 1 Klasse für unser Auto, aber ich kann dann unendlich viele Instanzen davon erzeugen, sprich z.B. 100 Autos (Objekte).

Unser Beispiel mit dem Auto macht jedoch eigentlich erst Sinn, wenn mehrere verschiedene Objekte beteiligt sind: z.B. Das Objekt "Auto" hat ein Objekt "Motor", 4 Objekte "Räder", 4 Objekte "Tür" usw. Wie man sieht, lässt sich damit die Welt abbilden, oder eben Modellieren. Denn die Objekte können miteinander interagieren. Sprich, das Auto könnte auf dem Motor die Methode starten() aufrufen usw.

Objekte und Klasse in Software

Es stellt sich jetzt natürlich die Frage, warum man das ganze in Software braucht. Eine grosse Liste von Funktionen wäre doch viel einfacher. Wenn man ein wenig die Geschichte anschaut, wird das jedoch sehr schnell klar. Eine Programmiersprache, war mal Basic. Dort steht das ganze Programm in einer Datei (meines Wissens), was dann irgendwie so ausschaut (ich verwende PHP Syntax, welcher aber weder PHP noch Basic ist, aber er illustriert die Punkte, welche ich machen soll):

1 print 'hello world'; 2 print 'enter your name'; 3 $name = $_GET['name']; 4 if($name == 'rapsli'){ goto(10) } else{ goto(12) } 10 print 'ich bin cool' 11 goto(20) 12 print 'ich bin uncool' 13 goto(20) 20 print 'danke und tschüss'

Es ist glaube ich jedem leicht verstänlich, dass man so keine wirklichen Programme schreiben kann, denn der Code läuft von oben nach unten durch. Goto erlaubt zwar so Pseudeaufrufe, aber das macht das ganze nicht wirklich besser. Noch kritischer wird das ganze, wenn mehrere Leute daran arbeiten. Wie soll man das denn noch unterteilen?? Eine Katastrophe!

Sehr populär ist der Funktionale Ansatz, welcher daraus entstanden ist und ein wenig verwandt mit dem Goto ist:

function getName(){ print 'hello world'; print 'enter your name'; $name = $_GET['name']; return $name; } function printOpinion($op){ print $op; } if(getName() == 'rapsli'){ printOpinion('ich bin cool'); } else{ printOpinion('ich bin uncool'); } printOpinion('danke und tschüss');

Es werden Funktionen definiert, welche dann verwendet werden können im Eigentlichen Programm. Dadurch werden eigentlich zwei Dinge erreicht: 1. Falls die gleiche Aufgabe mehrere Male durchgeführt werden muss, dann muss nicht der Code dubliziert werden, sondern man kann einfach die Funktion mehrere Male aufrufen. 2. Wenn mehrere Personen am gleichen Progamm arbeiten, dann kann das ganze gekapselt werden. Programmierer A ist für Funktion 1 zuständig, während Programmierer B für Funktion 2 zuständig ist. Man muss sich lediglich darauf einigen, was die Funktion für Argumente übernimmt und was sie zurück gibt. Dies ist doch eigentlich schon ein sehr grosser Schritt, aber eben meistens für richtig Grosse Projekte noch nicht gut.

Vorteile von OOP

OOP hat einige sehr wesentliche Vorteile:

  • Stärkere Kapselung möglich
  • Vererbungsmöglichkeiten. Dadurch wird der Code eleganter und schlanker
  • Programmierung gegen Interfaces, was ein Programmieren am gleichen Projekt mit vielen Entwickler massiv vereinfacht und wiederum die Kapselung fördert.
  • Wiederverwendung stark erleichtert: Man kann eine Klasse schreiben, sagen was rein muss und was reinkommt und dann lässt sich diese Klasse sehr gut verwenden, ohne dass man verstehen muss, was im Innern genau vorgeht. Über Vererbung lassen sich solche Klassen auch sehr leicht umändern
  • Leichtere Wartung von Code. Der Nutzer einer Klasse greift lediglich über klar definierte Schnittstellen auf das Objekt zu. Solange diese Schnittstellen nicht verändert werden, kann man in der Klasse drin, machen was man will (natürlich solange noch das richtige Resultat rauskommt.
  • Polymorphismus ist möglich (wobei das bei PHP nicht wirklich ins Gewicht fällt).

Das sind doch schon einige gewichtige Vorteile, welche eigentlich in der heutigen Software Welt nicht mehr wegzudenken sind. Eigentlich setzen auch alle neuen Programmiersprachen darauf:

  • PHP: Bis Version 4 eigentlich noch sehr Funktionalorientiert, mit Version 5 gibt es jedoch die Möglichkeit, sehr Objektorientiert zu entwickeln.
  • Java: Ohne Objekt nix los.
  • C#: Objekt Orientiert
  • C++: Objekt Orientiert

Dann gibt es noch SmallTalk, Eiffel und wie sie alle heissen… Was ich damit sagen will, die Zukunft liegt auf jeden Fall bei Objekten und Klassen, Vererbung und Polymorphismus.