Principles of object oriented modeling
The philosophy of design underlying object oriented software
development centers around abstraction and information hiding.
Objects, encapsulating state and behavior, support these notions.
Moreover, objects provide a natural means to model a problem since the objects in a system
may bear a close correspondence to the entities encountered in reality.
As phrased in [Booch86], each module in the system denotes an object or a class of objects
from the problem space.
As a design method, the approaches treated in [Booch91] and [WWW90]
have in common an emphasis on the identification
of the objects that play a role in the system and on delineating
the functionality of these objects,
that is to assess what services are provided and how the objects
interact in order to provide these services.\id{
As an heuristic guideline for finding the proper objects, often a 'linguistic' analysis
of the documents stating the requirements is proposed.
Nouns may suggest objects and verbs may suggest operations that are to be performed by objects.
}
\nop{
Clearly, of a design method, as opposed to a programming language,
we require to be able to characterize objects and their possible
interactions with other objects in an abstract way,
ignoring implementation dependent details.
However, since objects are the major organizing principle
both in object oriented programming and design, the distinction between design and implementation
lies in the degree that abstraction and conceptual clarity is supported.
For developing a design method, the central question is what we consider to be objects
and what means must (minimally) be provided to characterize the functionality of objects and their
interactions with other objects.
}
Objects
[Booch86] characterizes objects as (clearly identifiable) entities that suffer
and require actions.
Operationally, an object may be defined as to comprise a state and behavior.
The actions an object suffers may be requests to give information on its state
or may demand to change the state of the object.
To provide a service an object may need to issue such requests
to other objects.
In an object oriented system, computation amounts to sending messages
between objects.
Objects provide the means to encapsulate data and procedures and to hide the details
of the implementation from the clients by specifying an external
method interface.
Apart from contributing to the modular structure of a program the
encapsulation mechanism allows local changes to objects and thus
enhances the maintenance of an object oriented system.
Objects may play a variety of roles, that is an object may be merely a passive
server, awaiting requests to execute a message, or objects may autonomously
control (parts of) a computation.
The most usual case, however, is for an object to figure
in both roles, and to collaborate
with other objects in order to provide a service.
Inheritance
There is some debate whether inheritance is to be considered an integral part
of an object oriented development method. C.f. [Booch86].
I share the view expressed in e.g. [HOB87] that inheritance is of
major importance in the design and implementation of object oriented
systems as a mechanism to suppress the complexity of a large collection of
object descriptions by means of a hierarchical organization
according to their functionality.
Moreover, inheritance is of essential importance for the effective reuse of software. C.f. [Meyer88] and [WWW90].
In object oriented design, inheritance comes down to sharing specifications
of behavioral properties of objects.\id{
In object oriented programming languages inheritance by code sharing
has proven to be a very powerful mechanism.
}
Object oriented design
The principal guideline in object oriented design is to find some meaningful
decomposition, that allows to regard each of the components as an object
providing certain services, reflecting the structure of the problem domain.
Describing objects and characterizing their structural relations by means of
inheritance are the two major components of an object oriented design methodology.
Objects provide a mechanism to abstract from the details of how a service is provided.
To make use of a service, it suffices to know what services an object offers
and what messages must be sent to request for that service.
Inheritance provides a means to create a hierarchy of objects and to separate
the stable conceptual issues from more specific volatile details.