Download Konzeptionelle und technische Weiterentwicklung eines

Transcript
Seite 74
Kapitel 4 - Frameworks für WAM
jeweils eigene Klassen ableiten mußte. Zu implementieren waren jene Methoden, die Objekte
in die Liste einfügten bzw. wieder herausgaben: beide Methoden benutzten dieselbe Klasse,
der wegen Implementation mit void-Pointern notwendige Type-Cast war also sicher. Der Benutzer dieser Listen mußte immer selbst eigene Klassen implementieren, andere
Behälterkonzepte fehlten in diesem Stand des WAM-Frameworks (vgl. [Riehle93]).
Mit den Templates in C++ entstand der Wunsch nach „besseren“ Behältern, die nun technisch
möglich wurden. [Traub95] stellte fest, daß Implementationsvererbung für Behälterklassen Bibliotheken dominiert, daß heißt z.B. die Ableitung einer sortierten Liste von einer Liste (dabei geht die Listeneigenschaft verloren, an beliebiger Position einfügen zu können). Die
ConLib folgt mit ihrer Hierarchie einer echten Klassifikation nach Behälterkonzepten (siehe
Abbildung 4-2). Der Benutzer entscheidet sich für das gewünschte Konzept, einzig an der
Stelle der Erzeugung eines Behälters wählt er die Implementationsform - z.B. ein dynamisches Array mit schnellem Zugriff aber aufwendigerem Löschen und Einfügen, oder eine
Double-Linked-List mit erhöhtem Platzbedarf. Bezeichner und Schnittstellenparameter sollten
statisch vom Typ einer möglichst abstrakten Oberklasse deklariert sein.
Klassenhierachie, Vererbung
von links nach rechts
tUOrdTable
tTable
tStack
tContainer
tQueue
tArray
tOrdTable
tDQueue
tUOrdCol
tCollection
1. Klassifikation nach
Zugriffsmethode
tOrdCol
2. Ordnung ?
tDictionary
tIntOrdTable
tSortedTable
tExtOrdTable
tAssocList
tBag
tSet
Duplikate ?
tIntOrdCol
tSList
tExtOrdCol
tList
3. Art der Ordnung
Abbildung 4 - 2: Behälter - Klassifikation der ConLib
Vergleichbar den robusten ET++ Iteratoren enthält die ConLib ein Konzept stabiler Cursors
(zu den Begriffen vgl. [Traub95]), die in beliebiger Anzahl auf einem Behälter arbeiten und
auch bei Änderung dessen Inhaltes in einem definierten Zustand bleiben. Die ET++ erreicht
dies z.B. durch den Trick „verzögertes Löschen“ (Elemente bleiben erhalten, bis kein Iterator
mehr auf sie zeigt) nur scheinbar, da die Semantik teilweise vorhandenen Elemente fraglich
ist. Statt dessen erfaßt die ConLib den Sonderfall explizit im Zustandsmodell der CursorKlasse, im Anwendungsprogramm kann dies sicher behandelt werden.
Zur Implementation der Behälterkonzepte verwendet [Traub95] nur drei tatsächliche, höchst
effiziente Behälter, deren aufwendige interne Struktur dem Benutzer vollständig verborgen
bleibt. Mit der STL wird die ConLib nicht überflüssig, da deren Konzepte der STL überlegen
sind. Denkbar wäre ein Austausch der genannten drei tatsächlichen Behälter als technische
Basis der Bibliothek durch eine Abbildung auf die STL.