5. Existierende Browser5.1. Traditionelle Werkzeuge für EiffelBertrand Meyer hat in [Meyer 88] drei Werkzeuge beschrieben, die den Umgang mit Eiffel erleichtern sollten: short, flat und good. Diese wurden auch z.B. mit ISE Eiffel 2.x ausgeliefert. short gibt zu einer als Parameter angegebenen Klasse das Interface aus. Es sind nur die in dieser Klassen definierten Merkmale sichtbar und nicht die geerbten. Das Werkzeug ist "batchorientiert", d.h. eine interaktive Arbeit (abgesehen von einem erneuten Aufruf mit anderen Parametern) wird nicht unterstützt. (Anmerkung: Ich verwende hier einen etwas anderen Werkzeugbegriff als WAM, wo Interaktivität bereits in der Definition eines Werkzeuges enthalten ist.) Durch den Aufruf von "short Klassenname" erhält man die Klassenschnittstelle der angegebenen Klasse. Die Merkmale der Klasse erscheinen grundsätzlich in der Reihenfolge ihres Auftretens im Quelltext. Als zusätzliche Dokumentation erscheinen lediglich die Kommentare im Quelltext der Klasse. Diese Art der Darstellung wird als Short-Form bezeichnet. flat erweitert eine Klasse um die Eigenschaften, die sie von ihren Oberklassen erbt. Man erhält so die volle Schnittstelle einer Klasse, wie sie von ihren Benutzern (Clients) verwendet werden kann, die sog. Flat-Form. Diese Erweiterung ist wichtig, weil sehr häufig nur wenige Operationen in einer Klasse spezialisiert werden, während eine größere Zahl von Operationen unverändert übernommen wird. Um in Verbindung mit den eben beschriebenen short die volle Schnittstelle einer Klasse inklusive ihrer geerbten Operationen, die sog. Flatshort-Form, zu erhalten, ist das Unix Kommando "flat Klassenname | short" nötig. flat ist ebenfalls nicht interaktiv. Die eigentliche Intention von short war es, keine separate Dokumentation zu den erstellten Klassen pflegen zu müssen und alle Informationen im Klassentext unterzubringen und dann mit short zu extrahieren. In diesem Sinne ist short in der Tat ein brauchbarer Ersatz für ein Online-Manual zu den einzelnen Klassen. Ein Vorteil ist sicher, daß die Dokumentation immer auf dem gleichen Stand wie die Implementation ist. Auch wenn Meyer behauptet, man würde durch dieses Vorgehen die Dokumentation "essentially for free" erhalten ([Meyer 88], Seite 346), so ist es doch notwendig, eine gute, strukturierte Dokumentation (als Kommentar) in den Quelltext zu schreiben, damit diese dann mit short extrahiert werden kann. Als einen Browser kann man dieses Gespann sicherlich nicht bezeichnen. Auch eine klassenübergreifende Dokumentation, um die Verwendung der Klassen zu verdeutlichen, kann durch sie nicht ersetzt werden. (Trotzdem liefert ISE fast ausschließlich mit short produzierte Dokumentation zur Eiffel-Bibliothek aus.) Im Umgang mit short und flat stellt sich die mangelnde Interaktivität als besonders hinderlich heraus. Bei jedem Verweis auf andere Klassen muß zu diesen gesondert die Schnittstelle angefordert werden. Oft ist auch das Volumen der zu einer Klasse gelieferten Informationen so groß, daß sich kaum ein Vorteil gegenüber dem direkten Betrachten des Quelltextes ergibt. Es ist nicht sichtbar, in welchem Zusammenhang eine Klasse verwendet wird. Man kann zwar die Oberklassen sehen, nicht aber, ob es bereits andere Klassen gibt, die eine bestimmte Klasse benutzen oder von ihr erben. Auch fehlt es völlig an Möglichkeiten, die Informationsflut zu filtern. Immer werden alle Informationen zu einer Klasse präsentiert. So ist die Ausgabe von short für eine durchschnittliche Bibliotheksklasse oft mehrere Bildschirmseiten lang. Als abschreckendes Beispiel zeigt Abb. 2 die keinesfalls kurze Ausgabe von short zur Klasse LINKED_LIST aus ISE Eiffel 3. Das Beispiel ist bereits um ca. 2/3 gekürzt und zeigt, wie unübersichtlich die Ausgabe sein kann. Die Flatshort-Form (also die volle Klassenschnittstelle) ist ca. dreifach so lang. Ein weiteres Filtern der Informationsflut ist nicht möglich. Die Kommentierung und Strukturierung ist direkt aus dem Quelltext übernommen und sieht bei weniger gut formatierten Quelltexten entsprechend unübersichtlicher aus.
indexing description: "Sequential, one-way linked lists" status: "See notice at end of class" names: linked_list, sequence representation: linked access: index, cursor, membership contents: generic date: "$Date: 94/01/04 12:25:59 $" revision: "$Revision: 1.3 $"
class interface LINKED_LIST [G]
creation make
feature -- Access
cursor: CURSOR -- Current cursor position
first: like item -- Item at first position
index: INTEGER -- Index of current position
item: G -- Current item
last: like item -- Item at last position
feature -- Cursor movement
back -- Move to previous item.
finish -- Move cursor to last position. -- (Go before if empty) ensure empty_convention: empty implies before
forth -- Move cursor to next position.
go_i_th (i: INTEGER) -- Move cursor to `i'-th position.
go_to (p: CURSOR) -- Move cursor to position `p'.
move (i: INTEGER) -- Move cursor `i' positions. The cursor -- may end up `off' if the offset is too big. ensure moved_if_inbounds: ((old index + i) >= 0 and (old index + i) <= (count + 1)) implies index = (old index + i); before_set: (old index + i) <= 0 implies before; after_set: (old index + i) >= (count + 1) implies after
start -- Move cursor to first position. ensure empty_convention: empty implies after
[...]
invariant prunable: prunable;
end -- class LINKED_LIST Abb. 2: Short-Form der Klasse LINKED_LIST (gekürzt) Der graphische Browser good unterstützt das interaktive Untersuchen des Systems und stellt die Beziehungen der Klassen graphisch dar. Prinzipiell ist good dazu gedacht, das Zusammenspiel aller Klassen eines Eiffel-Universums darzustellen. Dies gelingt aber nur sehr bedingt, da "die Arbeitsfläche beschränkt ist und die Funktionen zum Filtern der Informationsmenge nicht ausreichen" ([Strunk 92]). Auch ist kein Zugriff auf den Quelltext der dargestellten Klassen vorgesehen ([GamWeiMar 89]), und die Bedienung weist diverse Probleme auf. Statt auf good weiter einzugehen, beschreibe ich im nächsten Abschnitt die neue Entwicklungsumgebung von ISE, die good ersetzt hat (siehe [Strunk 92] für eine ausführlichere Kritik an good). Die hier beschriebenen Werkzeuge wurden zusammen mit ISE Eiffel 2.x ausgeliefert. Bei anderen Compilern sind z.T. ähnliche, aber z.T. auch überhaupt keine Werkzeuge enthalten (so z.B. SiG Eiffel/S), so daß man bei ihnen auf das Handbuch und das Studium der Quelltexte für die Bibliotheken angewiesen ist. Bei der Arbeit mit nicht vom Compiler-Hersteller gelieferten Quelltexten ist man ausschließlich auf die direkte Arbeit mit dem Quelltext angewiesen. 5.2. Die Entwicklungsumgebung von ISE Eiffel 3In der neusten Version von ISE Eiffel 3 hat man einige der Probleme der alten Werkzeuge erkannt. Die Entwicklungsumgebung ist erweitert worden [Meyer 94], und es steht innerhalb der Entwicklungsumgebung ebench ein Klassen-Browser, das sog. Class Tool, zur Verfügung. Das Class Tool stellt per default den Quelltext der Klasse dar. Durch Anklicken eines Icons am unteren Rand des Fensters kann man stattdessen die bereits beschriebene Short-Form, Flat-Form oder Flatshort-Form darstellen lassen. Insoweit sind die bisherigen Umgangsformen nur auf eine graphische Oberfläche umgesetzt worden.
Abb. 3: Das Class Tool mit der Klasse LINKED_LIST Alternativ können die Ober- oder Unterklassen in textueller Darstellung als Baum angezeigt werden. Weiterhin kann man sich statt des Klassentextes eine Liste der Benutzer (Clients) der Klasse, der benutzten Klassen (Supplier), der Attribute der Klasse, der Routinen der Klasse, der aufgeschobenen (deferred) Routinen, der einmalig (once) ausgeführten Routinen oder der externen Routinen anzeigen lassen. Da man beliebig viele Fenster mit dem Class Tool öffnen kann, stehen alle Darstellungsformen auch parallel zur Verfügung. Änderungen können aber nur in der Quelltext-Darstellung vorgenommen werden. Da das Class Tool jedoch hauptsächlich als Browser ausgelegt ist, sind die Editor-Funktionen dementsprechend nur wenig mächtig. Die Darstellung in den anderen Fenstern wird bei Änderungen nicht aktualisiert. Die Funktionen um nur Attribute, nur Routinen o.ä. darzustellen (siehe Abb. 4) beziehen sich immer nur auf die aktuell bearbeitete Klasse, so daß ein gezieltes, klassenübergreifendes Suchen nach bestimmten Merkmalen nicht möglich ist.
Abb. 4: Die Icons des Class Tool Die alten Umgangsformen sind fast 1:1 auf eine graphische Oberfläche übertragen worden. Es ist nun zwar leichter, eine Short-Darstellung zu bekommen, aber die grundsätzliche Kritik, daß weitere Einschränkungen der Informationsmenge möglich sein sollten, bleibt bestehen. Es können immer entweder nur die Oberklassen oder nur die Unterklassen dargestellt werden und nicht die volle Vererbungshierarchie. Auch ist die textuelle Darstellung, die Vererbung durch Einrückungen darstellt, nur bedingt in der Lage, Mehrfachvererbung sinnvoll darzustellen. Da sie baumartig strukturiert ist, kann es vorkommen, daß bei Mehrfachvererbung eine Klasse auch mehrfach in der Vererbungshierarchie auftaucht, ohne daß zu erkennen wäre, daß sie anderen Orts noch einmal auftaucht. Ein Beispiel: In Abb. 5 taucht die Klasse LINKED_TREE sowohl als Unterklasse von DYNAMIC_TREE als auch als Unterklasse von LINKED_LIST auf. Der geneigte Leser möge selbst beurteilen, ob es ihm aufgefallen wäre.
Abb. 5: Darstellung von Vererbung im Class Tool Die Bedienung des Browsers ist gewöhnungsbedürftig und entspricht nicht unbedingt dem Styleguide der jeweiligen Plattform. Andererseits ist die Bedienung von ISE Eiffel 3 auf allen unterstützten Plattformen gleich, was man auch als Vorteil werten kann. Ein Beispiel für die ungewöhnliche Bedienung: Um im Class Tool die Implementation einer verwendeten Klasse anzeigen zu lassen muß zunächst auf die anklickbare Darstellung umgeschaltet und dann der Klassenname mit der rechten Maustaste auf das Icon des Class Tools gezogen werden. Die z.T. ins Feld geführte mangelnde Stabilität des Browsers (vergl. [Shipman 94]) ist bei mir nicht aufgetreten. 5.3. Browser für andere objektorientierte SprachenDa mir keine weiteren Browser für Eiffel zur Verfügung standen, habe ich auch einige Browser für andere objektorientierte Sprache betrachtet, um ihre Funktionalität mit der von Eiffel-Browsern zu vergleichen. 5.3.1. Der Browser von Visual C++Visual C++ von Microsoft stellt eine integrierte Entwicklungsumgebung zur Verfügung, die unter anderem auch einen Browser enthält (vergl. [Microsoft 93]). Ein Compilerschalter sorgt dafür, daß während des Compilierens zum jeweiligen Projekt eine Datenbank für den Browser aufgebaut wird. Diese Datenbank steht dann nach dem Linken des Projektes zur Verfügung. Der Browser stellt eine Liste der Namen aller Klassen, Methoden etc. des Projektes dar. Zu jedem dieser Einträge kann man sich eine Liste mit den Definitionen des Namens und allen Verwendungen anzeigen lassen. Die dargestellten Einträge können auf Funktionen, Variablen, Typen, Makros oder Klassen eingeschränkt werden. Zusätzlich können sie noch durch Wildcards in begrenztem Maße eingeschränkt werden.
Abb. 6: Der Browser von Visual C++ Über den Call Graph bzw. den Caller Graph kann dargestellt werden, welche Funktion von einer anderen aufgerufen wird. Benutzt-Beziehungen auf Klassenebene können nicht betrachtet werden. Um die Vererbungshierarchie darstellen zu lassen, kann man sich entweder den Graph der Oberklassen oder den Graph der Unterklassen anzeigen lassen. Um die Menge der angezeigten Informationen zu reduzieren, kann man einen Untergraph zu einem Knoten zusammenfassen lassen ("Colapse Node"). Eine Kombination der beiden Graphen ist nicht möglich, bzw. man müßte alle Unterklassen der Wurzelklasse anzeigen lassen. Durch die baumartige Anordnung läßt sich Mehrfachvererbung nicht sinnvoll darstellen. Bei allen Darstellungen kann man durch einen Doppelklick auf das Symbol zu seiner Definition gelangen. Da der Compiler die Informationen für die Browser-Datenbank sammelt, können nur compilierbare Quelltexte überhaupt untersucht werden. Sogar korrekte Klassen können nicht betrachtet werden, wenn es noch inkorrekte Klassen an anderen Stellen im Projekt gibt. Eine zusätzliche Problematik ist die Konsistenz der Browser-Informationen: Nach Änderungen im Quelltext sind die Informationen im Browser inkonsistent, bis das Projekt erneut compiliert und gelinkt wird. Der Benutzer wird nicht über den inkonsistenten Zustand informiert. Selbst bei kleinen Projekten wird der (ohnehin schon recht langsame) Compiler durch das Sammeln von Browser-Informationen erheblich verlangsamt, so daß man den Browser nur aktiviert, wenn man meint, ihn dringend zu brauchen. Auch die Bedienung des Browsers ist etwas umständlich, da jede Veränderung der Sucheinstellungen mit einem Klick auf "Display Result" bestätigt werden muß. 5.3.2. Sniff+Sniff+ ist eine auf C und C++ ausgerichtete Entwicklungsumgebung, die von der Firma TakeFive, Salzburg vertrieben wird. Ein Ziel von Sniff+ ist es, die Entwicklung von großen Softwareprojekten[5] zu unterstützen. Eine ganze Reihe von Werkzeugen ist eng miteinander integriert, um die Bearbeitung der Quelltexte zu erleichtern ([Bischofberger 92]). Die zu bearbeitenden Dateien werden mit dem Projekt-Editor in Projekte und Unterprojekte zusammengefaßt. Auf diese Weise ist es möglich, große Projekte in Module und Bibliotheken zu strukturieren und somit überschaubarer zu machen. Zusätzlich steigert dieses Vorgehen die Effizienz von Sniff+, da für alle Benutzer die Informationen über die verwalteten Quelltexte zentral vorgehalten werden können. Der Editor erlaubt ein hypertext-artiges Navigieren zwischen den im Quelltext vorkommenden Methoden. Mit einem Doppelklick auf ein an der Seite aufgelistetes Symbol gelangt man wahlweise zu dessen Definition bzw. Implementation. (Anmerkung: In C++ ist es üblich, die Definition und Implementation von Methoden zu trennen, meist sogar in unterschiedliche Dateien.)
Abb. 7: Der Editor von Sniff+ Weiterhin markiert der Editor Klassen-, Methoden- und Variablennamen sowie Kommentare und abstrakte Klassen farblich bzw. mit einem anderen Font. Der Programmierer kann so auf einer höheren Ebene als der einer Textdatei arbeiten. Er ist jedoch nicht, wie bei der Arbeit mit vielen syntaxgesteuerten Editoren, in seiner Freiheit eingeschränkt, den Quelltext frei zu formatieren oder auch über längere Zeit hinweg syntaktisch inkorrekten Quelltext zu bearbeiten. Sobald Änderungen des Quelltextes im Editor gespeichert werden, werden die Symboldefinitionen für den Editor und alle anderen Browser-Werkzeuge aktualisiert. Auch die Anzeige aller geöffneten Fenster wird sofort automatisch aktualisiert. Der Hierarchie-Browser stellt die Vererbungshierarchien graphisch dar. Mit einem Doppelklick auf eine Klasse gelangt man zu ihrer Definition bzw. Implementation oder über das Menü in eine beliebige andere Komponente von Sniff+. Um die Zahl der angezeigten Klassen zu reduzieren, stehen mehrere Möglichkeiten zur Verfügung: Man kann eine Reihe von Klasse markieren und alle anderen ausblenden lassen, oder man kann die dargestellte Hierarchie auf die Ober- und Unterklassen einer bestimmten Klasse reduzieren lassen, an der man gerade interessiert ist. Zusätzlich besteht die Möglichkeit, die Anzeige auf bestimmte Unterprojekte zu reduzieren. Auch im Hierarchie-Browser sind abstrakte Klassen durch kursive Schrift hervorgehoben, da sie oft abstrakte Protokolle implementieren, über die Klassen miteinander interagieren.
Abb. 8: Der Hierarchie-Browser von Sniff+ Der Class-Browser stellt alle Merkmale einer Klasse dar. Dabei können wahlweise alle Merkmale oder nur die in der Klasse selbst definierten Eigenschaften dargestellt werden. Wahlweise können auch nur ganz bestimmte Oberklassen aus dem (mit angezeigten) Vererbungsgraph ausgeblendet werden. Zu jedem dargestellten Merkmal wird die Klasse angezeigt, in der es definiert wurde. Weiterhin können die angezeigten Merkmale nach verschiedenen Kategorien (Methoden, Variablen, Konstanten etc.) ein- und ausgeblendet und mit regulären Ausdrücken weiter eingeschränkt werden. Einige Eigenschaften der angezeigten Merkmale werden visuell hervorgehoben (z.B. Sichtbarkeit, abstrakte Methode). Wahlweise werden auch die von dieser Klasse überladenen Eigenschaften der Oberklassen mit angezeigt.
Abb. 9: Der Class-Browser von Sniff+ Der Symbol-Browser erlaubt es, nach den Definitionen bestimmter Symbole (Namen) über ganze Projekte hinweg zu suchen. Da der Symbol-Browser die Syntax von C bzw. C++ kennt, wird aber nicht auf Text-Ebene, sondern bereits auf der Ebene von Klassen- und Methodennamen etc. gearbeitet. So kann der Symbol-Browser beispielsweise alle Methodennamen eines Unterprojekts darstellen, die mit dem Präfix "Create" beginnen. Um die Verwendung von Namen innerhalb des Quelltextes finden zu können, gibt es den Retriever. Er erlaubt die Suche nach regulären Ausdrücken über ein ganzes (Teil-)Projekt hinweg. Er ist dem Unix-Werkzeug grep jedoch dadurch überlegen, daß er die Syntax von C/C++ kennt und die Suche auf bestimmte syntaktische Konstrukte einschränken kann. Er wäre beispielsweise in der Lage, alle Zuweisungen auf mit dem Präfix "Window" beginnende Variablen zu finden. Die Extraktion der Informationen erfolgt mit einem sog. Fuzzy-Parser[6], so daß es nicht nötig ist, die Quelltexte zu compilieren, um sie browsen zu können. Mehr noch müssen die Quelltexte überhaupt nicht compilierbar sein, da der Fuzzy-Parser sich bemüht, auch aus Quelltexten mit syntaktischen Fehlern die Informationen über deren Struktur zu extrahieren. Auf diese Weise kann Sniff+ auch mit einer großen Zahl von Compilern eingesetzt werden, deren Syntax sich oft im Detail unterscheidet. Normalerweise wird das Fenster des jeweiligen Werkzeugtyps mit den neuen Informationen gefüllt, sobald man andere Informationen selektiert. Es besteht zusätzlich aber auch die Möglichkeit, Fenster als "frozen" zu markieren, so daß für weitere Sichten zusätzliche Fenster geöffnet werden. Die Stärke von Sniff+ besteht darin, daß man auf der Ebene von symbolischen Informationen und Konstrukten der Programmiersprache arbeiten kann, da alle Werkzeuge die Syntax der Programmiersprache kennen und die Arbeit mit ihr unterstützen. 5.4. Funktionalität von BrowsernDie folgende Tabelle zeigt die Funktionalität der verschiedenen Browser im Überblick:
5.5. Anforderungen an einen Eiffel-BrowserEin Eiffel-Browser sollte es dem Entwickler erlauben, auf einer möglichst hohen Abstraktionsebene zu arbeiten. Wichtig ist die Visualisierung des Software-Designs und nicht die Implementierungsdetails in einer speziellen Sprache (vergl. [KilGryZül 93], S. 69). Im Sinne des Arbeitens auf möglichst hohen Niveaus wäre es wünschenswert, wenn der Browser auch die verwendeten Design-Pattern (vergl. [Gamma 92] und [Gamma 95]) darstellen könnte. Um auch größere Projekte bearbeiten zu können, ist es unbedingt notwendig, die dargestellte Informationsmenge filtern zu können. Hier bietet sich ein Filtern nach Kategorien (Klassen, Methoden, Methoden mit speziellen Eigenschaften) an. Weiterhin sollte es aber auch möglich sein, die dargestellten Symbole mit Wildcards zu filtern bzw. explizit anzugeben, welche Klassen z.B. in einer Vererbungshierarchie angezeigt werden sollen. Eins der wichtigsten Strukturierungsmittel in der objektorientierten Programmierung ist die Vererbung (auch wenn sie von verschiedenen Schulen unterschiedlich eingesetzt wird). Daher muß ein Browser für Eiffel die Vererbungs-Hierarchie möglichst flexibel darstellen können. Wünschenswert wäre auch die Darstellung, welche Klassen einander benutzen. Eine solche Darstellung ist aber nur aussagekräftig, wenn Polymorphie berücksichtigt wird. Da es aber erst zur Laufzeit feststellbar ist, welche Klassen wirklich benutzt werden, müßten alle möglichen Benutzungs-Beziehungen vom Browser dargestellt werden, was zu einer unübersichtlichen und damit entwerteten Darstellung führt (vergl. [Bischofberger 94a]). Es sollte möglich sein, mehrere Sichten auf den Quelltext gleichzeitig zu haben. Wichtig ist aber auch, daß diese bei Änderungen im Quelltext sofort (und automatisch !) aktualisiert werden. Auch ein noch so guter Browser wird nicht alle Fragen über den Quelltext auf einer abstrakten Ebene beantworten können. Daher sollte auch der Rückgriff auf den Quelltext mit einem integrierten Editor immer möglich sein. Aber auch im Editor sollte die bearbeitete Sprache z.B. durch Syntax-Highlighting (hervorgehobene Anzeige verschiedener syntaktischer Strukturen, z.B. Methodennamen, Kommentare etc.) unterstützt werden. Um den Browser von speziellen Eiffel-Implementationen unabhängig zu halten, muß er auch ein eigenes Projekt-Konzept haben. Zwar wurde von Meyer in der Sprachreferenz eine Beschreibungssprache für Eiffel-Universums vorgeschlagen (LACE), aber alle vorhandenen Implementationen haben eine eigene inkompatible Variante implementiert. Um aber die verwendeten Bibliotheksklassen finden zu können, muß der Browser den Umfang des Eiffel-Universums kennen, d.h. der Programmierer muß die Möglichkeit haben, alle zum Universum gehörigen Teile dem Projekt hinzuzufügen. Prinzipiell sollte eine möglichst flexible Handhabung möglich sein, denn die hier zu unterstützende Tätigkeit ist sehr anspruchsvoll, und der Entwickler einer Browsers wird niemals alle möglichen Umgangsformen mit dem von ihm entwickelten Browser vorhersehen können. Der Benutzer sollte also dynamisch die dargestellten Informationen filtern und durchsuchen können. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Last updated: 24. Aug 2005 Page maintained by Jan Willamowius Imprint/Impressum · Privacy/Datenschutz | Deutsch: Home | Badminton | ISBN-Suche | Musik-Suche | Rezepte | Jan Willamowius |