Fortgeschrittene OO-Programmierung in Javascript

Namensräume

Namensräume und Pakete

Eine weitere wichtige Eigenschaft objektorientierter Umgebungen sind Namensräume beziehungsweise Pakete, mit denen sich thematisch verwandte Klassen zusammenfassen lassen. Außerdem kann man damit Namenskollisionen vermeiden, da der Name einer Klasse (oder eines anderen Sprachkonstrukts) nur innerhalb eines Namensraums oder Pakets eindeutig sein muss.

In Javascript lässt sich das Konzept einfach durch Objekte abbilden (siehe Listing 10). Dazu dient eine Hierarchie von Objekten, die bei de beginnt und mit dem Punkt-Operator traversiert werden kann (beispielsweise de.heise.ix.test). Das Listing prüft für jede Hierarchieebene, ob sie schon existiert (etwa weil sie bei der Erzeugung einer anderen Klasse angelegt wurde) – wenn nicht, legt es sie an. Eine Ausnahme bildet die oberste Ebene: Hier sollte eine Abfrage der Form if (de) genügen, aber Javascript erzeugt einen Fehler, wenn de noch nicht definiert ist. Das lässt sich mit einem Zugriff auf window.de umgehen (statt direkt auf de). window ist in Javascript (zumindest im Browser) die Wurzel für alle Namensauflösungen, und de und window.de sind normalerweise äquivalent – bis auf den Fall, dass de noch nicht definiert ist.

Die länglichen vollqualifizierten Namen wie de.heise.ix.test.Person lassen sich abkürzen (ähnlich import in Java), indem man eine Klasse (oder genauer: einen Konstruktor) einer Variablen zuweist:

var Person = de.heise.ix.test.Person;

Auch Teilpakete lassen sich auf diese Weise abkürzen:

var testPackage = de.heise.ix.test;
var emp = new testPackage.Employee(...);

Ein weiterer wichtiger Punkt ist, gerade bei komplexen Anwendungen, die Beschreibung von Schnittstellen. Dazu gibt es mittlerweile auch für Javascript Generatoren für API-Dokumentation, die vergleichbar mit JavaDoc oder Doxygen arbeiten. Verbreitet ist hier JSDoc, das in Perl geschrieben ist und bei der Analyse des Quellcodes weitgehend der JavaDoc-Syntax folgt. Listing 11 zeigt einen Dokumentationskommentar.

Ausblick: Framework-Unterstützung

Die beschriebenen Techniken ermöglichen in der Summe ein wartbares, objektorientiertes Arbeiten in Javascript. Allerdings ist es teilweise recht mühsam, sie alle konsequent umzusetzen. In Javascript 2.0 soll die Unterstützung für Objektorientierung zwar stark verbessert sein – es dürfte jedoch noch einige Zeit dauern, bis der neue Standard definiert ist, und es wird noch länger dauern, bis er in allen gängigen Browsern so weit verbreitet ist, dass man Webanwendungen darauf aufsetzen kann.

Schon in heutigen Anwendungen erhält man allerdings Unterstützung durch Frameworks und Hilfsklassen wie Dean Edwards Base (siehe Onlinequellen), die beispielsweise den Code für eine Vererbungsbeziehung hinter simplen Aufrufen wie object.extend() verbergen. Mit Framework-Hilfe lässt sich aber noch mehr erreichen: Objekte kann man beispielsweise mit Metainformationen anreichern, sodass man sie nach ihrem Klassennamen fragen kann. Ebenfalls nützlich sind Properties, wie sie das qooxdoo-Framework bietet (siehe den genannten Kasten). Damit lassen sich Attribute mit automatisch generierten Getter- und Setter-Methoden anlegen, die außerdem weiteren Komfort wie automatische Validierung und ein Listener-Konzept für die Reaktion auf Wertänderungen anbieten.

Noch ist die Javascript-Framework-Landschaft in ständiger Veränderung begriffen – es haben sich weder ein Framework noch eine Bibliothek als Standard durchgesetzt, sodass man als Anwendungsentwickler die Qual der Wahl hat. Allerdings bekommt man fast immer Unterstützung bei der objektorientierten Entwicklung, ganz gleich, auf welcher Basis man aufsetzt. Und Techniken wie die oben beschriebene Kapselung funktionieren, ohne explizite Unterstützung, in fast jedem Framework (Ausnahme: protected-Attribute, denn hier muss das OO-Konzept des Frameworks mitspielen). Es sind daher nicht nur die Frameworks, die dem Entwickler den Alltag erleichtern; geeignete Code-Muster tragen dazu bei, dass komplexer Code auf Dauer wartbar bleibt.

Eines ist sicher: Javascript wird allmählich erwachsen, und es entstehen ernsthafte und umfangreiche Anwendungen damit. Die Sprache bietet die Chance, objektorientiert und sauber strukturiert zu arbeiten, aber man muss sie wahrnehmen. Frameworks und Bibliotheken geben hierbei wertvolle Hilfestellung. Ein späterer Artikel soll anhand des qooxdoo-Framework zeigen, wie man fortgeschrittene Objektorientierung mit einem konkreten Framework erreicht.

Andreas Junghans und Til Schneider
entwickeln beim STZ-IDA in Karlsruhe Ajax-basierte Web-Anwendungen im Auftrag der PTV AG.