2 UML-based Web Engineering - UWE - Ludwig-Maximilians ...
2 UML-based Web Engineering - UWE - Ludwig-Maximilians ...
2 UML-based Web Engineering - UWE - Ludwig-Maximilians ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
7.3 Umsetzung der <strong>UWE</strong>-Modelle<br />
7.3.1 Umsetzung des Inhaltsmodells<br />
Es ist klar, dass die Klassen des <strong>UWE</strong>-Inhaltsmodells in der Modell-Komponente von Rails<br />
umzusetzen waren. Aufgrund der Objektorientierung von Ruby ist die Implementierung<br />
prinzipiell sehr geradlinig – die Elemente des Inhaltsmodells (Klassen, Attribute, Methoden,<br />
Assoziationen) müssen 'einfach' in die entsprechenden programmiersprachlichen Konstrukte<br />
von Ruby übersetzt werden. Allerdings war zu berücksichtigen, dass die Domänenobjekte der<br />
Modellklassen (Publikationen, Personen etc.) in geeigneter Weise in einer relationalen<br />
Datenbank persistiert werden müssen. Zur Lösung dieser Aufgabe stellt Ruby on Rails mit<br />
dem ActiveRecord-Modul einen objektrelationalen Mapper zur Verfügung. Allerdings bringt<br />
dessen Einsatz eine Einschränkung mit sich, die sich bei der Umsetzung des <strong>UWE</strong>-<br />
Inhaltsmodells bemerkbar gemacht hat. Sie soll im Folgenden erläutert werden.<br />
Während objektorientierte Sprachen Daten in Objekten kapseln, basieren relationale<br />
Datenbanken auf dem mathematischen Konzept der Relation, um Daten in Form von Tabellen<br />
zu verwalten. Die Technik der objektrelationalen Abbildung dient zur Überbrückung der<br />
strukturellen Unterschiede, die sich aus der Verwendung dieser beiden Paradigmen ergeben.<br />
Ruby on Rails integriert mit ActiveRecord einen objektrelationalen Mapper, der das<br />
gleichnamige Design-Pattern von Martin Fowler realisiert: Die strukturellen Aspekte einer<br />
Domänen-Klasse werden 1:1 auf eine Datenbanktabelle abgebildet, für jedes Attribut existiert<br />
eine entsprechende Tabellenspalte, ein Datensatz einer Tabellenzeile entspricht damit genau<br />
einem Objekt. Zusätzlich enthält die Klasse Domänenlogik und Methoden zum Zugriff auf die<br />
Datenbank 67 .<br />
Zur Abbildung von Vererbungshierarchien auf Datenbankebene greift Rails auf ein weiteres<br />
Design Pattern von Fowler zurück: Mit Single Table Inheritance (SIT) werden alle Klassen<br />
der Hierarchie auf eine Tabelle abgebildet. Diese Tabelle besitzt für jedes Attribut jeder<br />
Klasse der Vererbungshierarchie eine entsprechende Spalte. In einer zusätzlichen Kolumne<br />
wird der Typ des Objekts gespeichert, um bei der Rematerialisierung dem aus der Datenbank<br />
zu ladenden Objekts den richtigen Typ zuweisen zu können. Diese Methode zur Erfassung<br />
von Vererbungshierarchien in relationalen Datenbanken hat einige Vorteile, z.B. sind im<br />
Vergleich zu Techniken, die den Einsatz mehrerer Tabellen erfordern, keine kostspieligen<br />
Join-Operationen notwendig. Auf der Soll-Seite ist dagegen unnötiger Speicherplatzverbrauch<br />
und unübersichtliches Tabellendesign zu verbuchen: Viele, wenn nicht gar alle Datensätze der<br />
Tabelle besitzen ungenutzte Felder, die zu ihrer Beschreibung nicht benötigt werden, da die<br />
entsprechenden Spalten zur Abbildung von Attributen anderer Subklassen dienen.<br />
Problematisch ist nun, dass im ActiveRecord-Modul von Rails ein derart hohes Maß an<br />
Strukturgleichheit von Objekt- und Datenbankebene realisiert wird, dass diese zuletzt<br />
genannte Schwäche von SIT sogar auf Objektebene übertragen wird: Die Koppelung von<br />
Objekt- und Datenbankebene ist hier so stark, dass nicht nur alle Datensätze der<br />
Vererbungstabelle alle Felder besitzen, sondern dass sich auch alle Domänenklassen der<br />
Vererbungshierarchie die Attribute aller Subklassen teilen 68 . Neben einem unsauberen<br />
Tabellen- erhält man zwangsläufig auch ein unsauberes Modelldesign: Objekte besitzen<br />
Attribute, die sie eigentlich nicht haben sollten, und der Programmierer muss selbst dafür<br />
Sorge tragen, dass bei den Instanzen einer betroffenen Modellklasse keine sinnlosen Attribute<br />
67 [9], S.160ff<br />
68 Siehe dazu auch [36], S.261<br />
80