Designing Object-Oriented Frameworks Garry Froehlich, H. James Hoover, Ling Liu, Paul Sorenson Department of Computing Science University of Alberta Edmonton, AB. T6G 2H1 fgarry,hoover,lingliu,sorensong@cs.ualberta.ca 1 Introduction Most software reuse has focused on code reuse, such as reusing parts of existing applications, reusing library functions or reusing pre-built components. With the recent interest in design patterns [Gamma et al., 1995] and object-oriented frameworks, the focus is shifting away from just reusing code to reusing existing designs as well. Design patterns provide a reusable piece of a design which solves a recurring design problem in software construction. An object-oriented framework, which is the focus of this chapter, is the reusable design and implementation of a system or subsystem [Beck and Johnson, 1994]. It is typically implemented as a set of abstract classes which dene the core functionality of the framework along with concrete classes for specic applications included for completeness. Users of the framework complete or extend the framework by adding custom application specic components or functions to produce and application. Designing a framework diers from designing a single application in at least two respects. First, the level of abstraction is dierent. Frameworks are meant to provide a generic solution for a set of similar or related problems or an entire domain, while applications provide a concrete solution for a particular problem. Second, frameworks are by their nature incomplete. Whereas an application design has all of the components it needs to execute and perform its task, a framework design will have places within it that need to be instantiated by adding concrete solutions to a specic application problem. A framework does not cover all of the functionality required by a particular domain, but instead abstracts the common functionality required by many applications, incorporating it into the common design, and leaving the variable functionality to be lled in by the framework user. Due to these dierences, framework design focuses on providing exible abstractions that cover the functionality required by applications within a domain and making the framework easy to use. These abstractions in turn provide ways in which application developers can customize the framework. Object1 oriented technology is a natural t for frameworks. Just as a subclass is a specialization of a parent class, an application can be thought of as a specialization of a more general framework. One of the ways to use a framework is to specialize the generic classes that are provided in the framework into application specic concrete classes. There is yet to be an established standard for designing and developing frameworks. The purpose of this chapter is not to propose a standard, but instead to identify some of the key issues and techniques that aect framework design. Hopefully, as framework development becomes more common and better understood, standard approaches will emerge. We assume that the reader is already familiar with object-oriented design, so we will focus on the factors that dier between regular application vs. framework development. Several properties, such as ease of use and exibility, have been identied in the frameworks literature as aiding the reuse of the framework. We discuss several techniques, such as the benets of using inheritance, composition, and the use of hooks which help a framework attain these properties. Some key terms are dened in section 2 and the benets of using frameworks are described in section 3. Sections 4, 5 and 6 forms the core of the chapter, describing the issues to consider when designing frameworks and methodologies for doing the actual design. Section 7 briey discusses framework deployment issues. Section 8 summarizes the chapter and lists some of the open issues in framework design. 2 Concepts and Properties of Frameworks Before discussing framework design, we dene some concepts and terms associated with frameworks, starting with the roles involved in framework technology and a more in depth look at the parts of a framework. 2.1 Users and Developers of Frameworks Three dierent roles can be associated with the development and use of frameworks: Framework Designers or framework developers, develop the original framework. Framework Users, sometimes called application developers or framework clients, use (reuse) the frame- work to develop applications. Framework Maintainers rene and redevelop the framework to t new requirements. The dierent roles are not necessarily lled by dierent people. Often the framework designer is also one of the framework users and framework maintainers. 2 2.2 Framework Concepts Several dierent parts can be identied within an application developed from a framework as shown graphically in Figure 1. Applications are developed from frameworks by lling in missing pieces and customizing the framework in the appropriate areas. Application development is discussed in the chapter on using object-oriented frameworks. Unused Library Classes Framework Library Framework Core Application Extensions Framework Application Figure 1: Application Developed from a Framework. The parts of a framework are: Framework Core: The core of the framework, generally consisting of abstract classes, that dene the generic structure and behavior of the framework, and forms the basis for the application developed from the framework. However, the framework core can also contain concrete classes that are meant to be used as is in all applications built from the framework. Framework Library: Extensions to the framework core consisting of concrete components that can be used with little or no modication by applications developed from the framework. Application Extensions: Application specic extensions made to the framework, also called an ensemble [Cotter and Potel, 1995]. Application: In terms of the framework, the application consists of the framework core, the used framework library extensions, and any application specic extensions needed. Unused Library classes: Typically, not all of the classes within a framework will be needed in an application that can be developed from the framework. 3 Framework Library Framework Core DrawingController SelectionTool Tool RectangleTool DrawingView Figure RectangleFigure CompositeFigure TextFigure Drawing Application Extensions OMTClassTool Key Aggregation Object Inheritance Class OMTClassFigure Figure 2: Simplied View of the HotDraw Framework. A simplied example of the HotDraw framework [Johnson, 1992] is shown in Figure 2. HotDraw is a framework for building graphical editors, such as class diagram editors, written in Smalltalk. The core of the HotDraw framework consists of classes that dene the interactions and interfaces of the key abstractions of the framework. Some of the key abstractions in HotDraw are Figures (along with CompositeFigures and Drawings) which represent items within a diagram such as lines and boxes, Tools which plug into the DrawingController to handle user actions such as moving Figures around on the screen or creating new Figures, and DrawingViews which handle the display for the application. Some of the pre-built components supplied with HotDraw in its framework library consist of SelectionTool for selecting and moving Figures and RectangleTool for creating RectangleFigures within a Drawing. These are tools that may be useful in any application, but do not necessarily need to be included in every application 4 built from the framework. Common Figures are also provides, such as RectangleFigure for representing rectangles and TextFigure for text labels. HotDraw applications often require new application specic Tools and Figures to be derived. As an example, two application specic classes are shown in Figure 2. The complete application allows Object Modeling Technique [Rumbaugh et al., 1988] class diagrams to be drawn and edited, but only two classes are shown here. OMTClassTool derives from the core Tool class and allows OMTClassFigures to be created and edited. 2.3 Hooks and Hot Spots Application extensions are connected to a framework through hooks. Hooks are the places in a framework that can be adapted or extended in some way to provide application specic functionality [Froehlich et al., 1997]. They are the means by which frameworks provide the exibility to build many dierent applications within a domain. For example, HotDraw has hooks for producing new types of Figures and Tools as well as more complex activities such as disabling the use of Tools to make a display-only application instead of an editor. Hot spots [Pree, 1995], also called hinges [Cline, 1996], are the general areas of variability within a framework where placing hooks is benecial. A hot spot may have many hooks within it. The area of Tools within HotDraw is a hot spot because dierent applications will use dierent tools. A Data Flow Diagram application will have tools for creating and manipulating the DFD that are standard for iconic interfaces, whereas a PERT chart application, because of its strict temporal ordering constraints, will likely have dierent creation and manipulation tools. There are a number of hooks within the Tool hot spot which dene the various ways in which new tools can be dened. In contrast, frozen spots [Pree, 1995] within the framework capture the commonalties across applications. They are fully implemented within the framework and typically have no hooks associated with them. In HotDraw, DrawingController is an example of a frozen class. The Tools used may vary, but the DrawingController remains a constant underlying mechanism for interation. 2.4 Framework Categorization Several dierent means of classifying frameworks have been proposed. Here we present three relatively orthogonal views of frameworks. A framework can be categorized by its scope, its primary mechanism for adaptation and the mechanism by which it is used. The scope denes the area the framework is applicable to, whether a single domain or across domains. The adaptation mechanism describes whether the framework relies primarily upon composition or inheritance for reuse. Finally, the means of usage describes how the 5 framework interacts with the application extensions; by either calling the application extensions, or having the extensions call the framework. 2.4.1 Scope The scope of the framework describes how broad an area the framework is applicable too. Adair [1995] denes three framework scopes. Application frameworks contain horizontal functionality that can be applied across domains. They incorporate expertise common to a wide variety of problems. These frameworks are usable in more than one domain. Graphical user interface frameworks are a typical example of an application framework and are included in most development packages. Domain frameworks contain vertical functionality for a particular domain. They capture expertise that is useful for a particular problem domain. Examples exist in the domains of operating systems [Campbell et al., 1993], manufacturing systems [Schmid, 1995], client-server communications [Brown et al., 1995] and nancial engineering [Eggenschwiler and Gamma, 1992]. Support frameworks provide basic system-level functionality upon which other frameworks or appli- cations can be built. A support framework might provide services for le access or basic drawing primitives. 2.4.2 Customization The means of customizing is another way in which frameworks can be categorized. Johnson and Foote [1988] dene two types of frameworks, white box and black box. While this is an important dichotomy, a framework will often have elements of both black box and white box frameworks rather than be clearly one or the other. White box frameworks, also called architecture driven frameworks [Adair, 1995] rely upon inheritance for extending or customizing the framework. New functionality is added by creating a subclass of a class that already exists within the framework. White box frameworks typically require a more in-depth knowledge to use. Black box frameworks, also called data-driven frameworks [Adair, 1995], use composition and existing components rather than inheritance for customization of the framework. Conguring a framework by selecting components tends to be much simpler than inheriting from existing classes and so black box frameworks tend to be easier to use. Johnson argues that frameworks tend to mature towards black box frameworks. 6 2.4.3 Interaction Andersen Consulting [Sparks et al., 1996] dierentiates frameworks based on how they interact with the application extensions, rather than their scope or how they are customized. Called frameworks correspond to code libraries (such as the Eiel libraries [Meyer, 1994] or Booch's libraries [Booch, 1994]). Applications use the framework by calling functions or methods within the library. Calling frameworks incorporate the control loop within the framework itself. Applications provide the customized methods or components which are called by the framework ("don't call us, we'll call you"). In this chapter we will be primarily focusing on calling frameworks, although much of the material applies to called frameworks as well. 2.5 Desirable Properties Frameworks are meant to be reused to develop applications, and so reusability is very important. Software reusability means that ideas and code are developed once, and then used to solve many software problems, thus enhancing productivity, reliability and quality. With frameworks, reusability applies not only to the code, but also the design. A good framework has several properties such as ease of use, extensibility, exibility, and completeness [Adair, 1995] which can help to make it more reusable. 2.5.1 Ease of Use Ease of use refers to an application developers ability to use the framework. The framework should be both easy to understand and facilitate the development of applications, and therefore ease of use is one of the most important properties a framework can have. Frameworks are meant to be reused, but even the most elegantly designed framework will not be used if it is hard to understand [Booch, 1994]. In order to improve the user's understanding of the framework, the interaction (both the interface and the paths of control) between the application extensions and the framework should be simple and consistent. That is, the hooks should be simple, small and easy to understand and use. Additionally, the framework should be well-documented with descriptions of the hooks, sample applications and examples that the application developer can use. 2.5.2 Extensibility If new components or properties can be added to a framework easily, then it is extensible. Even if a framework is easy to use, it must also be extensible to be truly useful. A simple parameterized linked list component may be completely closed and easy to use, but its reusability is enhanced if it can be easily extended to include new operations. 7 2.5.3 Flexibility Flexibility is the ability to use the framework in more than one context. In general, this applies to the domain coverage of the framework. Frameworks that can be used in multiple domains, such as graphical user interface frameworks, are especially exible. If a framework is applicable to a wide domain, or across domains, then it will be reused more often by more developers. However, exibility must be balanced with ease of use. In general, a framework with many abstract hooks will be exible, but will also be either dicult to understand, require too much work on the part of the application developer to use, or both. 2.5.4 Completeness Even though frameworks are incomplete, since they cannot cover all possible variations within a domain, relative completeness is a desirable property. Default implementations can be provided for the abstractions within the framework so they do not have to be re-implemented within every application, and application developers can run the framework to gain a better understanding of how it works. The framework library can provide the implementations of common operations, which the developer can choose, making the framework easier to use as well as more complete. 2.5.5 Consistency Consistency among interface conventions, or class structures is also desirable. Names should be used consistently within the framework. Ultimately, consistency should speed the developers understanding of the framework and help to reduce errors in its use. 3 Benets and Concerns of Building a Framework The design of any type of framework requires the consideration of many issues. The rst, and possibly the most important decision is whether or not a framework is needed. Although frameworks have benets such as design reuse, their are also drawbacks, such as the increased cost of building a good object-oriented framework as compared to a single application. Benets 1. Reuse. Quite simply, the main benet of frameworks is the ability to reuse not only the implementation of a system, but the design as well. The framework helps to reduce the cognitive distance [Krueger, 1992] between the problem to be solved and the solution embodied in a software system. Once a framework has been developed, the problem domain has already been analyzed and a design has been produced which can be reused to quickly develop new applications. 8 2. Maintenance. Since all applications developed from a framework have a common design and code base, maintenance of all the applications is made easier. 3. Quality. The framework not only provides a reusable design, a tested design proven to work and therefore forming a quality base for developing new applications. Concerns 1. High Cost. Building a framework is often signicantly more costly than developing a single application. A great deal of time is spent dening and rening the abstractions that form the core of the framework. 2. Shifting Domains. The domain in which the framework is to be built must be relatively stable and well-understood. If the domain changes, then, unless the framework can be easily modied to t the new domain, much of the eort put into development will be lost. 3. Evolution. Any changes to the framework will aect the applications developed with the framework. If the architecture or any interfaces change then upgrading applications to use the new framework may be costly. If the applications are not upgraded, then the advantage of having a common code base is lost. Typically, the best candidates for frameworks are applications that are developed repeatedly, with minor variations [Taligent, 1995]. Domains that change rapidly, or are new enough not to have a base of existing applications are generally not good candidates for frameworks. 4 Design Process Frameworks should be developed from 'scratch'. It is unlikely that an application can be transformed into a framework in a straightforward manner. Frameworks, just like most reusable software, have to be designed to be reusable from the very beginning. As Booch [1996] suggests, object-oriented development in general and framework development in particular requires an iterative or cyclic approach in which the framework is dened, tested and rened a number of times. Additionally, small teams or even individual developers are recommended for framework development so that each member of the development team has a good overall understanding of the framework. Standard software development methodologies are not sucient for developing object-oriented frameworks [Pree, 1995]. For example, traditional methods do not take into account the need to design the hooks of a framework which provide for the exibility and extensibility of the framework. They tend to focus on the functional requirements. Hooks are also requirements of a framework, but they are quasi-functional. They do not perform functions within the system, but instead allow the framework to be customized to support 9 a wide range of functionality. Hooks should be considered throughout the process of requirements analysis through to testing [Cline, 1996]. While there is no agreed upon standard for designing frameworks, some techniques have been proposed [Sparks et al., 1996] [Taligent, 1995] [Johnson, 1993] [Pree, 1995]. The proposed approaches are still immature and provide guidelines rather than a fully dened methodology. Each of the approaches can be characterized by several general steps: analysis, design and implementation, testing, renement. The steps are the traditional stages of software development, but each is tailored to the design of frameworks. Typically, the framework is not built during a single pass, but through multiple iterations of the steps. 4.1 Analysis As with any type of software development, the rst stage is the analysis of the problem domain. In the case of frameworks, this requires a domain expert. The expert identies the size of the domain that the framework covers, the abstractions that will be incorporated within the framework, and how variations between applications within the domain will be dealt with. One of the key decisions that needs to be made when building a framework is deciding on how large of a domain it will cover. Does the framework apply to a large domain, a narrow part of a domain, or even apply to several domains? There are benets and drawbacks to frameworks that cover a large domain or a large part of a domain versus small frameworks which cover a narrow part of a domain. A wide framework will be reusable in more situations, and thus be exible, but may be unwieldy and dicult to maintain. Building a widely applicable framework is a signicant undertaking, requiring a lot of resources. Narrow frameworks may be insucient for an application, and developers will have to add signicant amounts of additional functionality to produce an application. Narrow frameworks are also easily aected by changes in the domain. While a wider framework might be able to evolve, a narrow framework may no longer be applicable. On the other hand, narrow frameworks do tend to be smaller and less complex and therefore easier to maintain. They are also potentially easier to use in other contexts because they aren't all encompassing of a particular domain. Finally, using a large framework often requires using all of the functionality within it, regardless if it is needed or not. Having several smaller frameworks instead of one large one allows framework users to only take the functionality they need. In general, the benets of building small frameworks outweighs the drawbacks, and so small frameworks are typically recommended. After the domain of the framework has been determined, analyzing the domain of the framework helps to determine the primary or key abstractions that will form the core of the framework. For example, graphical drawing framework, such as HotDraw, will contain abstractions for representing the drawing, the gures the drawing contains, and the graphical tools used to manipulate the gures. 10 Examining existing applications within a the domain of the framework is a useful means of identifying the abstractions [Johnson, 1993]. In order to gain domain expertise, a framework designer may also want to build an application within the domain if the designer is not already an expert in the domain [Taligent, 1995]. Developing scenarios for the operation of the framework and reviewing them with potential users of the framework is another recommended analysis approach [Sparks et al., 1996]. Scenarios help to dene the requirements of the framework without committing developers prematurely to any design decisions. The scenarios can be abstracted into use cases [Jacobson, 1992] to help identify the primary abstractions and interaction patterns the framework needs to provide. The hot spots, the places of variation within the framework, also need to be identied. Again, examining existing applications will help identify which aspects change from application to application and which remain constant. 4.2 Design and Implementation The design determines the structures for the abstractions, frozen spots and hot spots. The design and implementation of the framework are often intertwined. Abstractions can be dicult to design properly the rst time and parts of a framework may have to be redesigned and reimplemented as the abstractions become better understood [Pree, 1995]. Parts of the framework may undergo redesign even while other parts are being implemented. In order to rene the abstractions, reviews of the design are recommended [Sparks et al., 1996]. Reviews examine not only the functionality the design provides, but also the hooks and means of client interaction provided by the framework. Specic techniques that aid in the design of frameworks will be discussed later in the chapter. However some general guidelines have been identied through experience by framework developers working on the Taligent frameworks and ET++. In order to develop easy to use and exible frameworks, Taligent [1995] suggests: reduce the number of classes and methods users have to override simplify the interaction between the framework and the application extensions isolate platform dependent code do as much as possible within the framework factor code so that users can override limiting assumptions 11 provide notication hooks so that users can react to important state changes within the framework Some additional general design advice proposed by Birrer and Eggenschwiler [1993] is to: consolidate similar functionality into a single abstraction, break down larger abstractions into smaller ones with greater exibility, implement each key variation of an abstraction as a class (and include it in the framework library), and use composition rather than inheritance. At this stage, the specic hooks for each hot spot must also be designed and specied. The hooks show specic ways in which the framework can be adapted to an application, and so are an important part of the framework. Hooks can be described in an informal manner or a semiformal manner using templates [Froehlich et al., 1997]. Often, trade-os must be considered when designing the hooks and structuring the hot spots in general. Frameworks cannot be arbitrarily exible in all directions (i.e.. they only bend in certain ways and bending them in other ways will break them). Some of the required exibility can be determined by examining existing applications. Often the framework designer has to rely on experience and intuition to make these trade-os. Subsequent testing may require changes in the structure of the hot spots. Further trade-os occur between exibility and ease of use. The most exible framework would have very little actually dened and so require a great deal of work on the part of the framework user. The framework should incorporate as much functionality as it can and all the interfaces should be clearly dened and understandable, sometimes at the expense of exibility. 4.3 Testing There are two types of testing that a framework can undergo. First, a framework should be tested in isolation; that is, without any application extensions. Testing the framework by itself helps to identify defects within the framework, and in so doing isolates framework defects from errors that might be caused by the application extensions, or in the interface between the framework and the application extensions. Andersen Consulting has followed an approach of requiring framework designers to produce a test plan that provides a minimum of 50% block coverage of the framework with a goal of 70% coverage [Sparks et al., 1996]. It is important to catch defects in a framework since any defects will be passed on to all applications developed from the framework. Defects in the framework force users to either x the defects themselves, or nd a work around, both of which reduce the benets of using the framework. 12 Second, the true test of a framework really only occurs when it is used to develop applications. Designers never truly know if a framework can be reused successfully until it actually has been. Using the framework serves as a means of testing the hooks of the framework, the points where interactions between application extensions and the framework occur. Using the framework also helps to expose areas where the framework is incomplete and helps to show areas where the framework needs to be more exible or easier to use. The applications produced from this kind of testing can be kept as examples of how to use the framework and are also valuable for regression testing when parts of the framework change. 4.4 Renement After testing, the abstractions of the framework will often need to be extended or rened. Building a framework is a highly iterative process, so many cycles through these steps will be performed before the nal framework is produced. A rule of thumb among framework developers is that three separate applications must be developed from a framework before it is ready for deployment and distribution. After the core has been successfully developed and implemented, the framework library can be further developed to make the framework more complete. 5 General Framework Development Techniques 5.1 Abstract and Concrete Classes A good framework often has a core of abstract classes which embody the basic architecture and interactions among the classes of the framework. Not all of the core classes need to be or should be abstract, but the ones involved in hot spots generally are. For example, HotDraw has classes for Figure and Tool which must be customized to use. Framework designers derive new classes from abstract classes by lling in the methods deliberately left unimplemented in the abstract classes or by adding functionality. The abstract classes should be exible and extensible. These classes capture the properties of key abstractions, but just as importantly, they capture the interactions between elements of the framework as well. The Figure class interacts with many classes to provide its functionality, such as Tool, Drawing and DrawingView, and this interaction is dened at the level of the Figure class. Any classes derived from it will follow that interaction. A framework will generally have a small number of these core classes [Gangopadhyay and Mitra, 1995], but will also have a number of concrete classes which form the framework library. These concrete classes inherit from the abstract classes but provide specic and complete functionality that may be reused directly without modication in an application developed from the framework. HotDraw provides a number of Figure classes within the library that can be easily reused. However, the library can also contain parameterized 13 object instances, such as the Tool instances provided with HotDraw. Library components may also be composed of a number of core classes rather than derived from one exclusively. Providing these concrete classes makes the framework both more complete and easier to use. If concrete classes are not needed in a particular application, then they can simply be excluded from the application. 5.2 Hot Spots and Frozen Spots As mentioned earlier, frameworks contain hot spots which are meant to encompass the variability between applications within the domain of the framework. Hot spots provide the exibility and extensibility of the framework and their design is critical to the success of the framework. Two questions to consider about a hot spot are: [Pree, 1995] what is the desired degree of exibility, remembering that exibility has to be balanced with ease of use? must the behavior be changeable at run-time, in which case composition is preferred over inheritance? Pree's hot spot approach [Pree, 1995] denes several metapatterns which aid in hot spot design. Each metapattern denes a set of relationships between template methods and hook methods within an abstract base class. Template methods dene the ow of control for the framework and either perform actions directly or defer functionality to hook methods. Hook methods are left unimplemented within the framework and are specialized by the application developer to t the needs of the application. Design patterns also help in structuring hot spots as described in a later section. DrawingController Tool Select Tool Hook New Tool Hook New Tool Type Hook Figure 3: Hooks for the Tools Hot spot. 14 Each hot spot will likely have several hooks associated with it. The hooks describe how specic changes can be made to the framework in order to fulll some requirement of the application [Froehlich, 1997]. Figure 3 shows the Tool hot spot and three hooks within it. There are three main ways in which a framework can be modied using hooks and each of these are illustrated in the three hooks depicted in Figure 3. Several pre-built components can be provided within the framework library which can be simply used as is in applications, such as the Select Tool Hook. If there are a limited number of options available, then the components provided may be all that is needed. Parameterized classes or patterns can be provided (such as the use of template and hook methods) which are lled in by framework users. The Tool class in HotDraw is an example of a parameterized class and the New Tool Hook describes how the parameters must be lled in. When it is dicult to anticipate how a hot spot will be used, or if a lot of exibility is needed, then new subclasses are often derived from existing framework classes and new functionality is added, corresponding to the New Tool Type Hook. 5.3 Composition and Inheritance Inheritance and composition are the two main ways for providing hooks into the framework. Composition is often recommended over inheritance as it tends to be easier for the framework user to use (data driven as opposed to architecture driven) but each has strengths and weaknesses. The type of customization used in each case depends upon the requirements of the framework. 5.3.1 Composition Composition typically involves the use of callbacks or parameterized types. The class of the framework to be adapted will have a parameter to be lled in by the application developer which provides some required functionality. Since the customization is done by lling in parameters, the framework user does not need an in-depth knowledge of how the particular component operates. In HotDraw, the Tool class is parameterized so that new Tools can be quickly and easily produced. The main parameter for customizing the Tool class is the command table shown here for the example OMTClassFigure tool. Reader Figure Command DragReader OMTClassFigure MoveCommand ClickReader OMTClassFigure ExpandCommand The OMTClassTool shown here has two entries in its command table which determines what actions it takes depending upon the context in which the tool was used. The Reader determines the type of use, such 15 as DragReader or ClickReader. The Figure is the type of Figure selected by the tool and the Command is the action to take on the Figure using the Reader. So, if the OMTClassTool is dragged on the OMTClassFigure then it will invoke the MoveCommand which moves the Figure. Tools can be easily produced by combining dierent Commands, Readers and Figures. The separation of Readers and the Commands from the Tool class also makes the individual Readers and Commands more reusable. Many Tools will have actions for dragging and clicking the mouse and they can all use the same Reader classes. Composition also allows the component used to be changed dynamically. The DrawingController class in HotDraw uses composition for this purpose. The class has a slot for the Tool that is currently being used, but there are many dierent Tools in a typical HotDraw application and the user changes Tools frequently. The tool that is currently in the DrawingController class may have to be changed at run-time, so Tool was made into a separate class with each tool having the same interface so that it can be made the current tool whenever the user selects it. When composition is combined with a large number of existing concrete classes within the framework library, adapting the framework becomes a simple matter of choosing the right components and connecting them together. Composition tends to be the easier of the two types of adaptation to use. A developer should understand the interface to the component, the functionality the component provides and little else about the inner workings of the framework. More generally, the developer simply needs to understand which existing concrete component performs the desired function. 5.3.2 Inheritance Inheritance involves specializing methods from an abstract class, or adding functionality to an abstract class. Inheriting from a class requires a considerable understanding of the abstract class and its interactions with other classes, thus it can be more error prone and more dicult to use than composition. The advantage of inheritance is extensibility. An application developer can easily add completely new functionality to a subclass of an existing class, which is not as easily accommodated with composition. New Figures in HotDraw are derived by inheritance. New Figures often require added functionality or instance variables that cannot be anticipated by the framework developers and inheritance provides the means by which the new methods and variables can be added. For example, the OMTClassFigure in Figure 4 is derived from CompositeFigure and adds two new methods, addvar and addmethod. These methods are used to add new variable and method text labels to the class box. It also contains TextPopupFigures derived from TextFigures for the text labels. The TextPopUpFigures contain an additional attribute desc which holds a description or code fragment and a method popupdesc for displaying the description. Since none of this functionality was contained in HotDraw before, and it is impossible to anticipate the full range of additional functionality that might be needed in a Figure, it must be added by inheritance. 16 Figure TextFigure TextPopupFigure CompositeFigure OMTClassFigure popupdesc() addvar() addmethod() desc Figure 4: Inheritance Diagram for OMTClassFigure. Often the abstract class will provide default methods that need to be overridden in a child class. Hook methods are an example of this. The method is called by another template method, but the specic functionality is class specic and can't be pre-determined. HotDraw provides a step method for Drawings that is used for animation, but is left empty by default since no one method can account for the complete variety of possible ways to animate a Drawing. 5.3.3 Composition vs. Inheritance Composition is generally used when interfaces and uses of the framework are fairly well dened, whereas inheritance provides exibility in cases where the full range of functionality cannot be anticipated. Composition forces conformance to a specic interface and functionality which cannot be easily added to or changed. All Tools use Readers to determine the location of the mouse pointer and what action is being taken, and invoke Commands to perform actions on Figures. In practice this works fairly well and covers the range of actions needed to be performed by Tools. When something outside of this paradigm is required, however, the Tool class itself must be subclassed to provide the extra functionality. It has been proposed that frameworks start out as white box frameworks that rely upon inheritance. As the domain becomes better understood and more concrete support classes are developed, the framework evolves to use more composition and becomes a black box framework [Johnson and Foote, 1988]. The step method for animating Drawings was mentioned above. While it is currently blank, and must be overridden 17 through inheritance, it may be possible to provide a number of standard ways to animate Drawings. Instead of providing a new Drawing class for each standard type of animation, it would be better to move the animation routines into its own class using the Strategy design pattern [Gamma et al., 1996] which can be linked into the Drawing class as needed. Beyond components that developers have to connect, a framework might gain the ability to decide how to connect components itself. This could possibly be done dynamically or by using a development tool, freeing the developer to simply choose the components needed without doing any programming. 5.4 Framework Families Much in the same way that an individual class is a specialization of a more abstract class, one framework may be a specialization of a more abstract framework. There are two reasons why such a family of frameworks might be built. First, a specialized framework can provide more support for special cases within the domain. Abstract frameworks provide the basic services and interactions, while the specialized frameworks extend that to provide more specialized support. The abstract framework provides exibility while the specialized frameworks provide more completeness and ease of use. Second, framework families are a means of dealing with complexity. Instead of including all possible options within a single, complex framework, related options can be bundled into specialized frameworks. An alternate approach for producing framework families is to develop an initial problem solution and then to generalize it [Koskimies et al., 1995]. For example, a framework that is developed to solve a graphing problem might be generalized into a more abstract framework. The generalized framework is then abstracted again into a more abstract problem. This process continues until the most general problem solution is found. The generalization approach quite naturally produces a framework family with the most abstract and exible framework at the top of the 'family tree' and the more specic framework at the bottom. Unfortunately, it is not always clear what a more general solution to the problem would be, or what the most general solution is. 6 Specic Development Techniques 6.1 Domain Analysis Domain analysis techniques, such as FODA [Kang et al., 1990], focus on nding the requirements for an entire domain rather than just for a single application. Domain analysis [Arago, 1991] identies the concepts and connections between concepts within a domain without determining specic designs. The analysis can 18 help to identify the variant and invariant parts of the domain, and the primary abstractions needed for a framework. In the Feature Oriented Domain Analysis technique, the generic parts of the domain are abstracted from existing applications by removing all of the factors that make each application within the domain dierent. The abstraction is done to the point where the product produced from the domain analysis covers all of the applications. Dierences are factored out by generalizing existing parts of applications, or aggregating the variant aspects into more generic constructs. The resulting concepts are then the primary invariants of the framework. Variations within the domain are captured in FODA by rening the common abstractions through specialization and decomposition. Parameters are dened for each renement which capture the variant aspects. The renements and parameters can then form the basis for the hooks of the framework. 6.2 Software Architecture All software systems, including frameworks, must have a solid foundation at the level of software architecture [Perry et al., 1992]. Software architecture studies the higher level issues involved in software design, such as the organization of the system, physical distribution of subsystems, performance and composition of design elements [Shaw and Garlan, 1996]. Architecture consists of components, the pieces of software such as UNIX lters or object-oriented classes, and the connectors that allow them to communicate with each other, such as UNIX pipes, or object-oriented methods. 6.2.1 Architectural Styles An architectural style [Shaw and Garlan, 1996] denes the types of components and connectors that can exist within a particular style, and the rules of how they can be composed. These rules can aid in application development from a framework by helping to describe the types of applications that can or cannot be built, and general rules for their structure. For example, HotDraw uses the object-oriented architectural style. The components within HotDraw are classes and the connectors are the messages that are passed between classes. Object-oriented architectures allow exible structures in which objects can collaborate with other objects in arbitrary ways to provide functionality, but each object must know about the objects it collaborates with beforehand, unlike lters in the pipe and lter architecture. However, HotDraw is a framework for graphical drawing applications rather than a command line lter and is well-suited to the object-oriented style. 6.2.2 Domain Specic Software Architectures Domain Specic Software Architectures [Tracz, 1994] are closely related to object-oriented frameworks. By focusing on a specic domain, a DSSA can provide more specialized components and connectors than 19 architectural styles and even provide components that can be used within applications just as is done with frameworks. A DSSA consists of three things: a software architecture with reference requirements and domain model infrastructure to support it process to instantiate/rene it The reference requirements dene the requirements that an application has within the domain. The domain model is a lexicon of terms within the domain, such as objects, relationships or even actions that occur within the domain. The infrastructure can refer to tool support provided to build an application within the domain, as well as pre-built components than can be used within applications. A DSSA can be provided as a framework (which satises the architecture and some of the infrastructure requirements), but can also include such things as fourth generation languages or application generators. However, the requirements for a DSSA apply equally well to object-oriented frameworks, and suggest that frameworks should be part of a larger package that includes requirements, tool support and a process for using the framework. 6.3 Design Patterns A design pattern captures some of the expertise of object-oriented software developers by describing the solution to a common design problem that has worked in the past in several dierent applications. The description of the solution will detail the benets and drawbacks of the pattern and perhaps name alternatives. Design patterns have been associated with object-oriented frameworks from their inception even though they are not limited to use in frameworks. They are appropriate for designing parts of frameworks and particularly designing hot spots within frameworks because many design patterns enhance exibility or extensibility. DrawingController Drawing DrawingView Figure 5: The MVC Pattern in HotDraw. 20 Model-View-Controller Context: Interactive applications with a exible human-computer interface. Problem: User interfaces are especially prone to change requests, and when the functionality of an application changes, the user interface must change to reect that. Additionally, dierent users require dierent interfaces, such as keyboard vs. menu and button. If the user interface is tightly tied to the functionality of the application, then it becomes dicult to change and maintain. The following forces inuence the solution: Dierent windows display the same information and each must reect changes to the information. Changes to the user interfaces should be easy, including supporting dierent look and feel standards. Solution: Divide the application into three areas: processing, output, and input. The three components that incorporate these areas are called the model, the view and the controller. Model: encapsulates the data and functionality of the application. View: displays the data within the model. Multiple views can be attached to a single model to display the data in dierent ways, or to display dierent parts of the data. Controller: receives input from the user and invokes methods within the model to fulll user requests. Each view can have its own controller and controllers can be changed to provide dierent means of input. Figure 6: The Model-View-Controller Architectural Pattern Three levels of design patterns have been identied [Buschmann et al., 1996]. Architectural patterns describe a general high level architecture that can form the basis of a framework or application, and are closely related to architectural styles. However, many patterns use a particular style and are not styles themselves. The patterns identify specic components and connectors that are used in the architecture. For example, the HotDraw framework uses the object-oriented architectural style, and the Model-View-Controller architectural pattern [Buschmann et al., 1996] described briey in Figure 6. As shown in Figure 5 the Drawing forms the basis of the model, DrawingView corresponds to view and DrawingController corresponds to the controller. Using the pattern gives the framework exibility by separating the display (DrawingView) from the user input mechanisms (DrawingController) and the internal representation of the drawing (Drawing). New views or types of views can be easily added, new user input mechanisms can be implemented or even removed so the application becomes a simple display. At the next level down, the patterns are specically called design patterns. These patterns don't form the basis for an entire framework, but help to structure specic parts of a framework. They are especially 21 Figure TextFigure RectangleFigure CompositeFigure Drawing Figure 7: The Composite Pattern in HotDraw. useful in adding exibility to hot spots in the framework. The Composite Pattern [Gamma et al., 1996] is used in HotDraw as shown in Figure 7 to help structure the Figures hot spot. Basically, CompositeFigure is made a subclass of Figure with the same interface as Figure, but also may contain any number of Figures. Drawing is a specic type of CompositeFigure. CompositeFigures will respond to the same methods that are invoked on Figures, so that they can be treated interchangeably with ordinary Figures. This allows exible and arbitrary collections of new Figures and nested CompositeFigures developed for an application rather than forcing a at model in which Drawings can only contain simple Figures. LineFigure OMTClassFigure OMTClassFigure Figure 8: The Observer Pattern in HotDraw. HotDraw also incorporates the Observer Pattern [Gammaet al., 1996] to provide a means in which Figures can be linked to each other, also within the Figures hot spot. Figure 8 shows a sample HotDraw application in which two OMTClassFigures are connected by a LineFigure. When one of the OMTClassFigures is removed, the LineFigure should be removed as well by the application. In order to provide this feature, the Observer Pattern is used. LineFigure is made a dependent of each OMTClassFigure it is connected to and when one OMTClassFigure is deleted, the framework automatically sends the class the appropriate deletion message. 22 The OMTClassFigure then noties each of its dependents so that they can take the appropriate action, deleting itself in this case. Notications can also be sent to dependents whenever a given Figure changes, giving application developers an easy to use mechanism through which one Figure can reect changes in another. The lowest level patterns are called idioms. Idioms tend to be implementation language specic and focus on specic low level issues. For example, an idiom might describe how exception handling can be provided in a specic language. 6.4 Open Implementation Open implementation [Maeda et al., 1997] is another technique for supporting exibility. Software modules with open implementation can adapt their internal implementations to suit the needs of dierent clients. The modules themselves support several dierent implementation strategies and provide a strategy control interface to allow client modules to help choose or tune the implementation strategy that best suits the client. For example, a le system might support several dierent caching strategies and allow the caching strategy to be tuned based on the usage prole of the application. The application provides this information to the module with open implementation, perhaps indicating that it will perform a sequential scan of a le, or random access. Typically, the strategy selection information is provided during the initialization of the module. This notion can be applied in particular to the framework library. Allowing clients to help select the implementation strategy can help applications to tune a library class or module for eciency, and make it more suitable for a wider variety of applications. Four styles of open implementation interfaces have been identied [Kiczales et al., 1997] Style A: No control interface is provided which is the same as providing a black box component or module. The client has no means of tuning the implementation so this approach is best used when only one implementation of a component is appropriate. Style B: The client provides information about how it will use the component, typically through setting parameter values when initializing the component. The component itself is responsible for choosing the best implementation strategy based on the information provided. The approach is easy for clients to use, but does not give them much control over the component. Style C: The client specically species the implementation strategy to use from a set of strategies. The component has no control over the selection, and this approach is the same as providing several interchangeable components. It is best used when the component cannot select the appropriate strategy through declarative information, as in style B. 23 Style D: The client actually provides the implementation to use. The component simply provides the interface, but no implementation. In frameworks, abstract classes are used in a similar way, dening the interface, but leaving the implementation of methods to the application developer. It is best used when the set of possible implementations cannot be predetermined. 6.5 Contracts One of the diculties in any type of framework is ensuring that the framework receives or produces the correct information. Integrating classes is an issue in any application development, and using a framework is in part an integration issue. Therefore, it is critical that the interfaces to the framework, both the methods of the framework that are called by an application and the methods of an application that the framework calls, be clearly dened. 6.5.1 Simple Contracts Simple contracts as proposed by Meyer [1988] are a means of specifying the preconditions required by a method or operation and the postconditions that a method ensures. Specifying and enforcing conditions can help to cut down on the level of defensive programming needed within a framework, or any piece of reusable software. For example, a reusable component within the framework library does not have to handle every possible exception or error condition in the input if the preconditions for the component's methods are clearly identied and enforced. As Meyer argues, clearly specifying the conditions helps application developers since they do not have to guess what the framework does, and can handle errors that might best be handled by the application. Forcing the framework to handle every possible exception can reduce performance and make the framework less attractive for use. Further, some means of enforcing the contracts may help reduce the number of errors application developers make when using the framework. In Eiel, contracts are built into the language. In other languages, Hollingsworth [1992] proposes that separate classes be built to represent contracts. These classes will ensure that the preconditions and postconditions are met for the framework to operate correctly. These contract classes could be included with the release of a framework and used during the development of an application and removed to improve eciency when the application is released. 6.5.2 Behavioral Contracts More complex behavioral specications have been proposed. [Helm et al., 1992] Also called contracts, they cover not only the interactions between two classes, or the conditions placed on one method, but on the total interaction between multiple classes, often involving multiple methods to perform some task. The 24 contract ExecuteTool Tool supports[ s: Sensor execute() 7! Reader ! initialize(s,Command); Reader ! manipulate(s); Reader ! Eect ] Reader supports[ c : Command initialize(sensor,c) 7! c fcommand = cg; c ! initialize(sensor.mousepoint) manipulate(sensor) 7! c ! execute(sensor.mousepoint) eect 7! c ! eect ] Command supports[ initialize(loc) execute(loc) eect ] end contract Figure 9: The ExecuteTool Behavioral Contract specication is exible in that one contract can specialize another, and contracts can be composed of other contracts. When actually using the contract, a conformance declaration is produced which states how the classes involved fulll the contract. Specifying behavioral contracts within a framework helps to capture design information that might be needed by application developers. Figure 9 shows the ExecuteTool contract used in HotDraw which details how Readers, Commands and Tools interact in order to perform the task. When the Tool executes, it rst initializes the Reader with the mouse sensor and the Command to be executed. Afterwards, it sends the manipulate command to the Reader which in turn actually executes the command on the Figure found at the current location of the mouse. When the user is nished using the tool (i.e. lets go of the mouse button during a drag operation) the Tool sends the eect message to the Reader which performs any clean up operations needed, including sending the eect message to the Command. When application developers add a new Reader, Command or Tool class to an application developed from HotDraw, they need to conform to this contract. The contract makes the information explicit and so the application developer does not need to synthesize this information from the source code, which may not even be possible if the source code of the framework is not available. 25 7 Framework Deployment Once an object-oriented framework has been implemented, rened and tested to the point where it is stable, it is ready to be deployed by application developers. There are a number of questions to be considered when deploying a framework. First, what sort of aids for learning the framework are provided? Andersen Consulting has used three dierent approaches [Sparks et al., 1996]. Roll out sessions: sessions are held after a framework has reached a certain phase in its development in order to introduce users to the current set of features. This approach has the advantage of gradually introducing the users to the framework as it is developed. Example Applications: examples help to show specic ways in which the framework can be used. Examples can also potentially be modied and used in a new application being developed. Reference Documentation: documentation that describes the purpose of the framework, how to use it and how it is designed can and should be provided. Documentation techniques will be covered in the next chapter on using object-oriented frameworks. Additionally, a framework developer might be involved with application development as well. When the framework designer is also involved in using the framework, application developers can use the designer's expertise with the framework. The framework designer may also gain insights into how the framework can be modied or improved. Second, will the framework be distributed as source code or a binary executable? Binary executables do not allow developers to modify the framework but instead require them to rely on the interfaces provided. This may make future upgrades of the framework easier to incorporate into existing applications if the interfaces don't change, and will protect the framework code against tampering. However, developers cannot x any errors they encounter in the framework and are forced to devise workarounds. Additionally, developers cannot examine the binary implementation to help to understand the framework as they can with source code. Third, how will changes to the framework be handled? When bugs are xed or new features are added to the framework, how will existing applications be aected? Ideally, only the internal implementations of framework components will change, leaving interfaces and hooks the same, but this is not always possible. This issue will be examined more fully in the chapter on using object-oriented frameworks. 26 8 Summary and Open Issues Object-oriented frameworks provide the means for reusing both the design and implementation of a system or subsystem. As such, they provide tremendous leverage for the application developer. The design of similar applications do not have to be repeatedly constructed out of existing or new code components, but instead an existing design can be customized quickly to provide the desired functionality. Due to the common design base, several applications developed from the same framework can also be maintained more easily. However, frameworks are more dicult to design and develop than single applications. Frameworks must be general enough to capture the commonalties of all the applications that might be built within the domain of the framework and they must also be exible enough to allow for the variations that exist between those applications. All of this generality and exibility has to be made easy to use for application developers if the framework is to be a success. There are no mature framework development methodologies. There are, however, guidelines and promising techniques for aiding in the development of frameworks and several of these have been presented. Domain analysis can be used to identify the commonalties and variations (frozen and hot spots) in the domain. Inheritance and composition can be used to provide dierent sorts of ease of use and exibility. Design patterns and open implementation techniques help to structure the framework and to provide the right types of exibility. Providing such a methodology is one of the key open issues in the area of object-oriented frameworks. A framework development process needs to focus on the identication of hot spots and frozen spots. How are the right abstractions for the framework determined and how should they be structured? It also needs to focus on building exibility and ease of use into the framework, which in essence is designing the hot spots of a framework. Some techniques are available for developing exibility in a framework, but there is very little help for deciding on which tradeos to make. Which part of the framework should be made more exible and how will it aect the other parts? Does exibility need to be sacriced for more ease of use? While there are guidelines for making frameworks easier to reuse, there is no criteria quantifying just how easy they should be to reuse. Object-oriented frameworks are a key means of moving software development away from the traditional means such as continuously redeveloping commonly used code or trying to reuse and t together unrelated and often mismatched components. Frameworks provide the components and the context, together with an overall structure and design to ensure component compatibility and provide a powerful form of software system reuse. 27 References [1] Adair, D. 1995. Building Object-Oriented Frameworks. AIXpert. Feb. 1995. [2] G. Arango, G. and R. Prieto-Diaz, R. 1991. Domain Analysis Concepts and Research Directions, IEEE Computer Society. [3] Beck, K. and Johnson, R. 1994. Patterns Generate Architectures. Proceedings of ECOOP 94. 139-149. [4] Birrer, A. and Eggenschwiler, T. 1995. Frameworks in the Financial Engineering Domain: An Experience Report. Proceedings of ECOOP 93. 21-35. [5] Booch, G. 1994. Designing an Application Framework. Dr. Dobb's Journal. 19(2):24-32. [6] Brown, K., Kues, L. and Lam, M. 1995. HM3270: An Evolving Framework for Client-Server Communications. Proceedings of the 14th Annual TOOLS Conference. 463-472. [7] Buschmann, F., Meunier, R., Rohnert, H., Sommerlad, P. and Stal, M. 1996. Pattern-Oriented Software Architecture: A System of Patterns. John Wiley & Sons Ltd, Chicester England. [8] Campbell, R.H., Islam, N., Raila, D., and Madany, P. Designing and Implementing Choices: An ObjectOriented System in C++. Communications of the ACM. 36(9):117-126. [9] Cline, M.P. 1996. Pros and Cons of Adapting and Applying Patterns in the Real World. Communications of the ACM. 39(10):47-49. [10] Cotter, S. and Potel, M. 1995. Inside Taligent Technology, Addison-Wesley Publishing Company, Reading, MA. [11] Eggenschwiler, T. and Gamma, E. 1992. ET++ SwapsManager: Using Object Technology in the Financial Engineering Domain. Proceedings of OOPSLA 92. 166-177. [12] Froehlich, G., Hoover, H.J., Liu, L. and Sorenson, P. 1997. Hooking into Object-Oriented Application Frameworks. Proceedings of the 1997 International Conference on Software Engineering. [13] Gamma, E., Helm, R., Johnson, R. and Vlissides, J. 1995. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, Reading, MA. [14] Gangopadhyay, D. and Mitra, S. 1995. Understanding Frameworks by Exploration of Exemplars. In Proceedings of 7th International Workshop on Computer Aided Software Engineering (CASE-95). 9099. 28 [15] Helm, R., Holland, I.M. and Gangopadhyay, D. 1992. Contracts: Specifying Behavioral Compositions in Object-Oriented Systems. Proceedings of ECOOP/OOPSLA 90. 169-180. [16] Hollingsworth, J. 1992. Software Component Design-for-Reuse: A Language Independent Discipline Applied to Ada, Ph.D. thesis, Dept. of Computer and Information Science, The Ohio State University, Columbus, Ohio. [17] Jacobson, I., Christerson, M., Jonsson, P. and Overgaard, G. 1992. Object-Oriented Software Engineering{A Use Case Driven Approach. Addison-Wesley, Wokingham, England. [18] Johnson, R. 1992. Documenting Frameworks Using Patterns. Proceedings of OOPSLA 92. 63-76. [19] Johnson, R. 1993. How to Design Frameworks. Tutorial notes from OOPSLA 1993. [20] Johnson, R. and Foote, B. 1988. Designing Reusable Classes. Journal of Object-Oriented Programming. 2(1):22-35. [21] Kang, K., Cohen, S., Hess, J., Novak, W. and Peterson, A. 1990. Feature-Oriented Domain Analysis (FODA) Feasibility Study. (CMU/SEI-90-TR-21, ADA 235785). Pittsburgh, Pa.: Software Engineering Institute, Carnegie Mellon University, Pittsburgh, Pa.. [22] Kiczales, G., Lamping, J., Lopes, C.V., Maeda, C., Mendhekar, A., and Murphy, G. 1997. Open Implementation Design Guidelines. Proceedings of the 19th International Conference on Software Engineering. Boston, Mass. 481-490. [23] Koskimies, K. and Mossenback, H. 1995. Designing a Framework by Stepwise Generalization. Proceedings of the 5th European Software Engineering Conference. Lecture Notes in Computer Science 989. SpringerVerlag. 479-497. [24] Krueger, C.W. 1992. Software Reuse. ACM Computing Surveys. vol. 24(6): 131-183. [25] Maeda, C., Lee, A., Murphy, G., and Kiczales, G. 1997. Open Implementation Analysis and Design. Proceedings of the 1997 Symposium on Software Reusability in ACM Software Engineering Notes 22(3):4453. [26] Meyer, B. 1988. Object-Oriented Software Construction. Prentice Hall, Englewood Clis, NJ. [27] Meyer, B. 1994. Reusable Software The Base Object-Oriented Component Libraries. Prentice Hall, Englewood Clis, NJ. [28] O'Connor, J., Mansour, C., Turner-Harris, J. and Campbell, G. 1994. Reuse in Command-and-Control Systems. IEEE Software 11(5):70-79. 29 [29] Perry, D.E. and Wolf, A.L. 1992. Foundations for the Study of Software Architecture. ACM SIGSOFT Software Engineering Notes. 17(4):40-52. [30] Pree, W. 1995. Design Patterns for Object-Oriented Software Development. Addison-Wesley Publishing Company, Reading, MA. [31] Rumbaugh, J., Blaha, M., Premerlani, W., Frederick, E. and Lorenson, W. 1991. Object-Oriented Modeling and Design, Prentice Hall, Englewood Clis, NJ. [32] Schmid, H.A. 1995. Creating the Architecture of a Manufacturing Framework by Design Patterns. Proceedings of OOPSLA 95. 370-384. [33] Shaw, M. and Garlan, D. 1996. Software Architecture - Perspectives on an Emerging Discipline, Prentice Hall, Englewood Clis, NJ. [34] Sparks, S., Benner, K. and Faris, C. 1996. Managing Object-Oriented Framework Reuse. IEEE Computer. 29(9): 52-62. [35] Taligent. 1995. The Power of Frameworks. Addison-Wesley Publishing Company, Reading, MA. [36] Tracz, W. 1994. Domain-Specic Software Architecture (DSSA) Frequently Asked Questions (FAQ). ACM Software Engineering Notes. 19(2):52-56. [37] Vlissides, M. and Linton, M.A. 1990. Unidraw: A Framework for Building Domain-Specic Graphical Editors. ACM Transactions on Information Systems. 8(3):237-268. 30