Die ViewAdmin-Klasse verwaltet alle in einer Sicht enthaltenen Objekte. Ein Großteil der Funktionalität der Programmierschnittstellen ist in den allgemeinen Klassen CBview und CBsubView implementiert. Die generierten Klassen enthalten im wesentlichen nur noch für die Sicht spezifische Informationen. Eine Übersicht über die Klassenstruktur gibt Abbildung 7.3.
Abbildung 7.3: Klassenstruktur der Programmierschnittstelle
Ein wichtiges Bindeglied zwischen Änderungsnachrichten und der Sichtenmaterialisierung im Anwendungsprogramm bildet die Klasse CBterm. Die Notifikationsnachrichten stellen Terme in einer ProLog-ähnlichen Struktur dar. Die Klasse CBterm ist ein Parser für diese Terme. Alle Objekte der Sicht werden aus einem CBterm-Objekt konstruiert.
Die Klassen CBview und CBsubView sind die Oberklassen für die
generierten Klassen für Sichten und Teilanfragen. CBsubView ist eine
Spezialisierung von CBview, jedoch verhalten sich beide Klassen gleich.
Die Klasse CBview hat eine Objektvariable objectName vom Typ
CBobjectName, die den Namen des Objekts beinhaltet. Ein Objektname
kann nicht nur eine Folge von alphanumerischen Zeichen sein, sondern auch
ein Select-Ausdruck
oder ein Ableitungsausdruck für die Spezifizierung von generischen Anfragen.
Wie in Beispiel 5.2.3 gezeigt wurde, kann ein Objektname auch ein
Ableitungsausdruck sein. Die Parametersubstitution sind in einer
Liste von Objekten der Klasse CBderiveExpression abgespeichert.
CBlist ist eine Template-Klasse, die einfach-verkettete Listen verwaltet.
Die möglichen Formen von Objektnamen sind in
der Syntaxbeschreibung der Telos-Objekte in Anhang F.1 enthalten.
Die Klassen CBview, CBsubView und CBobjectName haben Operatoren mit denen sich Objekte dieser Klassen vergleichen lassen und die Namen nach C++-Zeichenketten konvertiert werden können.
Die Template-Klasse CBset verwaltet die Objektmengen. Bei der Instanziierung eines CBset-Objekts mußder Typ der Mengenelemente angegeben werden. CBset bietet die üblichen Methoden für Mengen an: insert, remove, find, isEmpty, usw. Des weiteren kann man mit dem Array-Operator [] oder den Methoden next und previous in der Menge navigieren. Die Menge ist als AVL-Baum implementiert [Gü92, Sed92]. Ein AVL-Baum ist ein ausgeglichener binärer Suchbaum, in dem die Operationen Suchen, Einfügen und Löschen jeweils einen Rechenaufwand von O(log N) verursachen, wobei N die Anzahl der Elemente im Suchbaum ist.
Alle Mengen, die in der Programmierschnittstelle benutzt wurden, sind mit der Template-Klasse CBset implementiert. Dies trifft auch auf die bereits erwähnten Objektvariablen ViewSet und SubViewSet der generierten Klasse ViewAdmin zu.
Die Objekte einer Sicht existieren im Anwendungsprogramm nur einmal, unabhängig davon
wie oft sie durch andere Objekte referenziert werden. Die Mengen enthalten
deshalb auch nicht die Objekte selbst, sondern nur eine Referenz auf ein Objekt.
Damit durch das Löschen eines Objekts nicht unerlaubte Speicherzugriffe
entstehen, weil eine Referenz auf das Objekt nicht mehr zulässig ist,
implementiert die Template-Klasse CBref sichere Zeiger
auf die Objekte einer Sicht (vgl. smart pointer in [Str91]).
Die Objekte einer Sicht sind nur über ein CBref-Objekt referenzierbar.
Der Typ CBref<EmpDept> stimmt mit dem C++-Typen EmpDept*
überein. Beide Typen beschreiben einen Zeiger auf ein EmpDept-Objekt
und werden auf die gleiche Art verwendet.
Das Objekt einer Sicht zählt die CBref-Objekte, die auf das Objekt verweisen.
Falls keine Verweise mehr existieren, wird das Objekt gelöscht.
Der Sichtenwartungsalgorithmus garantiert, daßdie Objekte einer Sicht keine unzulässigen Objekte referenzieren. Wird zum Beispiel in der Teilanfrage SV_dept ein Objekt D1 gelöscht, so werden auch die Beziehungen von Angestellten aus der Sicht EmpDept zu D1 gelöscht. Wenn der Programmierer in seinem Programmteil eine Referenz auf das Objekt D1 angelegt hat, so bleibt das Objekt bestehen und es entstehen keine unerlaubten Speicherzugriffe im Programm. Der Programmierer kann durch die Methode isValid der Klasse CBref überprüfen, ob das Objekt noch in einer Sicht enthalten ist.
Attribute bestehen in ConceptBase aus einer Attributbezeichnung und einem
Attributwert. Die Template-Klasse CBattribute bildet diese Struktur
in C++ ab. Der Template-Parameter ist dabei der Typ des Attributwertes,
der entweder ein atomarer Objektname
oder eine Referenz auf eine verschachtelte Teilanfrage ist. Objektnamen
werden wie oben durch die Klasse CBobjectName und Referenzen durch
das Template CBref repräsentiert. Da die Attribute in
ConceptBase mengenwertig sind, haben die entsprechenden Objektvariablen in
den generierten Klassen den Typ
CBset<CBattribute<...>>, sofern der Programmierer keinen
anderen Typ bestimmt.
Christoph Quix