OOAD Unit1
OOAD Unit1
Grady Booch has defined OOA as, “Object-oriented analysis is a method of analysis that examines
requirements from the perspective of the classes and objects found in the vocabulary of the problem
domain”.
The primary tasks in object-oriented analysis (OOA) are −
Identifying objects
Organizing the objects by creating object model diagram
Defining the internals of the objects, or object attributes
Defining the behavior of the objects, i.e., object actions
Describing how the objects interact
The common models used in OOA are use cases and object models.
Object-Oriented Design
Object–Oriented Design (OOD) involves implementation of the conceptual model produced during
object-oriented analysis. In OOD, concepts in the analysis model, which are technology−independent,
are mapped onto implementing classes, constraints are identified and interfaces are designed, resulting
in a model for the solution domain, i.e., a detailed description of how the system is to be built on
concrete technologies.
The implementation details generally include −
Restructuring the class data (if necessary),
Implementation of methods, i.e., internal data structures and algorithms,
Implementation of control, and
Implementation of associations.
Grady Booch has defined object-oriented design as “a method of design encompassing the process of
object-oriented decomposition and a notation for depicting both logical and physical as well as static
and dynamic models of the system under design”.
Object-Oriented Programming
Object-oriented programming (OOP) is a programming paradigm based upon objects (having both data
and methods) that aims to incorporate the advantages of modularity and reusability. Objects, which are
usually instances of classes, are used to interact with one another to design applications and computer
programs.
The important features of object–oriented programming are −
Bottom–up approach in program design
Programs organized around objects, grouped in classes
Focus on data with methods to operate upon object’s data
Interaction between objects through functions
Reusability of design through creation of new classes by adding features to existing classes
Some examples of object-oriented programming languages are C++, Java, Smalltalk, Delphi, C#, Perl,
Python, Ruby, and PHP.
Grady Booch has defined object–oriented programming as “a method of implementation in which
programs are organized as cooperative collections of objects, each of which represents an instance of
some class, and whose classes are all members of a hierarchy of classes united via inheritance
relationships”.
OOAD - Object Model
The object model visualizes the elements in a software application in terms of objects. In this chapter,
we will look into the basic concepts and terminologies of object–oriented systems.
Objects and Classes
The concepts of objects and classes are intrinsically linked with each other and form the foundation of
object–oriented paradigm.
Object
An object is a real-world element in an object–oriented environment that may have a physical or a
conceptual existence. Each object has −
Identity that distinguishes it from other objects in the system.
State that determines the characteristic properties of an object as well as the values of the
properties that the object holds.
Behavior that represents externally visible activities performed by an object in terms of changes
in its state.
Objects can be modelled according to the needs of the application. An object may have a physical
existence, like a customer, a car, etc.; or an intangible conceptual existence, like a project, a process,
etc.
Class
A class represents a collection of objects having same characteristic properties that exhibit common
behavior. It gives the blueprint or description of the objects that can be created from it. Creation of an
object as a member of a class is called instantiation. Thus, object is an instance of a class.
The constituents of a class are −
A set of attributes for the objects that are to be instantiated from the class. Generally, different
objects of a class have some difference in the values of the attributes. Attributes are often referred as
class data.
A set of operations that portray the behavior of the objects of the class. Operations are also
referred as functions or methods.
Example
Let us consider a simple class, Circle, that represents the geometrical figure circle in a two–dimensional
space. The attributes of this class can be identified as follows −
x–coord, to denote x–coordinate of the center
y–coord, to denote y–coordinate of the center
a, to denote the radius of the circle
Some of its operations can be defined as follows −
findArea(), method to calculate area
findCircumference(), method to calculate circumference
scale(), method to increase or decrease the radius
During instantiation, values are assigned for at least some of the attributes. If we create an object
my_circle, we can assign values like x-coord : 2, y-coord : 3, and a : 4 to depict its state. Now, if the
operation scale() is performed on my_circle with a scaling factor of 2, the value of the variable a will
become 8. This operation brings a change in the state of my_circle, i.e., the object has exhibited certain
behavior.
Encapsulation and Data Hiding
Encapsulation
Encapsulation is the process of binding both attributes and methods together within a class. Through
encapsulation, the internal details of a class can be hidden from outside. It permits the elements of the
class to be accessed from outside only through the interface provided by the class.
Data Hiding
Typically, a class is designed such that its data (attributes) can be accessed only by its class methods
and insulated from direct outside access. This process of insulating an object’s data is called data hiding
or information hiding.
Example
In the class Circle, data hiding can be incorporated by making attributes invisible from outside the class
and adding two more methods to the class for accessing class data, namely −
setValues(), method to assign values to x-coord, y-coord, and a
getValues(), method to retrieve values of x-coord, y-coord, and a
Here the private data of the object my_circle cannot be accessed directly by any method that is not
encapsulated within the class Circle. It should instead be accessed through the methods setValues() and
getValues().
Message Passing
Any application requires a number of objects interacting in a harmonious manner. Objects in a system
may communicate with each other using message passing. Suppose a system has two objects: obj1 and
obj2. The object obj1 sends a message to object obj2, if obj1 wants obj2 to execute one of its methods.
The features of message passing are −
Message passing between two objects is generally unidirectional.
Message passing enables all interactions between objects.
Message passing essentially involves invoking class methods.
Objects in different processes can be involved in message passing.
Inheritance
Inheritance is the mechanism that permits new classes to be created out of existing classes by extending
and refining its capabilities. The existing classes are called the base classes/parent classes/super-
classes, and the new classes are called the derived classes/child classes/subclasses. The subclass can
inherit or derive the attributes and methods of the super-class(es) provided that the super-class allows
so. Besides, the subclass may add its own attributes and methods and may modify any of the super-
class methods. Inheritance defines an “is – a” relationship.
Example
From a class Mammal, a number of classes can be derived such as Human, Cat, Dog, Cow, etc.
Humans, cats, dogs, and cows all have the distinct characteristics of mammals. In addition, each has its
own particular characteristics. It can be said that a cow “is – a” mammal.
Types of Inheritance
Single Inheritance − A subclass derives from a single super-class.
Multiple Inheritance − A subclass derives from more than one super-classes.
Multilevel Inheritance − A subclass derives from a super-class which in turn is derived from
another class and so on.
Hierarchical Inheritance − A class has a number of subclasses each of which may have
subsequent subclasses, continuing for a number of levels, so as to form a tree structure.
Hybrid Inheritance − A combination of multiple and multilevel inheritance so as to form a
lattice structure.
The following figure depicts the examples of different types of inheritance.
Polymorphism
Polymorphism is originally a Greek word that means the ability to take multiple forms. In object-
oriented paradigm, polymorphism implies using operations in different ways, depending upon the
instance they are operating upon. Polymorphism allows objects with different internal structures to
have a common external interface. Polymorphism is particularly effective while implementing
inheritance.
Example
Let us consider two classes, Circle and Square, each with a method findArea(). Though the name and
purpose of the methods in the classes are same, the internal implementation, i.e., the procedure of
calculating area is different for each class. When an object of class Circle invokes its findArea()
method, the operation finds the area of the circle without any conflict with the findArea() method of the
Square class.
Generalization and Specialization
Generalization and specialization represent a hierarchy of relationships between classes, where
subclasses inherit from super-classes.
Generalization
In the generalization process, the common characteristics of classes are combined to form a class in a
higher level of hierarchy, i.e., subclasses are combined to form a generalized super-class. It represents
an “is – a – kind – of” relationship. For example, “car is a kind of land vehicle”, or “ship is a kind of
water vehicle”.
Specialization
Specialization is the reverse process of generalization. Here, the distinguishing features of groups of
objects are used to form specialized classes from existing classes. It can be said that the subclasses are
the specialized versions of the super-class.
The following figure shows an example of generalization and specialization.
It is based upon functionality. The overall The initial cost of constructing the
purpose is identified and then functional system is high, since the whole
decomposition is done for developing the system needs to be designed at once
software. The emphasis not only gives a leaving very little option to add
better understanding of the system but also functionality later.
generates more complete systems.
Events
Events are some occurrences that can trigger state transition of an object or a group of objects. Events
have a location in time and space but do not have a time period associated with it. Events are generally
associated with some actions.
Examples of events are mouse click, key press, an interrupt, stack overflow, etc.
Events that trigger transitions are written alongside the arc of transition in state diagrams.
Example
Considering the example shown in the above figure, the transition from Waiting state to Riding state
takes place when the person gets a taxi. Likewise, the final state is reached, when he reaches the
destination. These two occurrences can be termed as events Get_Taxi and Reach_Destination. The
following figure shows the events in a state machine.
Concurrent Sub-states
In concurrent sub-states, the sub-states execute in parallel, or in other words, each state has
concurrently executing state machines within it. Each of the state machines has its own initial and final
states. If one concurrent sub-state reaches its final state before the other, control waits at its final state.
When all the nested state machines reach their final states, the sub-states join back to a single flow.
The following figure shows the concept of concurrent sub-states.
Data Flows
Data flow represents the flow of data between two processes. It could be between an actor and a
process, or between a data store and a process. A data flow denotes the value of a data item at some
point of the computation. This value is not changed by the data flow.
Representation in DFD − A data flow is represented by a directed arc or an arrow, labelled with the
name of the data item that it carries.
In the above figure, Integer_a and Integer_b represent the input data flows to the process, while L.C.M.
and H.C.F. are the output data flows.
A data flow may be forked in the following cases −
The output value is sent to several places as shown in the following figure. Here, the output
arrows are unlabelled as they denote the same value.
The data flow contains an aggregate value, and each of the components is sent to different
places as shown in the following figure. Here, each of the forked components is labelled.
Actors
Actors are the active objects that interact with the system by either producing data and inputting them
to the system, or consuming data produced by the system. In other words, actors serve as the sources
and the sinks of data.
Representation in DFD − An actor is represented by a rectangle. Actors are connected to the inputs
and outputs and lie on the boundary of the DFD.
Example − The following figure shows the actors, namely, Customer and Sales_Clerk in a counter
sales system.
Data Stores
Data stores are the passive objects that act as a repository of data. Unlike actors, they cannot perform
any operations. They are used to store data and retrieve the stored data. They represent a data structure,
a disk file, or a table in a database.
Representation in DFD − A data store is represented by two parallel lines containing the name of the
data store. Each data store is connected to at least one process. Input arrows contain information to
modify the contents of the data store, while output arrows contain information retrieved from the data
store. When a part of the information is to be retrieved, the output arrow is labelled. An unlabelled
arrow denotes full data retrieval. A two-way arrow implies both retrieval and update.
Example − The following figure shows a data store, Sales_Record, that stores the details of all sales.
Input to the data store comprises of details of sales such as item, billing amount, date, etc. To find the
average sales, the process retrieves the sales records and computes the average.
Constraints
Constraints specify the conditions or restrictions that need to be satisfied over time. They allow adding
new rules or modifying existing ones. Constraints can appear in all the three models of object-oriented
analysis.
In Object Modelling, the constraints define the relationship between objects. They may also
define the relationship between the different values that an object may take at different times.
In Dynamic Modelling, the constraints define the relationship between the states and events of
different objects.
In Functional Modelling, the constraints define the restrictions on the transformations and
computations.
Representation − A constraint is rendered as a string within braces.
Example − The following figure shows a portion of DFD for computing the salary of employees of a
company that has decided to give incentives to all employees of the sales department and increment the
salary of all employees of the HR department. It can be seen that the constraint {Dept:Sales} causes
incentive to be calculated only if the department is sales and the constraint {Dept:HR} causes
increment to be computed only if the department is HR.
Control Flows
A process may be associated with a certain Boolean value and is evaluated only if the value is true,
though it is not a direct input to the process. These Boolean values are called the control flows.
Representation in DFD − Control flows are represented by a dotted arc from the process producing
the Boolean value to the process controlled by them.
Example − The following figure represents a DFD for arithmetic division. The Divisor is tested for
non-zero. If it is not zero, the control flow OK has a value True and subsequently the Divide process
computes the Quotient and the Remainder.
In the next level DFD, as shown in the following figure, the major processes of the system are
identified, the data stores are defined and the interaction of the processes with the actors, and the data
stores are established.
In the system, three processes can be identified, which are −
Register Customers
Process Sales
Ascertain Gifts
The data stores that will be required are −
Customer Details
Sales Details
Gift Details
The following figure shows the details of the process Register Customer. There are three processes in
it, Verify Details, Generate C_Code, and Update Customer Details. When the details of the customer
are entered, they are verified. If the data is correct, C_Code is generated and the data store Customer
Details is updated.
The following figure shows the expansion of the process Ascertain Gifts. It has two processes in it,
Find Total Sales and Decide Type of Gift Coin. The Find Total Sales process computes the yearly total
sales corresponding to each customer and records the data. Taking this record and the decision of the
proprietor as inputs, the gift coins are allotted through Decide Type of Gift Coin process.
Advantages and Disadvantages of DFD
Advantages Disadvantages
DFDs depict the boundaries of a system DFDs take a long time to create, which
and hence are helpful in portraying the may not be feasible for practical
relationship between the external objects purposes.
and the processes within the system.
They help the users to have a knowledge DFDs do not provide any information
about the system. about the time-dependent behavior,
i.e., they do not specify when the
transformations are done.
The graphical representation serves as a They do not throw any light on the
blueprint for the programmers to develop frequency of computations or the
a system. reasons for computations.
Component
A component is a physical and replaceable part of the system that conforms to and provides the
realization of a set of interfaces. It represents the physical packaging of elements like classes and
interfaces.
Notation − In UML diagrams, a component is represented by a rectangle with tabs as shown in the
figure below.
Interface
Interface is a collection of methods of a class or component. It specifies the set of services that may be
provided by the class or component.
Notation − Generally, an interface is drawn as a circle together with its name. An interface is almost
always attached to the class or component that realizes it. The following figure gives the notation of an
interface.
Package
A package is an organized group of elements. A package may contain structural things like classes,
components, and other packages in it.
Notation − Graphically, a package is represented by a tabbed folder. A package is generally drawn
with only its name. However it may have additional details about the contents of the package. See the
following figures.
Relationship
The notations for the different types of relationships are as follows −
Usually, elements in a relationship play specific roles in the relationship. A role name signifies the
behavior of an element participating in a certain context.
Example − The following figures show examples of different relationships between classes. The first
figure shows an association between two classes, Department and Employee, wherein a department
may have a number of employees working in it. Worker is the role name. The ‘1’ alongside Department
and ‘*’ alongside Employee depict that the cardinality ratio is one–to–many. The second figure
portrays the aggregation relationship, a University is the “whole–of” many Departments.
OOAD - UML Structured Diagrams
UML structural diagrams are categorized as follows: class diagram, object diagram, component
diagram, and deployment diagram.
Class Diagram
A class diagram models the static view of a system. It comprises of the classes, interfaces, and
collaborations of a system; and the relationships between them.
Class Diagram of a System
Let us consider a simplified Banking System.
A bank has many branches. In each zone, one branch is designated as the zonal head office that
supervises the other branches in that zone. Each branch can have multiple accounts and loans. An
account may be either a savings account or a current account. A customer may open both a savings
account and a current account. However, a customer must not have more than one savings account or
current account. A customer may also procure loans from the bank.
The following figure shows the corresponding class diagram.
Classes in the system
Bank, Branch, Account, Savings Account, Current Account, Loan, and Customer.
Relationships
A Bank “has–a” number of Branches − composition, one–to–many
A Branch with role Zonal Head Office supervises other Branches − unary association, one–
to-many
A Branch “has–a” number of accounts − aggregation, one–to–many
From the class Account, two classes have inherited, namely, Savings Account and Current Account.
A Customer can have one Current Account − association, one–to–one
A Customer can have one Savings Account − association, one–to–one
A Branch “has–a” number of Loans − aggregation, one–to–many
A Customer can take many loans − association, one–to–many
Object Diagram
An object diagram models a group of objects and their links at a point of time. It shows the instances of
the things in a class diagram. Object diagram is the static part of an interaction diagram.
Example − The following figure shows an object diagram of a portion of the class diagram of the
Banking System.
Component Diagram
Component diagrams show the organization and dependencies among a group of components.
Component diagrams comprise of −
Components
Interfaces
Relationships
Packages and Subsystems (optional)
Component diagrams are used for −
constructing systems through forward and reverse engineering.
modeling configuration management of source code files while developing a system using an
object-oriented programming language.
representing schemas in modeling databases.
modeling behaviors of dynamic systems.
Example
The following figure shows a component diagram to model a system’s source code that is developed
using C++. It shows four source code files, namely, myheader.h, otherheader.h, priority.cpp, and
other.cpp. Two versions of myheader.h are shown, tracing from the recent version to its ancestor. The
file priority.cpp has compilation dependency on other.cpp. The file other.cpp has compilation
dependency on otherheader.h.
Deployment Diagram
A deployment diagram puts emphasis on the configuration of runtime processing nodes and their
components that live on them. They are commonly comprised of nodes and dependencies, or
associations between the nodes.
Deployment diagrams are used to −
model devices in embedded systems that typically comprise of software-intensive collection of
hardware.
represent the topologies of client/server systems.
model fully distributed systems.
Example
The following figure shows the topology of a computer system that follows client/server architecture.
The figure illustrates a node stereotyped as server that comprises of processors. The figure indicates
that four or more servers are deployed at the system. Connected to the server are the client nodes,
where each node represents a terminal device such as workstation, laptop, scanner, or printer. The
nodes are represented using icons that clearly depict the real-world equivalent.
OOAD - UML Behavioural Diagrams
UML behavioral diagrams visualize, specify, construct, and document the dynamic aspects of a system.
The behavioral diagrams are categorized as follows: use case diagrams, interaction diagrams, state–
chart diagrams, and activity diagrams.
Use Case Model
Use case
A use case describes the sequence of actions a system performs yielding visible results. It shows the
interaction of things outside the system with the system itself. Use cases may be applied to the whole
system as well as a part of the system.
Actor
An actor represents the roles that the users of the use cases play. An actor may be a person (e.g.
student, customer), a device (e.g. workstation), or another system (e.g. bank, institution).
The following figure shows the notations of an actor named Student and a use case called Generate
Performance Report.
Interaction Diagrams
Interaction diagrams depict interactions of objects and their relationships. They also include the
messages passed between them. There are two types of interaction diagrams −
Sequence Diagrams
Collaboration Diagrams
Interaction diagrams are used for modeling −
the control flow by time ordering using sequence diagrams.
the control flow of organization using collaboration diagrams.
Sequence Diagrams
Sequence diagrams are interaction diagrams that illustrate the ordering of messages according to time.
Notations − These diagrams are in the form of two-dimensional charts. The objects that initiate the
interaction are placed on the x–axis. The messages that these objects send and receive are placed along
the y–axis, in the order of increasing time from top to bottom.
Example − A sequence diagram for the Automated Trading House System is shown in the following
figure.
Collaboration Diagrams
Collaboration diagrams are interaction diagrams that illustrate the structure of the objects that send and
receive messages.
Notations − In these diagrams, the objects that participate in the interaction are shown using vertices.
The links that connect the objects are used to send and receive messages. The message is shown as a
labeled arrow.
Example − Collaboration diagram for the Automated Trading House System is illustrated in the figure
below.
State–Chart Diagrams
A state–chart diagram shows a state machine that depicts the control flow of an object from one state to
another. A state machine portrays the sequences of states which an object undergoes due to events and
their responses to events.
State–Chart Diagrams comprise of −
States: Simple or Composite
Transitions between states
Events causing transitions
Actions due to the events
State-chart diagrams are used for modeling objects which are reactive in nature.
Example
In the Automated Trading House System, let us model Order as an object and trace its sequence. The
following figure shows the corresponding state–chart diagram.
Activity Diagrams
An activity diagram depicts the flow of activities which are ongoing non-atomic operations in a state
machine. Activities result in actions which are atomic operations.
Activity diagrams comprise of −
Activity states and action states
Transitions
Objects
Activity diagrams are used for modeling −
workflows as viewed by actors, interacting with the system.
details of operations or computations using flowcharts.
Example
The following figure shows an activity diagram of a portion of the Automated Trading House System.
OOAD - Object Oriented Design
After the analysis phase, the conceptual model is developed further into an object-oriented model using
object-oriented design (OOD). In OOD, the technology-independent concepts in the analysis model are
mapped onto implementing classes, constraints are identified, and interfaces are designed, resulting in a
model for the solution domain. In a nutshell, a detailed description is constructed specifying how the
system is to be built on concrete technologies
The stages for object–oriented design can be identified as −
Definition of the context of the system
Designing system architecture
Identification of the objects in the system
Construction of design models
Specification of object interfaces
System Design
Object-oriented system design involves defining the context of a system followed by designing the
architecture of the system.
Context − The context of a system has a static and a dynamic part. The static context of the
system is designed using a simple block diagram of the whole system which is expanded into a
hierarchy of subsystems. The subsystem model is represented by UML packages. The dynamic context
describes how the system interacts with its environment. It is modelled using use case diagrams.
System Architecture − The system architecture is designed on the basis of the context of the
system in accordance with the principles of architectural design as well as domain knowledge.
Typically, a system is partitioned into layers and each layer is decomposed to form the subsystems.
Object-Oriented Decomposition
Decomposition means dividing a large complex system into a hierarchy of smaller components with
lesser complexities, on the principles of divide–and–conquer. Each major component of the system is
called a subsystem. Object-oriented decomposition identifies individual autonomous objects in a
system and the communication among these objects.
The advantages of decomposition are −
The individual components are of lesser complexity, and so more understandable and
manageable.
It enables division of workforce having specialized skills.
It allows subsystems to be replaced or modified without affecting other subsystems.
Identifying Concurrency
Concurrency allows more than one objects to receive events at the same time and more than one
activity to be executed simultaneously. Concurrency is identified and represented in the dynamic
model.
To enable concurrency, each concurrent element is assigned a separate thread of control. If the
concurrency is at object level, then two concurrent objects are assigned two different threads of control.
If two operations of a single object are concurrent in nature, then that object is split among different
threads.
Concurrency is associated with the problems of data integrity, deadlock, and starvation. So a clear
strategy needs to be made whenever concurrency is required. Besides, concurrency requires to be
identified at the design stage itself, and cannot be left for implementation stage.
Identifying Patterns
While designing applications, some commonly accepted solutions are adopted for some categories of
problems. These are the patterns of design. A pattern can be defined as a documented set of building
blocks that can be used in certain types of application development problems.
Some commonly used design patterns are −
Façade pattern
Model view separation pattern
Observer pattern
Model view controller pattern
Publish subscribe pattern
Proxy pattern
Controlling Events
During system design, the events that may occur in the objects of the system need to be identified and
appropriately dealt with.
An event is a specification of a significant occurrence that has a location in time and space.
There are four types of events that can be modelled, namely −
Signal Event − A named object thrown by one object and caught by another object.
Call Event − A synchronous event representing dispatch of an operation.
Time Event − An event representing passage of time.
Change Event − An event representing change in state.
Handling Boundary Conditions
The system design phase needs to address the initialization and the termination of the system as a
whole as well as each subsystem. The different aspects that are documented are as follows −
The start–up of the system, i.e., the transition of the system from non-initialized state to steady
state.
The termination of the system, i.e., the closing of all running threads, cleaning up of resources,
and the messages to be sent.
The initial configuration of the system and the reconfiguration of the system when needed.
Foreseeing failures or undesired termination of the system.
Boundary conditions are modelled using boundary use cases.
Object Design
After the hierarchy of subsystems has been developed, the objects in the system are identified and their
details are designed. Here, the designer details out the strategy chosen during the system design. The
emphasis shifts from application domain concepts toward computer concepts. The objects identified
during analysis are etched out for implementation with an aim to minimize execution time, memory
consumption, and overall cost.
Object design includes the following phases −
Object identification
Object representation, i.e., construction of design models
Classification of operations
Algorithm design
Design of relationships
Implementation of control for external interactions
Package classes and associations into modules
Object Identification
The first step of object design is object identification. The objects identified in the object–oriented
analysis phases are grouped into classes and refined so that they are suitable for actual implementation.
The functions of this stage are −
Identifying and refining the classes in each subsystem or package
Defining the links and associations between the classes
Designing the hierarchical associations among the classes, i.e., the generalization/specialization
and inheritances
Designing aggregations
Object Representation
Once the classes are identified, they need to be represented using object modelling techniques. This
stage essentially involves constructing UML diagrams.
There are two types of design models that need to be produced −
Static Models − To describe the static structure of a system using class diagrams and object
diagrams.
Dynamic Models − To describe the dynamic structure of a system and show the interaction
between classes using interaction diagrams and state–chart diagrams.
Classification of Operations
In this step, the operation to be performed on objects are defined by combining the three models
developed in the OOA phase, namely, object model, dynamic model, and functional model. An
operation specifies what is to be done and not how it should be done.
The following tasks are performed regarding operations −
The state transition diagram of each object in the system is developed.
Operations are defined for the events received by the objects.
Cases in which one event triggers other events in same or different objects are identified.
The sub–operations within the actions are identified.
The main actions are expanded to data flow diagrams.
Algorithm Design
The operations in the objects are defined using algorithms. An algorithm is a stepwise procedure that
solves the problem laid down in an operation. Algorithms focus on how it is to be done.
There may be more than one algorithm corresponding to a given operation. Once the alternative
algorithms are identified, the optimal algorithm is selected for the given problem domain. The metrics
for choosing the optimal algorithm are −
Computational Complexity − Complexity determines the efficiency of an algorithm in terms
of computation time and memory requirements.
Flexibility − Flexibility determines whether the chosen algorithm can be implemented suitably,
without loss of appropriateness in various environments.
Understandability − This determines whether the chosen algorithm is easy to understand and
implement.
Design of Relationships
The strategy to implement the relationships needs to be chalked out during the object design phase. The
main relationships that are addressed comprise of associations, aggregations, and inheritances.
The designer should do the following regarding associations −
Identify whether an association is unidirectional or bidirectional.
Analyze the path of associations and update them if necessary.
Implement the associations as a distinct object, in case of many–to-many relationships; or as a
link to other object in case of one–to-one or one–to-many relationships.
Regarding inheritances, the designer should do the following −
Adjust the classes and their associations.
Identify abstract classes.
Make provisions so that behaviors are shared when needed.
Implementation of Control
The object designer may incorporate refinements in the strategy of the state–chart model. In system
design, a basic strategy for realizing the dynamic model is made. During object design, this strategy is
aptly embellished for appropriate implementation.
The approaches for implementation of the dynamic model are −
Represent State as a Location within a Program − This is the traditional procedure-driven
approach whereby the location of control defines the program state. A finite state machine can be
implemented as a program. A transition forms an input statement, the main control path forms the
sequence of instructions, the branches form the conditions, and the backward paths form the loops or
iterations.
State Machine Engine − This approach directly represents a state machine through a state
machine engine class. This class executes the state machine through a set of transitions and actions
provided by the application.
Control as Concurrent Tasks − In this approach, an object is implemented as a task in the
programming language or the operating system. Here, an event is implemented as an inter-task call. It
preserves inherent concurrency of real objects.
Packaging Classes
In any large project, meticulous partitioning of an implementation into modules or packages is
important. During object design, classes and objects are grouped into packages to enable multiple
groups to work cooperatively on a project.
The different aspects of packaging are −
Hiding Internal Information from Outside View − It allows a class to be viewed as a “black
box” and permits class implementation to be changed without requiring any clients of the class to
modify code.
Coherence of Elements − An element, such as a class, an operation, or a module, is coherent if
it is organized on a consistent plan and all its parts are intrinsically related so that they serve a common
goal.
Construction of Physical Modules − The following guidelines help while constructing
physical modules −
o Classes in a module should represent similar things or components in the same
composite object.
o Closely connected classes should be in the same module.
o Unconnected or weakly connected classes should be placed in separate modules.
o Modules should have good cohesion, i.e., high cooperation among its components.
o A module should have low coupling with other modules, i.e., interaction or
interdependence between modules should be minimum.
Design Optimization
The analysis model captures the logical information about the system, while the design model adds
details to support efficient information access. Before a design is implemented, it should be optimized
so as to make the implementation more efficient. The aim of optimization is to minimize the cost in
terms of time, space, and other metrics.
However, design optimization should not be excess, as ease of implementation, maintainability, and
extensibility are also important concerns. It is often seen that a perfectly optimized design is more
efficient but less readable and reusable. So the designer must strike a balance between the two.
The various things that may be done for design optimization are −
Add redundant associations
Omit non-usable associations
Optimization of algorithms
Save derived attributes to avoid re-computation of complex expressions
Addition of Redundant Associations
During design optimization, it is checked if deriving new associations can reduce access costs. Though
these redundant associations may not add any information, they may increase the efficiency of the
overall model.
Omission of Non-Usable Associations
Presence of too many associations may render a system indecipherable and hence reduce the overall
efficiency of the system. So, during optimization, all non-usable associations are removed.
Optimization of Algorithms
In object-oriented systems, optimization of data structure and algorithms are done in a collaborative
manner. Once the class design is in place, the operations and the algorithms need to be optimized.
Optimization of algorithms is obtained by −
Rearrangement of the order of computational tasks
Reversal of execution order of loops from that laid down in the functional model
Removal of dead paths within the algorithm
Saving and Storing of Derived Attributes
Derived attributes are those attributes whose values are computed as a function of other attributes (base
attributes). Re-computation of the values of derived attributes every time they are needed is a time–
consuming procedure. To avoid this, the values can be computed and stored in their computed forms.
However, this may pose update anomalies, i.e., a change in the values of base attributes with no
corresponding change in the values of the derived attributes. To avoid this, the following steps are
taken −
With each update of the base attribute value, the derived attribute is also re-computed.
All the derived attributes are re-computed and updated periodically in a group rather than after
each update.
Design Documentation
Documentation is an essential part of any software development process that records the procedure of
making the software. The design decisions need to be documented for any non–trivial software system
for transmitting the design to others.
Usage Areas
Though a secondary product, a good documentation is indispensable, particularly in the following areas
−
In designing software that is being developed by a number of developers
In iterative software development strategies
In developing subsequent versions of a software project
For evaluating a software
For finding conditions and areas of testing
For maintenance of the software.
Contents
A beneficial documentation should essentially include the following contents −
High–level system architecture − Process diagrams and module diagrams
Key abstractions and mechanisms − Class diagrams and object diagrams.
Scenarios that illustrate the behavior of the main aspects − Behavioural diagrams
Features
The features of a good documentation are −
Concise and at the same time, unambiguous, consistent, and complete
Traceable to the system’s requirement specifications
Well-structured
Diagrammatic instead of descriptive
OOAD - Implementation Strategies
Implementing an object-oriented design generally involves using a standard object oriented
programming language (OOPL) or mapping object designs to databases. In most cases, it involves
both.
Implementation using Programming Languages
Usually, the task of transforming an object design into code is a straightforward process. Any object-
oriented programming language like C++, Java, Smalltalk, C# and Python, includes provision for
representing classes. In this chapter, we exemplify the concept using C++.
The following figure shows the representation of the class Circle using C++.
Implementing Associations
Most programming languages do not provide constructs to implement associations directly. So the task
of implementing associations needs considerable thought.
Associations may be either unidirectional or bidirectional. Besides, each association may be either one–
to–one, one–to–many, or many–to–many.
Unidirectional Associations
For implementing unidirectional associations, care should be taken so that unidirectionality is
maintained. The implementations for different multiplicity are as follows −
Optional Associations − Here, a link may or may not exist between the participating objects.
For example, in the association between Customer and Current Account in the figure below, a customer
may or may not have a current account.
For implementation, an object of Current Account is included as an attribute in Customer that may be
NULL. Implementation using C++ −
class Customer {
private:
// attributes
Current_Account c; //an object of Current_Account as attribute
public:
Customer() {
c = NULL;
} // assign c as NULL
Current_Account getCurrAc() {
return c;
}
This is implemented by including in Department, an object of Manager that should not be NULL.
Implementation using C++ −
class Department {
private:
// attributes
Manager mgr; //an object of Manager as attribute
public:
Department (/*parameters*/, Manager m) { //m is not NULL
// assign parameters to variables
mgr = m;
}
Manager getMgr() {
return mgr;
}
};
One–to–many Associations − Here, one instance of a class is related to more than one
instances of the associated class. For example, consider the association between Employee and
Dependent in the following figure.
This is implemented by including a list of Dependents in class Employee. Implementation using C++
STL list container −
class Employee {
private:
char * deptName;
list <Dependent> dep; //a list of Dependents as attribute
public:
void addDependent ( Dependent d) {
dep.push_back(d);
} // adds an employee to the department
class Project_Manager {
private:
// attributes
Project pj;
public:
void setProject(Project p);
Project removeProject();
};
One–to–many Associations − Consider the relationship between Department and Employee
having one–to–many association as shown in the figure below.
public:
void addEmployee ( Employee e) {
emp.push_back(e);
} // adds an employee to the department
class Employee {
private:
//attributes
Department d;
public:
void addDept();
void removeDept();
};
Implementing Associations as Classes
If an association has some attributes associated, it should be implemented using a separate class. For
example, consider the one–to–one association between Employee and Project as shown in the figure
below.
public:
// class methods
};
Implementing Constraints
Constraints in classes restrict the range and type of values that the attributes may take. In order to
implement constraints, a valid default value is assigned to the attribute when an object is instantiated
from the class. Whenever the value is changed at runtime, it is checked whether the value is valid or
not. An invalid value may be handled by an exception handling routine or other methods.
Example
Consider an Employee class where age is an attribute that may have values in the range of 18 to 60.
The following C++ code incorporates it −
class Employee {
private: char * name;
int age;
// other attributes
public:
Employee() { // default constructor
strcpy(name, "");
age = 18; // default value
}