Black-box frameworks support extensibility by defining interfaces for
components that can be plugged into the framework via object composition.
Existing functionality is reused by defining components that conform to a
particular interface and integrating these components into the framework.
Grey-box frameworks avoid the disadvantages of both white-box and
black-box frameworks since they have enough flexibility and extensibility,
and hide unnecessary information from the application developer.
Any application framework follows an evolution in time, which is called
the framework life span (Brugali, Menga and Aarsten 1997). In this life span,
the basic architectural elements, which are independent from any specific
application, are implemented first. Then, by generalizing from concrete
applications, as stated in Roberts and Johnson (1997), the framework
evolves. This evolution means that in its early stages, the framework is
mainly conceived as a white-box framework (Johnson and Foot 1988).
However, through its adoption in an increasing number of applications, the
framework matures: more concrete components which provide black-box
solutions for the difficult problems, as well as high-level objects which
represent the major abstractions found in the problem domain, become
available within the framework.
The components of a framework offer different levels of abstraction from
the design needs found in the application domain. They are classified as
elemental, basic design and domain-dependent components (Brugali, Menga
and Aarsten 1999). The classification also reflects the different stages of the
framework life span in which they are introduced.
Elemental components, such as mechanisms for logical communication
and concurrency, determine the language (elements of the architecture)
in which the whole application will be written.
Basic components are intermediary classes, which are fairly application
independent, although they have been conceived bearing in mind a
specific application domain.
The others are domain dependent and are usually specializations of the
basic components. They are the result of the adoption of the framework
for the development of more and more applications and in some cases
they become pluggable black boxes.
The fourth part of this topic is organized into four case studies that present
object frameworks characterized by different scope and customization tech-
niques (see Table 17.1).
Chapter 18 (Recoverable applications) addresses the development of a
simple framework that enables the automatic recovery of an application
after a crash and the undo
redo operations of relevant state transitions. The
framework is an example of service component that sits between the generic