OOP Konzepte in Drupal


Im ersten Teil dieses Artikels werde ich zuerst ein paar Grundlagen der OOP erläutern. Zum Schluss kommt dann noch die Umsetzung dieses Konzepts mit Drupal

Wie allgemein bekannt ist, ist Drupal funktional programmiert. Es wurden jedoch möglichkeiten gefunden, um auch gewisse OOP Konzepte einzubauen. Auf eines möchte ich hier eingehen, nachdem es in Drupalcenter als Frage aufgetaucht ist. Ich komme aus einer Java Umgebung (von der Universität her) und habe daher Erfahrung im Umgang mit OOP.

Ein wichtiger Vorteil von OOP ist die Wiederverwendbarkeit von Klassen. Damit dies jedoch möglich ist, muss jede Klasse eine klare Schnittstelle haben. Z.B. das Objekt Motor: Vereinfacht gesehen hat es zwei Methoden: motor_starten und motor_abstellen. Um den Code jedoch übersichtlicher gestalten zu können werden intern mehr Methoden verwendet:

Diese beiden Methoden sind unsere Schnittstellen. Intern läuft jedoch mehr ab:

benzinEinspritzen();
}

public function motorStoppen(){
//implentation
}

private function benzinEinspritzen(){
//implementation
}

private function luftEinspritzen(){
//implementation
}
}
?>

benzinEinspritzen und luftEinspritzen ist für den Autofahrer nicht wichtig, er will das nicht manuell regeln müssen, es könnte unter Umständen fatale Folgen haben, falls der Autofahrer selber das Gemisch beeinflussen könnte. Aus den obigen beiden Beispielen können folgende wichtigen Vorteile gewonnen werden:

  • Ein Objekt ist eine Blackbox für den Benutzer und zeigt ihm nur die für ihn notwendigen Methoden, damit der Benutzer das Objekt leicht benutzen kann.
  • Wiederverwendbarkeit ist gewährleistet, denn das interne Verhalten des Motors kann verändert werden -> z.B. einen Dieselmotor. Das ändert jedoch nichts an den öffentlichen Methoden.
  • Dadurch kann eine gewisse Sicherheit gewährleistet werden, denn: Interne Veränderungen haben keine Auswirkungen auf den Objektnutzer. Würde dieser direkt z.B. benzinEinspritzen verändern und jetzt wird auf Diesel umgestellt, so müsste der Benutzer seine Software entsprechend anpassen. Da diese Methode jedoch private ist, können wir das getrost übernehmen und der Objektbenutzer kann nach wie vor den Motorstarten, ohne etwas bei sich verändern zu müssen.

Im realen Leben trifft man häuftig folgendes an:

name;
}

public function setName(string $str){
$this->name = $str;
}

}
?>

Will man sauber Programmieren, so verbietet man solche Zugriffe:

name = 'rapsli';
?>

Und benutzt eben die accessors:

setName('rapsli');
?>

Warum? Die Antwort wurde oben bereits gegeben. Wird nämlich die interne Datenstruktur verändert, z.B. so:

name['name'];
}

public function setName(string $str){
$this->name['name'] = $str;
}

public function setFirstName(string $str){
$this->name['firstName'] = $str;
}
public function getFirstName(){
return $this->name['firstName'];
}

}
?>

Würde man den direkten Zugriff auf Namen erlauben, so gäbe das ein ziemlich grosses Problem. Da wir jedoch in unserem Objekt den Zugriff über die Accessormethoden laufen lassen, stellt dies kein Problem dar:

  • Der Code ist einfach zu warten
  • Erweiterungsfähig

Jetzt zu Drupal. In Drupal wird genau dieses Konzept verfolgt, es kann jedoch nur über Absprachen funktionieren. Drupal kennt keine Klassen. Wir können jedoch ein Modul als eine Klasse sehen und die darin enthaltenen Funktionen als Methoden dieser Klasse. Die Sichtbarkeit der Methoden wird wie folgt geregelt:

Plant man ein Modul können die Schnittstellen somit festgelegt werden und umgesetzt werden. Alle anderen Hilfsfunktionen werden dann jeweils mit dem _ versehen. Wenn ich jetzt also ein Modul programmiere und greife dabei auf z.B. das Taxonomy Modul zu, dann weiss ich genau, dass ich nur die Funktionen verwenden darf, welche KEINEN Unterstrich haben, denn dann kann ich mir sicher sein, dass diese auch bei einer Umstellung des Modules nach wie vor funktionieren. Das gleiche sollte auch mit den eigenen Modulen gemacht werden.

Wer sich ernsthaft mit OOP auseinander setzen will, sollte sich zuerst mit den grundlegenden Konzepten vertraut machen:

  • Klassen vs. Objekte
  • Vererbung
  • Polymorphie
  • Datenkapselung

Zudem könnte es hilfreich sein, OOP ein wenig mit Java zu programmieren, da Java sehr strikt ist bezüglich OOP. Und sonst einfach ein bisschen googeln

Update 22.12.2007: In der Drupal API gibt es einen Ausführlichen Text punkt Drupal und OOP.