
\section{Smalltalk}\label{Smlltlk}
Bei der Beschreibung der Bibliothek NIHCL wurde bereits erw"ahnt, da"s die
Bibliothek der Sprache Smalltalk das Vorbild f"ur NIHCL ist. Um die beim Design
beider Bibliotheken getroffenen Entscheidungen besser nachvollziehen zu
k"onnen, beschreiben die nachfolgenden Abschnitte kurz die Eigenschaften der
Sprachen Smalltalk und ihrer Bibliothek. Da das Entfernen von Methoden aus der
Schnittstelle einer Klasse bei der Gestaltung der NIHCL eine wesentliche Rolle
spielt, wird auch die Bibliothek der Sprache Smalltalk besonders im Hinblick
auf diese Problematik untersucht. 


\subsection{Sprache}
Die objektorientierte Programmiersprache Smalltalk-80 \cite{GoRo83} ist eine
interpretative Sprache. Ohne da"s der Benutzer einen "Ubersetzer aufrufen mu"s,
werden die Methoden von Klassen im Hintergrund "ubersetzt und bei Bedarf auf
einer virtuellen Maschine durch einen Interpretierer ({\it interpreter})
ausgef"uhrt. Teil des Smalltalk-Systems ist eine graphische Benutzeroberfl"ache
\cite{Goldb84}. Innerhalb dieser Oberfl"ache kann der Benutzer Objekte
interaktiv mit Hilfe des Mauszeigers manipulieren.

Der Objektbegriff von Smalltalk ist allgemeiner als in anderen
objektorientierten Sprachen. So kann ein Objekt in Smalltalk sowohl eine Kapsel
aus Datenstruktur und Funktionalit"at  als auch ein Proze"s oder die
Beschreibung einer Klasse ({\it meta class}) sein. Alle Bestandteile eines
Programmes sind in Smalltalk somit Objekte \cite{Hof87}. 

Smalltalk ist eine untypisierte Sprache. Eine Entscheidung "uber die
Zul"assigkeit von Operationen auf Werten erfolgt somit erst zur Laufzeit. Der
Versuch, eine Methode aufzurufen, die nicht Teil der Schnittstelle einer Klasse
ist, f"uhrt zu einem Fehler zur Laufzeit. 
Auch Smalltalk bietet abstrakte Klassen an. Methoden, deren Funktionalit"at in
einer Klasse noch nicht vollst"andig implementiert werden kann, werden als {\sf
subclassResponsibility} mit einer vorl"aufigen Implementierung versehen:
\begin{xple}
size
  self subclassResponsibility
\end{xple}
Die Methode {\sf size} kann in Subklassen mit einer anderen Implementierung
"uberschrieben werden. Sollte ein "Uberschreiben der Methode in der Subklasse
unterbleiben, so f"uhrt der Aufruf von {\sf size} durch die Implementierung als
{\sf subclassResponsibility} zu einem Laufzeitfehler:
\begin{xple}
subclassResponsibility
  self error: 'My subclass should have overridden one of my messages.'
\end{xple}
"Ahnlich der Sprache C++ kann auch in Smalltalk eine geerbte Methode aus der
Schnittstelle entfernt werden. Nach einer allgemeinen, nicht zwingend
vorgeschriebenen Konvention werden hiervon betroffene Methoden wie in C++ als
{\sf shouldNotImplement} "uberschrieben:
\begin{xple}
capacity
  self shouldNotImplement
\end{xple}
Die Methode {\sf shouldNotImplement} ist bereits in der Klasse {\sf Object} so
implementiert, da"s ihr Aufruf zur Laufzeit eine Fehlermeldung erzeugt:
\begin{xple}
shouldNotImplement
  self error: 'This message is not appropriate for this object.'
\end{xple}
Das L"oschen von Methoden aus der Schnittstelle in Smalltalk geschieht also so
"ahnlich wie in C++. In C++ wurden zu l"oschende Methoden in private
Methoden umgewandelt. Versuche, entsprechende Methoden trotzdem aufzurufen,
k"onnen somit bereits im Zuge der statischen "Uberpr"ufung zur
"Ubersetzungszeit verhindert werden. In Smalltalk kann die Methode zwar noch
zur Laufzeit aufgerufen werden, da eine statische "Uberpr"ufung fehlt, doch die
Methode l"ost eine Fehlermeldung aus. Es kann also auch in Smalltalk von der
M"oglichkeit partiellen Erbens gesprochen werden.
Vergleicht man die beiden Varianten, geerbte Methoden aus der Schnittstelle zu
entfernen, so hat das in Smalltalk verwendete Verfahren den Nachteil, die
Unm"oglichkeit der Anwendung der Methode erst zur Laufzeit des Programms zu
entdecken. 


\subsection{Bibliothek}
Teil des Smalltalk-System sind zahlreiche bereits vordefinierte Klassen.
Da Smalltalk dem Bibliotheksentwickler nur eine
Einfachvererbung\footnote{Eine Erweiterung von Smalltalk mit Mehrfachvererbung
beschreibt \cite{Bor82}.} bietet, sind die Klassen in Form eines Baumes
unter der Wurzel {\sf Object} organisiert. Einen "Uberblick "uber die
Bibliothek bietet Abbildung \ref{SmalltalkBib}. 

\renewcommand{\epsfsize}[2]{0.95#1}
\begin{figure}[hbt]
\begin{center} 
\leavevmode
\epsfxsize=14cm
\epsffile{../Bilder/thorsten/Postscript/Smalltalk.ps}
\end{center}
\caption{Ausschnitt der Smalltalk-Klassenbibliothek} \label{SmalltalkBib}
\end{figure}
Durch die Anwendung partiellen Erbens differieren auch in der
Smalltalk-\-Bib\-lio\-thek Vererbungs- und Schnittstellenhierarchie. Mit
Hilfe des in Abschnitt \ref{HierDiffs} beschriebenen Algorithmus von
\cite{Cook92} kann aus der Vererbungshierarchie die Schnittstellenhierarchie
entwickelt werden. Abbildung \ref{SmallSchnittst} zeigt die mit Hilfe dieses
Algorithmus entwickelte Hierarchie der Schnittstellen der Bibliothek. Die in
der Abbildung mit kursiver Schrift und eckiger Umrandung abgebildeten Klassen
stellen abstraktes Protokoll dar, das im Zuge der Analyse der Bibliothek vom
Algorithmus automatisch der Darstellung hinzugef"ugt worden ist.
\renewcommand{\epsfsize}[2]{1.0#1}
\begin{figure}[hbt]
\begin{center} 
\leavevmode
\epsfxsize=14cm
\epsffile{../Bilder/thorsten/Postscript/Smalltalk_CollectionsProtocol.ps}
\end{center}
\caption{Schnittstellenhierarchie der Smalltalk-Bibliothek (nach [Cook 92])}
\label{SmallSchnittst} 
\end{figure}

\subsection{Bewertung der Smalltalk-Bibliothek}
Ein Vergleich der beiden abgebildeten Hierarchien zeigt so gro"se Unterschiede,
da"s auch in dieser Bibliothek Vererbung nur dem Produzenten Vorteile bringt.
Die gemeinsame Sicht des Konsumenten ist durch die Anwendung des partiellen
Erbens wie in der NIHCL zerst"ort. Eine Hilfe bei der Auswahl des zu
verwendenden Beh"alters bietet die Vererbungshierarchie der Bibliothek nicht.
Es gilt also hier dieselbe Kritik, die auch im Abschnitt \ref{Nihcl} bereits
gegen"uber der NIHCL ge"au"sert wurde. 

Da sich die Entwickler der NIHCL an der Bibliothek von Smalltalk orientiert
haben, ist es nicht verwunderlich, da"s die Unterschiede zwischen Vererbungs-
und Schnittstellenhierarchie die Qualit"at beider Bibliotheken vermindern.
Unverst"andlich ist es jedoch, eine Bibliothek in einer Sprache zu entwickeln,
die Mehrfachvererbung anbietet und sich gleichzeitig an der Bibliothek einer
Sprache zu orientieren, welche diese M"oglichkeit nicht anbietet.
Bei der Erstellung der Smalltalk-Bibliothek mu"ste wegen der
Spracheigenschaften von Smalltalk auf die Verwendung von Mehrfachvererbung
verzichtet werden. Bei der Entwicklung von NIHCL h"atte von dieser
zus"atzlichen Freiheit bei der Modellierung von Beziehungen zwischen Klassen
jedoch Gebrauch gemacht werden k"onnen. 