Mercurial > hg > xemacs-beta
diff man/br-design.texi @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | ac2d302a0011 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/br-design.texi Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,1084 @@ +\input texinfo @c -*-texinfo-*- + +@c %**start of header (This is for running Texinfo on a region.) +@setfilename br-design.info +@settitle The OO-Browser Design +@c %**end of header (This is for running Texinfo on a region.) +@synindex vr fn + +@iftex +@finalout +@end iftex + +@titlepage +@sp 4 +@center @titlefont{Design Issues in the OO-Browser} +@sp 5 +@center Bob Weiner +@center Motorola Inc. + +@sp 2 +@center March 1991 and January 1993 + +@end titlepage +@page + +@node Top, Design Issues, (dir), (dir) +@unnumbered Abstract + +The OO-Browser is an efficient object-oriented class browser. It has a +completely direct-manipulation interface with multiple modalities. It +may be used for both system exploration and for browsing purposes as +part of a professional software development tool chest. It quickly +displays and provides views of complicated inheritance trees, making +it an important tool for understanding object-oriented systems. It is +integrated with a powerful editing environment that can be customized +to meet personal work styles. + +The OO-Browser is the first such tool to work with a multiplicity of +object-oriented languages. It currently supports five object-oriented +languages (Eiffel, C++, Objective-C, CLOS (Lisp), and Smalltalk) and +one documentation language (GNU Info). Adding a new language is fairly +straightforward and can be done in one to five days. + +This paper has three main parts. The first discusses issues in the design +of the OO-Browser, emphasizing its unique aspects. Issues pertinent to +all class browsers are touched upon and an explanation is given for how +the OO-Browser approaches each of them. + +The second part examines the actual implementation. It concentrates on +the user interface aspects and how they empower the user. Novel +concepts introduced by the browser are discussed. They include: a +merged help/command menu construct, dynamic method location, Environment +class groupings, and browsing based on source code only. + +The third part suggests directions for future work. + +@menu +* Design Issues:: +* Design Specifics:: +* Further Work:: +* Conclusion:: + + --- The Detailed Node Listing --- + +Interactivity + +* Build Speed:: +* Query Response Time:: + +Textual User Interface + +* Environments:: + +Direct Manipulation + +* In C++:: +* In Eiffel:: + +Alternate Interfaces + +* Environments:: + +Environments + +* Env Create:: +* Env Build:: +* Env Load:: +* Env Save:: +* Env Update:: + +Expand Query Types + +* Dynamic Object Browsing:: +* Tool Integration:: +* Graphical Interface:: +* Version Control:: +@end menu + +@node Design Issues, Design Specifics, Top, Top +@chapter Design Issues in the OO-Browser + +@section Background + +The OO-Browser was initially conceived for utilitarian reasons. A +simple, fast class browser was needed for a development project based +in the object-oriented language, Eiffel. The browsers available for +Eiffel were deemed weak and of not much value. + +Since I had built tools in the past on top of the GNU Emacs +environment, I knew that this could be a rapid process, even when a +high-level interface was needed. GNU Emacs was also the preferred local +editor, so close integration with it was considered a benefit. + +A simple prototype of the browser was completed in two days from +conception to implementation. Its user interface was based in part on +the Smalltalk-80 class browser under the assumption that this interface +had been developed over a long period of time to maximize developer +productivity. + +The prototype showed promise as a tool that would be useful for other +languages besides Eiffel. I identified C++ and Objective-C as the +languages most needy of such a tool. A separate prototype version for +each of these languages was done in a single day as a dramatic +demonstration of the generality of the concept. + +The road from prototype to a professional tool required a good amount +of work over an extended period as as an independent project. Browser +performance, structure and features were improved throughout this +period. A number of new languages were also added and all of these were +integrated via a single common kernel. A complete user manual was +written. The shared kernel browser was dubbed the OO-Browser. + +The architecture layered on top of GNU Emacs turned out to be a great +success for a number of reasons. + +@itemize @bullet + +@item +Both computational and interaction speed of the browser exceeded +most people's expectations. + +@item +Integration with Emacs meant that when interacting with the browser, +people could reuse the editing skills they had acquired from other +tasks. + +@item +The flexibility of Lisp provided a direct means for implementing +the common browser kernel. +@end itemize + +@menu +* Design Goals:: +* Interactivity:: +@end menu + +@node Design Goals, Interactivity, Design Issues, Design Issues +@section Design Goals + +The OO-Browser was initially designed in response to the lack of easy to +use class browsers in the many emerging object-oriented language +environments of today. In fact, many environments still consist of +nothing more than a compiler and a debugger. Even those environments +that contain browsers, often offer weak ones with barely usable interfaces. +The well-known Smalltalk environments [@cite{Goldberg 83}] are the only +notable exceptions. Some excellent C++ support environments are now +just emerging (Saber-C++, ObjectWorks for C++, Field, ET++). + +The OO-Browser was meant to be small, fast, and easy to use. So far it +has met all of those goals. There are three main uses that I see for a +class browser: + +@table @strong +@item Design Tool +A browser should allow for the location of classes +that meet a specified set of criteria. It should be just as easy to +determine that no such class exists. A more difficult task is to +determine similar classes that might be of interest to the user. + +@item Exploration Tool +The browser should allow one to explore libraries of classes as well as +full programs. It should be especially useful when one is unfamiliar +with the set of components that one is browsing. + +@item Engine Interface +The browser engine should be usable without the user interface, so that +one can use the browser features while editing and so that programs may +use the browser capabilities with their own user interfaces. +@end table + + +The quality with which a browser provides the above services can be surveyed by +examining a number of issues: + +@table @strong +@item Interactivity +The browser should preprocess source files quickly. +It should also answer queries with minimal delay so that the user +maintains a sense of interactivity. + +@item Usability +It should be easy to invoke and just as easy to put +away, so that it does not distract from other tasks in which the +developer is involved. + +@item Consistency +A user of the browser should be able to learn a small +set of interaction techniques and thereby access a broad set of +functions. He should also be able to build on these fundamental +concepts to achieve higher levels of proficiency with the tool. + +@item Scalability +It should scale up well and maintain its speediness +with libraries of thousands of classes. + +@item Integration +It should integrate well with a program editing +environment, providing language specific features to speed the +development process. + +@item Extensibility +The browser should be extensible by a competent programmer. +@end table + +@noindent +Let us discuss separately each of these issues to see how the OO-Browser +addresses them. + + +@node Interactivity, , Design Goals, Design Issues +@section Interactivity + +There are two interactivity concerns associated with most class +browsers, speed of database construction and query response time. + +@menu +* Build Speed:: +* Query Response Time:: +@end menu + +@node Build Speed, Query Response Time, Interactivity, Interactivity +@subsection Build Speed + +The first concern involves the speed with which the browser can +extract any information it needs in building a cache or database of +information from the code. If this is a long, involved process, users +will want it performed in a batch fashion so that it does not delay +their workflow. The rebuilding of databases at night or on idle +processors is a common solution. The drawback to this is that it +likely precludes the use of the browser for immediate exploration of +newly discovered or procured class libraries. If on the other hand, +this building process is rapid, the user will be much more likely to +experiment with the tool and to use it for exploring new class sets. + +The OO-Browser takes the latter approach. It builds a minimal lookup +structure derived directly from class source. It assumes that the +classes it scans are syntactically correct and therefore needs parse +only a small fraction of the code scanned. This scanner can +distinguish between declarations and definitions. It recognizes +commented passages and so ignores valid definitions embedded within +them. + +The result is that even though this scanning code has not yet been +optimized, it can scan hundreds of classes a minute on a single +processor machine. This speed is fast enough that when users come +upon an unfamiliar class library, they simply ask the browser to scan +it and wait for its initial display of the class list found from the +scan. + +Still, on some platforms, the lookup structures for very large class +libraries may be better built in a batch fashion. The OO-Browser +includes a mechanism for doing so via a simple command line invocation +which can be scheduled with the UNIX 'cron' utility. + +@node Query Response Time, , Build Speed, Interactivity +@subsection Query Response Time + +Most browsing operations represent some form of query. Show the +ancestors for this class. List all classes that contain the string, +'window'. How many classes are in this library? + +Query responses must therefore be fast enough to give the user a sense +of close knit interaction. This is the reason much effort is often +put into the database back ends of program support environments. + +The OO-Browser instead uses basic caching techniques to optimize the +most common queries. These techniques work surprisingly well, even +for environments containing thousands of classes. + +One of the most common queries given to the OO-Browser is to show +descendency or ancestry graphs for a set of classes. On a +workstation, a graph involving about 500 classes can be computed and +displayed in three to four seconds. Smaller queries receive +instantaneous replies. + + +@section Usability + +With the emergence of multi-windowed graphical interfaces in recent +years, man-machine interaction has become much more complex. Many +environments have been converted to these interfaces in the name of +ease of use, but often the user is left with less control than he had +before. + +A common example is the window pile problem that results when many +applications share a display space and each creates a new window every +time a simple action, like setting a parameter value, must be +performed. A user often is left to use simple push and pop funtions +to wade through the window layers to find one he may want. + +This sort of behavior was considered unacceptable for the OO-Browser. +To avoid those situations, the browser performs its own window +management. The browser is invoked by a key press or menu selection. +It then displays all of its windows. Another key can be used to put +the browser away, essentially to hide it from view. All of its +windows then disappear. Since the user has not actually quit from the +browser, when he invokes it again, his entire context is restored, +both visually and computationally. With such an interface, browsing +becomes a basic reflex. Invoke browser. Locate desired class for +editing. Hide browser, leaving selected class visible. Continue work. + + +@section Consistency + +Consistency and usability go hand in hand. Techniques of good design +dictate that a designer should play upon the skills that his user base +brings with them. New interface metaphors should be carefully thought +out. Their benefits should be weighed against the cognitive strain +that new users will necessarily endure. + +Editing skills, for example, become almost hard-wired into skilled +computer users psyches so that little conscious action is needed to +perform common tasks. Yet often, each new application offers a +different editing model without adding any new editing benefits for the +user. This sort of design is especially egregious in a tool-based +environment where the designer knows that his users will likely need a +variety of tools to do their work. + +The OO-Browser avoids this sin by integrating with the popular GNU +Emacs editor. Since Emacs provides a modeless editing environment in +which any command may be executed at any time, all normal Emacs +editing funtions are available while the user is within the browser's +Emacs interface. So, for example, if one already knows how to search +an edit buffer for a particular string, one simply does the same thing +within the browser. + +Browser key bindings are carefully selected to be both mnemonic and +consistent with standard Emacs key usage. In mouse-based +environments, direct manipulation techniques are supported, so the +user can select the entity he wants to operate on and the command he +wants to apply without the need to memorize any key names. + + +@section Scalability + +The term educational programming environment is too often used to +describe tools too weak to be used for real development projects. +This is a common syndrome associated with highly interactive tools. +They simply don't scale up for use in large, distributed projects. + +@noindent +The symptoms of this syndrome in browsing tools include: +@enumerate +@item +the ability to browse code from only one root directory at a time; + +@item +support for only one browsing environment under which all classes must +be lumped; + +@item +slow performance with large class sets; + +@item +ability to operate on only one class/category at a time; + +@item +no portability of the interface or tool itself. +@end enumerate + +The OO-Browser has so far seemed to scale well. It uses the concept +of Environments to address symptoms (1) and (2). For each instance of +the OO-Browser, the user selects a current Environment which he wants +to browse. (Environments are discussed later in this paper.) Each +Environment may include source from any number of directories, +distributed across machines using file sharing systems like NFS or +Apollo's Domain system. Each Environment contains classes written in +a single language. The user may select another Environment at any +time and thereby switch languages. + +Symptom (3) has been addressed in the previous section on @strong{Query +Response Time}. + +Symptom (4) does not exist in the OO-Browser. Virtually all commands +that can be applied to a single class may also be applied to any class +list returned by a browser query. + +Symptom (5) is not a problem either. The OO-Browser is extremely +portable. The browser runs on any UNIX system on which GNU Emacs +runs, which is virtually every one. Therefore, a user can run the +browser on platforms from any vendor. The graphical interface to the +OO-Browser runs under the portable X Window System. It currently uses +a Motif-based interface, but may in the future be converted to an even +more portable interface toolkit. + + +@section Integration + +A browsing tool is but one piece of the development environment. It +must therefore not only do its job but also support the style of +program development followed at a site. + +The OO-Browser supports object-oriented development. Object-oriented +development is necessarily incremental and component-based. The browser +allows one to edit a class and then incrementally update the browsing +environment with any changes. It lets developers think in terms of +classes, the building blocks of object-oriented languages, without +regard to where the classes are located. + +Each browser language mode is tailored to the specifics of the +language. For Eiffel, it supports the location of method definitions +that have been repeatedly renamed throughout the inheritance +graph. For C++, support for method overloading and multiple +inheritance is included. + +Editor integration is critical in a browser, as this is the mainstay +tool for program development. Surprisingly, this is not universally +understood. Stepstone Corporation's Objective-C browser still does +not allow one to edit classes that it displays. Only the newest +versions of Interactive Software Engineering's Eiffel browsers allow +one to edit classes; one still cannot simply select a class name +returned as a result of a query in order to edit it. + +Besides the Emacs interface, the current OO-Browser version allows the +use of alternate editors, so that a user need not become familiar with +the Emacs editing model if he is not already. It still uses the Emacs +lisp engine as a back end to process browser requests, but allows the +user to edit classes with whatever program he likes. The graphical +interface also supports the use of any desired editor. For non-Emacs +users, it is a simple matter to produce a turnkey command that allows +use of the browser without any prior knowledge. + + +@section Extensibility + +The whole open systems phenomenon arose after corporate users tired of +relying on vendors to provide proprietary solutions to simple +problems. The choice of an open system allows one to seek software +solutions and system support from a larger pool of organizations than +with closed systems. + +Similar needs are now arising in the programming support arena. +Closed systems seldom meet all of the needs of the user base. Without +a back end customization language, users are left to the whims of the +developer to decide whether a feature is important enough to include. +Macro language provisions are too weak to allow all the changes that may be +desired, so a full programming language interface is needed for +advanced user customization. + +Simple customizations are performed by setting values of attributes +included as user variables in the OO-Browser. More advanced +customizations, like the addition of a new query type are performed in +GNU Emacs Lisp. Most of the OO-Browser is written in the Lisp dialect. +It is a fully interpreted language and so is natural to use as a +customization language since each change may be immediately tested. + +As noted earlier, an entire language interface can be built in a +matter of days, demonstrating both the flexibility of Lisp and of the +language interface provided by the OO-Browser. + + +@node Design Specifics, Further Work, Design Issues, Top +@chapter OO-Browser Design Specifics + +@menu +* Textual User Interface:: +* Graphical Tree Display:: +* Direct Manipulation:: +* Alternate Interfaces:: +* Environments:: +@end menu + +@node Textual User Interface, Graphical Tree Display, Design Specifics, Design Specifics +@section Textual User Interface + +The screen shot on the following page highlights the major components +of the OO-Browser textual user interface. The windows across the top of the +OO-Browser screen are called @dfn{class listing windows}; they display +@dfn{class listing buffers} with a single class name per line. The +@dfn{class viewer window}, sometimes simply referred to as the +@dfn{viewer window}, fills the bottom half of the screen. It is used +to display class source and summary information. Pictured here in the +viewer window is the command help/menu buffer, summarizing the browser's +command key bindings. + +The number of listing windows is limited only by the screen width. The +width of the windows may be interactively adjusted to permit more or +fewer windows for particular tasks. CLOS identifiers are typically much +longer than Eiffel identifiers, so one would want to raise the window +width when operating on CLOS classes. + +@menu +* Hierarchy Listings:: +@end menu + +@node Hierarchy Listings, , Textual User Interface, Textual User Interface +@subsection Hierarchy Listings + +The directed, acyclic graph relations prevalent in languages with +multiple inheritance are translated into textual hierarchies by repeating +elements with multiple parents throughout the tree structure. So if +class B inherits from C and class C inherits from P1, P2 and P3. One +view of descendants would show: + +@example + P1 + C + B + P2 + C ... + P3 + C ... +@end example + +The ellipses indicate that C's subtree has been expanded somewhere +above, so it is not repeated. The resultant structure is easy to +understand and very useful. This sort of structure allows one to use +the browser on a text-only terminal and still be able to visualize +significant inheritance relations. + +@noindent +Queries that may be made under this interface include: +@itemize @bullet +@item +show parents +@item +show children +@item +show ancestors +@item +show descendants +@item +total selected classes +@item +select classes matching regular expression or string. +@end itemize + +@noindent +All of these commands may be applied to any grouping of classes, +eliminating the sequential bottleneck found in many other such tools. + +All displays that move up the inheritance tree consume a listing window +to the left of the current one. Descendancy displays do the opposite +and select the window to the right. At the edges of the display, the +window selected wraps around to the other side. An exit command +clears the current listing buffer and returns to the last one, +regardless of how the user walks up and down the trees. Ancestor +listings may be shown with parent down to root (highest level ancestor) +or inverted, with root down to parent, so that children are always +displayed below their parents. + +The class matching command is fast and easy to use. + + +@noindent +Besides queries, a few of the useful commands provided are: +@itemize @bullet +@item +sort classes +@item +view class source +@item +edit class source +@item +save class listing. +@end itemize + +The editor is user selectable. The ability to sort any class listing +simplifies class location. The @emph{save class listing} command is +useful to record the output of interesting queries for documentation and +reference purposes. + +All browser queries and commands work with class source code only. This +makes the tool useful in exploratory situations where a compiler is not +available. It also ensures that the browser receives up to date +information from which to work. + + +@node Graphical Tree Display, Direct Manipulation, Textual User Interface, Design Specifics +@section Graphical Tree Display + +The graphical interface to the browser provides a compact tree-based +view of a set of classes or an Info manual. (A sample enlarged display +is shown on the following page. It uses the same set of classes as the +prior picture of the textual display, for ease of comparison.) This +interface supplements the textual interface so that the user can easily +comprehend large inheritance structures. (Nodes with more than one +incoming pointer (parent) are repeated throughout the tree, but their +subtrees are excised and replaced with the ellipses symbol, ..., just as +in the textual interface. Subtrees may be collapsed or expanded +interactively. Scrolling mechanisms are limited to horizontal and +vertical scroll bars, but a panning construct is being considered. + +When the user finds a class he is interested in, he simply selects it +with the same mouse button he uses to select classes in the textual +interface. The node is highlighted and the associated class is +displayed in the text editor. + +The graphical interface can be invoked on any portion of the current +browser Environment. One may for instance, obtain a list of classes +with 'Stack' in their name and then through a mouse click, invoke the +graphical browser on just the descendancy trees of the selected classes. + +Any number of graphical browser views may be shown at the same time. +Each view is independent, so each may provide a view of any environment +previously created by the OO-Browser. All views can communicate with a +single instance of the editor, so that one can maintain onscreen views +of multiple environments, even across languages, and simply select any +node from any view to access the corresponding source. + +A new, window-system independent version of the graphical interface +provides double buffered display updates for smooth scrolling, a panner +device for rapid movement throughout a view, and a number of useful tree +display representation alternatives. + +The graphical interface is presently somewhat limited, but that is only +because it is so new. It is a straightforward matter to provide a user +of the graphical interface with the full complement of browser commands +by adding the commands to a set of menus and sending each command to the +browser engine as it is selected. + + +@node Direct Manipulation, Alternate Interfaces, Graphical Tree Display, Design Specifics +@section Direct Manipulation + +To maximize the utility of the displays presented to the user, most +displayed entities may be operated upon through simple mouse clicks. +For example, clicking on a class name displays the associated class +definition. Clicking to the left of a class displays its ancestors and +to the right its descendants. Selection of the ellipses after a class +name shifts the display focus to the class' descendants list. + +A click in an empty listing buffer may display the browser help text or +a menu of language-specific source files which the user has browsed. +This menu permits random access selection of any class file. + +A click on any of the command descriptions in the help display executes +the associated command on the previously selected item. This is such a +useful, intuitive means of control that it is surprising that one never +sees this capability in application interfaces. + + + +@menu +* In C++:: +* In Eiffel:: +@end menu + +@node In C++, In Eiffel, Direct Manipulation, Direct Manipulation +@subsection In C++ + +@cindex C++ +Entities in C++ programs may be selected for inspection with the middle +mouse button. Most importantly, once a class header file is displayed, +one simply clicks on a method declaration to see its corresponding +definition. Each feature declaration should be given separately to +ensure accurate parsing. If the method is inherited from another class, +a message at the bottom of the screen describes which class the method +is defined in once the browser displays the method definition. + +The browser dynamically handles full function overloading and numerous +other complex mappings between declaration and definition that are +permitted in C++. A complex set of pattern matching heuristics are used +which work in almost all cases. This is a novel approach that speeds +the construction of Environments, since no normalization is performed on +function signatures until they are operated upon. All other browsers +rely on preprocessing techniques which store a normalized form of the +declaration to match against the definition signature. + +Parent classes may be browsed in a similar manner by clicking on their +names in an inheritance or declaration clause. Multiple inheritance is +fully supported. There is no support as yet for locally scoped classes. + +Include files may be browsed by selecting their inclusion declarations +(@strong{#include} ...). + + + +@node In Eiffel, , In C++, Direct Manipulation +@subsection In Eiffel +@cindex Eiffel +Selection of a feature name in an export clause displays the feature +definition, even if it is renamed several times within ancestors. +Parent classes may be browsed in a similar manner by clicking on their +names in an inheritance or declaration clause. + +The following example of locating a renamed feature is taken from an +actual set of Eiffel library classes: + +@example +User selects feature @emph{subwindow} of @emph{POPUP_MENU} + inherited from @emph{WINDOW} + which renames @emph{child} as @emph{subwindow} + inherited from @emph{TWO_WAY_TREE} + which renames @emph{active} as @emph{child} + inherited from @emph{TWO_WAY_LIST} + inherited from @emph{LINKED_LIST} + which defines @emph{active}. +@end example + +The browser would display the feature @emph{active} and explain to the +user that feature @emph{subwindow} of class @emph{POPUP_MENU} is +inherited from feature @emph{active} of class @emph{LINKED_LIST}. +Location of this sort of feature definition would be incredibly tedious +without programmatic support. + +If a feature reference is selected within a non-deferred (non-abstract) +class, then deferred features are automatically ignored when searching +for the feature definition. If the reference class is deferred +(abstract), the first matching ancestral feature found is selected, +whether it is deferred or not. + +The algorithm used to locate features is dynamic, so if another class +is inserted into the inheritance structure given above, the feature +definition still will be located properly. + + + +@node Alternate Interfaces, Environments, Direct Manipulation, Design Specifics +@section Alternate Interfaces + +Earlier we mentioned that the computational back end, the @dfn{engine} +part of the browser should be available for use without its interface. +The interactive nature of Lisp allows the prototyping and delivery of +different interfaces quickly. For example, the graphical interface to +the browser was originally a standalone tree drawing program. A +prototype interface to the browser was developed in a matter of two +hours, with most of the time spent examining the unfamiliar code in the +tree drawing program. + +@noindent +Other simple but extremely useful interfaces we have provided include: +@itemize @bullet +@item +the ability to perform completion on type identifiers when programming; + +@item +support for compiler error parsing when the compiler outputs only the +class name and line number of the error; + +@item +a command that prompts for a class name and then edits the class, +with class name completion included. +@end itemize + +@noindent +All of these were straightforward to implement based upon the browser +engine functions. + +@menu +* Environments:: +@end menu + +@node Environments, , Alternate Interfaces, Design Specifics +@section Environments + +@cindex Environment, the +@cindex Library search list +@cindex System search list +Whenever the OO-Browser is in use, an Environment is selected. An +Environment may be built or simply specified. An @dfn{Environment +specification} tells the browser what to include in the construction of +an Environment. (@xref{Env Create, , Creating Envir Specs}, for more +info.) An OO-Browser @dfn{Environment} includes a set of inter-class +relationships together with a few browser settings. The phrase, +@dfn{the Environment}, refers to the current OO-Browser Environment. +Many browser commands depend on information in the Environment. A +summary of the components of the Environment may be displayed any time +during browser use. See the next page.@refill + +The set of classes included in an Environment is specified by two lists +of directories, below which all of the Environment's class source files +are to be found. (The OO-Browser will automatically search +sub-directories below the directories specified.) The first list of +directories is called the @dfn{Library search list}; it defines the +locations of stable, typically reusable classes that have been released +for general use. The second list is called the @dfn{System search +list}; it defines the locations of unreleased classes being developed, +often for a particular system. All class names within a single +Environment must be unique to ensure proper operation of the browser. +This also implies that the Library and System class sets be disjoint. + +The OO-Browser lets one create, update and save Environments. Once an +Environment file has been created, it may be loaded at any time. The +browser will then use this Environment for all of its operations until +another one is loaded. + +The browser maintains a separate Environment for each programming +language on which it is used. Thus, if one switches from Eiffel to +C++ browsing and then back to Eiffel browsing, the Eiffel environment +will not need to be reloaded; it will appear immediately and the +screen will appear as if the Eiffel OO-Browser were invoked for the +first time. Only one Environment per language is kept in memory. + +@cindex Environment, default +There is a default Environment file name for each browser-supported +language; these names are unique to each user account on the system: +@file{~/.br-eif-env}, @file{~/.br-c++-env}, @file{~/.br-objc-env}, +@file{~/.br-clos-env}, @file{~/.br-smt-env}, and @file{~/.br-info-env}. +Environment files are automatically created and loaded by the OO-Browser +so that one need never become familiar with their format.@refill + +Environments provide a simple, uniform way of managing numerous class +libraries. A simple extension to the browser is planned which will +allow one to interactively select Environments as one typically does +with files. Each Environment stores an indication of what language its +classes are in, so it can dictate which browser version to invoke. + + +@menu +* Env Create:: +* Env Build:: +* Env Load:: +* Env Save:: +* Env Update:: +@end menu + +@node Env Create, Env Build, Environments, Environments +@c node-name, next, previous, up +@subsection Creating Environment Specifications + +@cindex Environment specification +Environment specifications are useful when one wants to describe a +number of Environments to the OO-Browser but wants to defer their +construction until later. Large environments then can be built +overnight. @xref{Env Build, , Building Environments}, for more +info.@refill + +@findex br-env-create +@cindex initialization file +Every Environment must be specified before it can be built or used. +Thus, specifying an Environment is the first step in creating it. +An Environment create command interactively prompts for all information +necessary to specify and to build an Environment. This command may +be invoked repeatedly to quickly specify a number of different +Environments.@refill + +@noindent +Here are the Environment specification components for which the +OO-Browser prompts: +@table @code +@item System search directories +List of directories below which other System directories containing +class source code and directories of class source files may be found. + +@item Library search directories +List of directories below which Library files of class source code +and directories of class source files may be found. + +@item Save all Environment lookup tables? +@emph{Yes} means that a complete set of lookup tables should be saved as +a class Environment. @emph{No} means that some lookup tables should be +built from others when the tables are loaded from an Environment file. +Answering @emph{yes} doubles the size of each Environment file but +slightly speeds the loading of an Environment into the browser. +@emph{No} is the default that works best on most computers. +@end table + + +@node Env Build, Env Load, Env Create, Environments +@c node-name, next, previous, up +@subsection Building Environments + +@cindex Environment building +An Environment specification tells the OO-Browser what to include in the +Environment, but the Environment still must be built before use. When +class names or locations have changed or the Environment's inheritance +structure is modified, the Environment must be rebuilt. For small +Environment changes, one may use the class addition and deletion +features of the browser. @xref{Env Update, , Updating Environments}, +for more info.@refill + +@cindex Environment building, batch +@cindex large Environments +Very large Environments may be built overnight by invoking Emacs in +batch mode at a scheduled time. Note that the Environment specification +file must have been created prior to execution of this command so that +the browser knows what to build. + +@node Env Load, Env Save, Env Build, Environments +@c node-name, next, previous, up +@subsection Loading Environments + +@cindex Environment loading +A new Environment may be loaded for use at any time within the +OO-Browser. One may either select the load Environment command from +the on screen OO-Browser command summary or simply use the +language-specific browser invocation command that was originally used to +start the browser, except in this case, it should be preceded by a +prefix argument. For example, the @code{(eif-browse)} command, would +prompt for and then load a new Eiffel environment, even when one is +already browsing an Eiffel environment. + + +@node Env Save, Env Update, Env Load, Environments +@c node-name, next, previous, up +@subsection Permanently Storing Environments + +The OO-Browser automatically builds and saves Environments in most +cases. Occasionally one may find a need to force the Environment to +be saved to a file, as in the case when one wants to save an Environment +under a different file name. + +The Environment save command is used to force an Environment save to +occur. The command prompts for a file to save to, with the default +as the current Environment file name. + + +@node Env Update, , Env Save, Environments +@c node-name, next, previous, up +@subsection Updating Environments + +@findex br-add-class-file +@cindex class, adding to Environment +@cindex class, replacing in Environment +@cindex Environment, adding classes +@cindex Environment, replacing classes +@cindex initialization file +A file containing class definitions may be added to the Environment with +the add class file command. This will prompt for the file name, scan +the file, and then update the Environment. If a class defined in the +file is already in the Environment, its information will be replaced +with the information gathered from the file; otherwise, the class will +be added to the Environment. + +@cindex Environment, adding individual classes +To add a single class from a file containing multiple classes, the file +can be read into an Emacs buffer, the buffer narrowed to the desired +class and then the add command executed. @xref{Narrowing, , Narrowing, +emacs, The Gnu Emacs Manual}.@refill + +This command may also be used outside of the browser user interface when +one is editing a file in Emacs, so that there is no need to jump in and +out of the browser. + +@kindex C-c C-d +@findex br-delete +@cindex class, deleting from Environment +@cindex Environment, deleting classes +A class is deleted from the Environment, by pointing to its name in a +class listing buffer and then executing the delete class command. +The class matching command may be used to locate it. The browser +confirms the deletion by removing the class name from the listing +buffer. + + +@node Further Work, Conclusion, Design Specifics, Top +@chapter Suggestions of Further Work + +@section Expand Query Types + +The browser really only works with inheritance and method relations +right now. There is an undeniable need for the addition of supplier, +client, and category-based browsing. + +Suppliers are classes which contain methods invoked by other classes, +the clients. Computation of these recursive relations is expensive. A +technique must be developed which preserves the quickness of Environment +construction and supports queries using these relations. + +Method breakdowns by visibility (public, private, protected) would also +be useful to add. This should not require too much work. + +Category-based browsing should be the next major addition. Some other +people have already done work on adding facet-based categories to the +browser. Facets are traits that classes have. Classes sharing facets +are grouped into a facet category. Facet examples might be: fixed sized +container classes, domain-specific classes, or classes that contain a +name field. + +@menu +* Dynamic Object Browsing:: +* Tool Integration:: +* Graphical Interface:: +* Version Control:: +@end menu + +@node Dynamic Object Browsing, Tool Integration, Further Work, Further Work +@section Support Dynamic Object Browsing + +The OO-Browser works with static structures. It therefore utilizes +class groupings but has no concept of run-time objects. The techniques +and query relations desired in an object browser are very different from +that of a class browser. Therefore, a separate tool should be built. +It could, however, utilize the OO-Browser user interfaces. It would +then act as a back-end engine communicating with the class browser +interface. This raises the inter-application communication issue of the +next section. + + +@node Tool Integration, Graphical Interface, Dynamic Object Browsing, Further Work +@section Provide Mechanism for Integration with Other Tools + +Emacs supports subprocess control. This is how the textual interface +communicates with the graphical interface. They use a simple +redirection of standard input and standard output. + +A much more desirable and flexible strategy is to use a communications +medium like sockets to allow peer-to-peer communication. On top of this +low-level mechanism, a method like Field's Selective Broadcasting +[@cite{Reiss 88}] or ET++'s Multiple Views [@cite{Weinand 89}] might be used. + +@node Graphical Interface, Version Control, Tool Integration, Further Work +@section Extend Graphical Interface + +A lot could be done here, none of it particularly difficult. As +mentioned before, a full suite of browser commands should be added. +A technique that allows dynamic menu entry additions would provide the +requisite flexibility. This could probably be achieved with a basic +resource file format and a small amount of application code to cache the +entries. + +@node Version Control, , Graphical Interface, Further Work +@section Support Version Control Systems + +RCS is the likely candidate system. One would want to be able to +browse particular releases and to avoid mixing code from one release +with that of another when building Environments. + + + +@node Conclusion, , Further Work, Top +@unnumbered Conclusion + +The OO-Browser is a robust tool for class or generalized hierarchy +browsing. New subsystems are easy to integrate, so we expect the +available types of queries and means of user interaction to continue +to expand. + +The browser demonstrates useful user interface techniques. It supports +multiple interaction modalities: keyboard and mouse inputs, graphical +and textual views, menu and direct selection techniques. This allows +the user to choose a style with which he is comfortable. The ease of +entry and exit from the browser coupled with its access speed, +encourages a developer to use it often. It integrates well with the +incremental development cycles often found in object-oriented projects. +It further supports the developer with external interfaces for compiler +error parsing and type name completion. + +The browser implementation vividly illustrates that a single, portable +tool and interface can be used for a variety of languages. Departmental +language needs often change. So the ability to continue to use the same +tool with a different language lessens developer slow down and actually +provides an immediate comfort zone, so that the change need not be +overwhelming. Another good example of interface reuse is the ET++ +application development framework [@cite{Weinand 89}]. It provides a +means of building highly interactive, window system independent +applications that all share common interface constructs. One would hope +that more developers of programmer support tools will start taking an +approach of this kind. + +@sp 2 +[@cite{Goldberg 83}] Goldberg, Adele and David Robson. +@emph{Smalltalk-80: The Language and its Implementation}. +Addison-Wesley, 1983. + + +[@cite{Reiss 88}] Reiss, Steven P. "Integration Mechanisms in the FIELD +Environment," Brown University Technical Report CS-88-18, October 1988. + + +[@cite{Stallman 87}] Stallman, Richard. @emph{GNU Emacs Manual}. Free +Software Foundation, Cambridge: MA, March 1987. + + +[@cite{Weinand 89}] Weinand, Andre, Erich Gamma, and Rudolf Marty. +Design and Implementation of ET++, a Seamless Object-Oriented +Application Framework, @i{Structured Programming}, Springer-Verlag: NY, +NY, Vol. 10, No. 2, 1989. + + +@contents +@bye +