Ausschnitt aus der Ada-Version des Buchs Objektorientiertes Plug und Play
© Prof. Dr. Andreas Solymosi

Assoziativspeicher

Viele Multibehälter können Datenelemente in einer bestimmten Reihenfolge aufnehmen; die Ausgabereihenfolge der eingetragenen Elemente hängt von der Art des Behälters ab, und der Benutzer hat keinen Einfluß darauf. Im Gegensatz dazu kann bei Assoziativspeichern die Ausgabereihenfolge durch die Angabe eines Schlüssels gesteuert werden.

Ein Assoziativspeicher ist also ein Multibehälter, der mit jedem Datenelement auch einen dazugehörigen Schlüssel speichert. Beim Lesen des Elements muß dann dieser Schlüssel angegeben werden.

Assoziativspeicher

Der abstrakte Schablonendatentyp TAsso_Speicher kann folgendermaßen spezifiziert werden:

generic -- aus der Datei GuAssosp.ads
	type TElement is private;
	type TSchluessel is private;
package GAsso_Speicher is -- aus der Datei GASSOSP.ADS auf der Begleitdiskette
	type TAsso_Speicher is limited private; -- wird leer angelegt
	procedure Entleeren (Speicher: out TAsso_Speicher);
	procedure Eintragen (Speicher: in out TAsso_Speicher; Schluessel: in TSchluessel;
		Element: in TElement); -- raises:
	ESpeicher_voll: exception; -- Eintragen nicht mehr möglich
	function Finden (Speicher: TAsso_Speicher; Schluessel: TSchluessel) return TElement; -- raises:
	ENicht_vorhanden: exception; -- Finden findet den Schluessel nicht
	function Vorhanden (Speicher: TAsso_Speicher; Schluessel: TSchluessel) return Boolean;
	function Leer (Speicher: TAsso_Speicher) return Boolean;
	function Voll (Speicher: TAsso_Speicher) return Boolean;
	... -- Iterator, Persistenzoperationen, Kopieren und Gleichheit wie üblich

Die Besonderheit dieser Schablone ist, daß sie mit zwei Datentypen ausgeprägt werden muß:

package MTelefonbuch is new GAsso_Speicher (TTelefonnummer, TTeilnehmer);

Die Funktionalität des Assoziativspeichers muß definieren, ob Eintragungen mit gleichen Schlüsseln möglich sind oder nicht. Die obige Definition geht davon aus, daß Eintragen mit einem schon vorhandenem Schlüssel den alten Eintrag überschreibt. Es ist eine alternative (vielleicht bessere) Lösung, wenn Eintragen die ebenfalls exportierte Ausnahme

ESchon_vorhanden: exception;

auslöst, wenn er mit einem schon vorhandenem Schlüssel aufgerufen wird.

Wenn der Assoziativspeicher unterschiedliche Einträge mit gleichem Schlüssel speichern kann, spricht man von einer Schlüsseltransformationstabelle. In diesem Fall exportiert das Paket anstelle der Funktion Finden zwei Prozeduren:

procedure Erstes_finden (Speicher: in out TAsso_Speicher; Schluessel: in TSchluessel;
	Element: out TElement);
procedure Naechstes_finden (Speicher: in out TAsso_Speicher; Element: out TElement);

Der Informator Erstes_finden liefert dann jeweils das zuerst eingetragene Element; die weiteren können mit Naechstes_finden gefunden werden. Naechstes_finden wird ohne Schluessel-Parameter aufgerufen; er liefert entsprechend des letzten Aufrufs von Erstes_finden. Der Informator Naechstes_finden erinnert sich damit an den letzten Aufruf; er kann (bzw. soll) deswegen nicht als Funktion programmiert werden.

Bemerkung: Eine Schlüsseltransformationstabelle wird üblicherweise als ein Datentyp mit Diskriminante implementiert, bei dem die Tabellengröße bei der Vereinbarung angegeben werden muß.


© Prof. Dr. Andreas Solymosi

Rückmeldungen bitte an den Autor solymosi@tfh-berlin.de

Leitseite des Autors