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.