Course Hand Out
Course Hand Out
A Brief History
The object-oriented paradigm took its shape from the initial concept of a new
programming approach, while the interest in design and analysis methods came much
later.
The first object–oriented language was Simula (Simulation of real systems) that
was developed in 1960 by researchers at the Norwegian Computing Center.
In 1970, Alan Kay and his research group at Xerox PARK created a personal
computer named Dynabook and the first pure object-oriented programming
language (OOPL) - Smalltalk, for programming the Dynabook.
In the 1980s, Grady Booch published a paper titled Object Oriented Design that
mainly presented a design for the programming language, Ada. In the ensuing
editions, he extended his ideas to a complete object–oriented design method.
In the 1990s, Coad incorporated behavioral ideas to object-oriented methods.
The other significant innovations were Object Modelling Techniques (OMT) by James
Rumbaugh and Object-Oriented Software Engineering (OOSE) by Ivar Jacobson.
Object-Oriented Analysis
Object–Oriented Analysis (OOA) is the procedure of identifying software engineering
requirements and developing software specifications in terms of a software system’s
object model, which comprises of interacting objects.
The main difference between object-oriented analysis and other forms of analysis is
that in object-oriented approach, requirements are organized around objects, which
integrate both data and functions. They are modelled after real-world objects that the
system interacts with. In traditional analysis methodologies, the two aspects - functions
and data - are considered separately.
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 −
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 −
Object
Class
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 −
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 −
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
Generalization
Specialization
A link represents a connection through which an object collaborates with other objects.
Rumbaugh has defined it as “a physical or conceptual connection between objects”.
Through a link, one object may invoke the methods or navigate through another object.
A link depicts the relationship between two or more objects.
Association
Degree of an Association
Aggregation or Composition
Aggregation or composition is a relationship among classes by which a class can be
made up of any combination of objects of other classes. It allows objects to be placed
directly within the body of other classes. Aggregation is referred as a “part–of” or “has–
a” relationship, with the ability to navigate from the whole to its parts. An aggregate
object is an object that is composed of one or more other objects.
Example
In the relationship, “a car has–a motor”, car is the whole object or the aggregate, and
the motor is a “part–of” the car. Aggregation may denote −
Physical containment − Example, a computer is composed of monitor, CPU,
mouse, keyboard, and so on.
Conceptual containment − Example, shareholder has–a share.
Analysis,
Design, and
Implementation.
In object-oriented software engineering, the software developer identifies and
organizes the application in terms of object-oriented concepts, prior to their final
representation in any specific programming language or software tools.
Object–Oriented Analysis
In this stage, the problem is formulated, user requirements are identified, and then a
model is built based upon real–world objects. The analysis produces models on how
the desired system should function and how it must be developed. The models do not
include any implementation details so that it can be understood and examined by any
non–technical application expert.
Object–Oriented Design
Object-oriented design includes two main stages, namely, system design and object
design.
System Design
In this stage, the complete architecture of the desired system is designed. The system
is conceived as a set of interacting subsystems that in turn is composed of a hierarchy
of interacting objects, grouped into classes. System design is done according to both
the system analysis model and the proposed system architecture. Here, the emphasis
is on the objects comprising the system rather than the processes in the system.
Object Design
In this phase, a design model is developed based on both the models developed in the
system analysis phase and the architecture designed in the system design phase. All
the classes required are identified. The designer decides whether −
In this stage, the design model developed in the object design is translated into code in
an appropriate programming language or software tool. The databases are created and
the specific hardware requirements are ascertained. Once the code is in shape, it is
tested using specialized techniques to identify and remove the errors in the code.
Abstraction
Encapsulation
Modularity
Hierarchy
Minor Elements − By minor, it is meant that these elements are useful, but not
indispensable part of the object model. The three minor elements are −
Typing
Concurrency
Persistence
Abstraction
Abstraction means to focus on the essential features of an element or object in OOP,
ignoring its extraneous or accidental properties. The essential features are relative to
the context in which the object is being used.
Grady Booch has defined abstraction as follows −
“An abstraction denotes the essential characteristics of an object that distinguish it from
all other kinds of objects and thus provide crisply defined conceptual boundaries,
relative to the perspective of the viewer.”
Example − When a class Student is designed, the attributes enrolment_number,
name, course, and address are included while characteristics like pulse_rate and
size_of_shoe are eliminated, since they are irrelevant in the perspective of the
educational institution.
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. The class has methods that provide user interfaces by which the services
provided by the class may be used.
Modularity
Modularity is the process of decomposing a problem (program) into a set of modules
so as to reduce the overall complexity of the problem. Booch has defined modularity as
−
“Modularity is the property of a system that has been decomposed into a set of
cohesive and loosely coupled modules.”
Modularity is intrinsically linked with encapsulation. Modularity can be visualized as a
way of mapping encapsulated abstractions into real, physical modules having high
cohesion within the modules and their inter–module interaction or coupling is low.
Hierarchy
In Grady Booch’s words, “Hierarchy is the ranking or ordering of abstraction”. Through
hierarchy, a system can be made up of interrelated subsystems, which can have their
own subsystems and so on until the smallest level components are reached. It uses
the principle of “divide and conquer”. Hierarchy allows code reusability.
The two types of hierarchies in OOA are −
“IS–A” hierarchy − It defines the hierarchical relationship in inheritance,
whereby from a super-class, a number of subclasses may be derived which may
again have subclasses and so on. For example, if we derive a class Rose from
a class Flower, we can say that a rose “is–a” flower.
“PART–OF” hierarchy − It defines the hierarchical relationship in aggregation
by which a class may be composed of other classes. For example, a flower is
composed of sepals, petals, stamens, and carpel. It can be said that a petal is a
“part–of” flower.
Typing
According to the theories of abstract data type, a type is a characterization of a set of
elements. In OOP, a class is visualized as a type having properties distinct from any
other types. Typing is the enforcement of the notion that an object is an instance of a
single class or type. It also enforces that objects of different types may not be generally
interchanged; and can be interchanged only in a very restricted manner if absolutely
required to do so.
The two types of typing are −
Strong Typing − Here, the operation on an object is checked at the time of
compilation, as in the programming language Eiffel.
Weak Typing − Here, messages may be sent to any class. The operation is
checked only at the time of execution, as in the programming language
Smalltalk.
Concurrency
Concurrency in operating systems allows performing multiple tasks or processes
simultaneously. When a single process exists in a system, it is said that there is a
single thread of control. However, most systems have multiple threads, some active,
some waiting for CPU, some suspended, and some terminated. Systems with multiple
CPUs inherently permit concurrent threads of control; but systems running on a single
CPU use appropriate algorithms to give equitable CPU time to the threads so as to
enable concurrency.
In an object-oriented environment, there are active and inactive objects. The active
objects have independent threads of control that can execute concurrently with threads
of other objects. The active objects synchronize with one another as well as with purely
sequential objects.
Persistence
An object occupies a memory space and exists for a particular period of time. In
traditional programming, the lifespan of an object was typically the lifespan of the
execution of the program that created it. In files or databases, the object lifespan is
longer than the duration of the process creating the object. This property by which an
object continues to exist even after its creator ceases to exist is known as persistence.
Object Modelling
Object modelling develops the static structure of the software system in terms of
objects. It identifies the objects, the classes into which the objects can be grouped into
and the relationships between the objects. It also identifies the main attributes and
operations that characterize each class.
The process of object modelling can be visualized in the following steps −
Dynamic Modelling
After the static behavior of the system is analyzed, its behavior with respect to time and
external changes needs to be examined. This is the purpose of dynamic modelling.
Dynamic Modelling can be defined as “a way of describing how an individual object
responds to events, either internal events triggered by other objects, or external events
triggered by the outside world”.
The process of dynamic modelling can be visualized in the following steps −
Functional Modelling
Functional Modelling is the final component of object-oriented analysis. The functional
model shows the processes that are performed within an object and how the data
changes as it moves between methods. It specifies the meaning of the operations of
object modelling and the actions of dynamic modelling. The functional model
corresponds to the data flow diagram of traditional structured analysis.
The process of functional modelling can be visualized in the following steps −
Feasibility Study
Requirement Analysis and Specification
System Design
Implementation
Post-implementation Review
Now, we will look at the relative advantages and disadvantages of structured analysis
approach and object-oriented analysis approach.
Advantages Disadvantages
Focuses on data rather than the procedures as Functionality is restricted within objects. This
in Structured Analysis. may pose a problem for systems which are
intrinsically procedural or computational in
nature.
The principles of encapsulation and data hiding It cannot identify which objects would generate
help the developer to develop systems that an optimal system design.
cannot be tampered by other parts of the
system.
The principles of encapsulation and data hiding The object-oriented models do not easily show
help the developer to develop systems that the communications between the objects in the
cannot be tampered by other parts of the system.
system.
It allows effective management of software All the interfaces between the objects cannot be
complexity by the virtue of modularity. represented in a single diagram.
Advantages Disadvantages
It is based upon functionality. The overall purpose is The initial cost of constructing the system is
identified and then functional decomposition is done high, since the whole system needs to be
for developing the software. The emphasis not only designed at once leaving very little option
gives a better understanding of the system but also to add functionality later.
generates more complete systems.
The specifications in it are written in simple English It does not support reusability of code. So,
language, and hence can be more easily analyzed the time and cost of development is
by non-technical personnel. inherently high.
The state is an abstraction given by the values of the attributes that the object has at a
particular time period. It is a situation occurring for a finite time period in the lifetime of
an object, in which it fulfils certain conditions, performs certain activities, or waits for
certain events to occur. In state transition diagrams, a state is represented by rounded
rectangles.
Parts of a state
Name − A string differentiates one state from another. A state may not have any
name.
Entry/Exit Actions − It denotes the activities performed on entering and on
exiting the state.
Internal Transitions − The changes within a state that do not cause a change in
the state.
Sub–states − States within states.
The default starting state of an object is called its initial state. The final state indicates
the completion of execution of the state machine. The initial and the final states are
pseudo-states, and may not have the parts of a regular state except name. In state
transition diagrams, the initial state is represented by a filled black circle. The final state
is represented by a filled black circle encircled within another unfilled black circle.
Transition
External events are those events that pass from a user of the system to the objects
within the system. For example, mouse click or key−press by the user are external
events.
Internal events are those that pass from one object to another object within a system.
For example, stack overflow, a divide error, etc.
Deferred Events
Deferred events are those which are not immediately handled by the object in the
current state but are lined up in a queue so that they can be handled by the object in
some other state at a later time.
Event Classes
Event class indicates a group of events with common structure and behavior. As with
classes of objects, event classes may also be organized in a hierarchical structure.
Event classes may have attributes associated with them, time being an implicit
attribute. For example, we can consider the events of departure of a flight of an airline,
which we can group into the following class −
Flight_Departs (Flight_No, From_City, To_City, Route)
Actions
Activity
Activity is an operation upon the states of an object that requires some time period.
They are the ongoing executions within a system that can be interrupted. Activities are
shown in activity diagrams that portray the flow from one activity to another.
Action
Entry action is the action that is executed on entering a state, irrespective of the
transition that led into it.
Likewise, the action that is executed while leaving a state, irrespective of the transition
that led out of it, is called an exit action.
Scenario
Interaction Diagrams
State transition diagrams or state machines describe the dynamic behavior of a single
object. It illustrates the sequences of states that an object goes through in its lifetime,
the transitions of the states, the events and conditions causing the transition and the
responses due to the events.
Concurrency of Events
In a system, two types of concurrency may exist. They are −
System Concurrency
Here, concurrency is modelled in the system level. The overall system is modelled as
the aggregation of state machines, where each state machine executes concurrently
with others.
Here, an object can issue concurrent events. An object may have states that are
composed of sub-states, and concurrent events may occur in each of the sub-states.
Concepts related to concurrency within an object are as follows −
A simple state has no sub-structure. A state that has simpler states nested inside it is
called a composite state. A sub-state is a state that is nested inside another state. It is
generally used to reduce the complexity of a state machine. Sub-states can be nested
to any number of levels.
Composite states may have either sequential sub-states or concurrent sub-states.
Sequential Sub-states
In sequential sub-states, the control of execution passes from one sub-state to another
sub-state one after another in a sequential manner. There is at most one initial state
and one final state in these state machines.
The following figure illustrates the concept of sequential sub-states.
Concurrent Sub-states
Processes,
Data Flows,
Actors, and
Data Stores.
The other parts of a DFD are −
Constraints, and
Control Flows.
Features of a DFD
Processes
Processes are the computational activities that transform data values. A whole system
can be visualized as a high-level process. A process may be further divided into
smaller components. The lowest-level process may be a simple function.
Representation in DFD − A process is represented as an ellipse with its name written
inside it and contains a fixed number of input and output data values.
Example − The following figure shows a process Compute_HCF_LCM that accepts
two integers as inputs and outputs their HCF (highest common factor) and LCM (least
common multiple).
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.
Developing the DFD Model of a System
In order to develop the DFD model of a system, a hierarchy of DFDs are constructed.
The top-level DFD comprises of a single process and the actors interacting with it.
At each successive lower level, further details are gradually included. A process is
decomposed into sub-processes, the data flows among the sub-processes are
identified, the control flows are determined, and the data stores are defined. While
decomposing a process, the data flow into or out of the process should match the data
flow at the next level of DFD.
Example − Let us consider a software system, Wholesaler Software, that automates
the transactions of a wholesale shop. The shop sells in bulks and has a clientele
comprising of merchants and retail shop owners. Each customer is asked to register
with his/her particulars and is given a unique customer code, C_Code. Once a sale is
done, the shop registers its details and sends the goods for dispatch. Each year, the
shop distributes Christmas gifts to its customers, which comprise of a silver coin or a
gold coin depending upon the total sales and the decision of the proprietor.
The functional model for the Wholesale Software is given below. The figure below
shows the top-level DFD. It shows the software as a single process and the actors that
interact with it.
The actors in the system are −
Customers
Salesperson
Proprietor
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 Disadvantages
DFDs depict the boundaries of a system and DFDs take a long time to create, which may
hence are helpful in portraying the relationship not be feasible for practical purposes.
between the external objects and the processes
within the system.
They help the users to have a knowledge about DFDs do not provide any information about
the system. the time-dependent behavior, i.e., they do not
specify when the transformations are done.
The graphical representation serves as a blueprint They do not throw any light on the frequency
for the programmers to develop a system. of computations or the reasons for
computations.
DFDs provide detailed information about the The preparation of DFDs is a complex
system processes. process that needs considerable expertise.
Also, it is difficult for a non-technical person to
understand.
They are used as a part of the system The method of preparation is subjective and
documentation. leaves ample scope to be imprecise.
The four main parts of a Functional Model in terms of object model are −
Process − Processes imply the methods of the objects that need to be
implemented.
Actors − Actors are the objects in the object model.
Data Stores − These are either objects in the object model or attributes of
objects.
Data Flows − Data flows to or from actors represent operations on or by objects.
Data flows to or from data stores represent queries or updates.
The dynamic model states when the operations are performed, while the functional
model states how they are performed and which arguments are needed. As actors are
active objects, the dynamic model has to specify when it acts. The data stores are
passive objects and they only respond to updates and queries; therefore the dynamic
model need not specify when they act.
Brief History
It was developed in 1990s as an amalgamation of several techniques, prominently
OOAD technique by Grady Booch, OMT (Object Modeling Technique) by James
Rumbaugh, and OOSE (Object Oriented Software Engineering) by Ivar Jacobson. UML
attempted to standardize semantic models, syntactic notations, and diagrams of
OOAD.
Things
Relationships
Diagrams
Things
Relationships
Relationships are the connection between things. The four types of relationships that
can be represented in UML are −
Dependency − This is a semantic relationship between two things such that a
change in one thing brings a change in the other. The former is the independent
thing, while the latter is the dependent thing.
Association − This is a structural relationship that represents a group of links
having common structure and common behavior.
Generalization − This represents a generalization/specialization relationship in
which subclasses inherit structure and behavior from super-classes.
Realization − This is a semantic relationship between two or more classifiers
such that one classifier lays down a contract that the other classifiers ensure to
abide by.
Diagrams
Class Diagram
Object Diagram
Use Case Diagram
Sequence Diagram
Collaboration Diagram
State Chart Diagram
Activity Diagram
Component Diagram
Deployment Diagram
Rules
UML has a number of rules so that the models are semantically self-consistent and
related to other models in the system harmoniously. UML has semantic rules for the
following −
Names
Scope
Visibility
Integrity
Execution
Common Mechanisms
Specifications
Adornments
Common Divisions
Extensibility Mechanisms
Specifications
In UML, behind each graphical notation, there is a textual statement denoting the
syntax and semantics. These are the specifications. The specifications provide a
semantic backplane that contains all the parts of a system and the relationship among
the different paths.
Adornments
Each element in UML has a unique graphical notation. Besides, there are notations to
represent the important aspects of an element like name, scope, visibility, etc.
Common Divisions
Object-oriented systems can be divided in many ways. The two common ways of
division are −
Division of classes and objects − A class is an abstraction of a group of
similar objects. An object is the concrete instance that has actual existence in
the system.
Division of Interface and Implementation − An interface defines the rules for
interaction. Implementation is the concrete realization of the rules defined in the
interface.
Extensibility Mechanisms
Class
A class is represented by a rectangle having three sections −
Object
An object is represented as a rectangle with two sections −
The top section contains the name of the object with the name of the class or
package of which it is an instance of. The name takes the following forms −
o object-name − class-name
o object-name − class-name :: package-name
o class-name − in case of anonymous objects
The bottom section represents the values of the attributes. It takes the form
attribute-name = value.
Sometimes objects are represented using rounded rectangles.
Example − Let us consider an object of the class Circle named c1. We assume that
the center of c1 is at (2, 3) and the radius of c1 is 5. The following figure depicts the
object.
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.
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.
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.
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.
Use case diagrams
Use case diagrams present an outside view of the manner the elements in a system
behave and how they can be used in the context.
Use case diagrams comprise of −
Use cases
Actors
Relationships like dependency, generalization, and association
Use case diagrams are used −
To model the context of a system by enclosing all the activities of a system
within a rectangle and focusing on the actors outside the system by interacting
with it.
To model the requirements of a system from the outside point of view.
Example
Let us consider an Automated Trading House System. We assume the following
features of the system −
The trading house has transactions with two types of customers, individual
customers and corporate customers.
Once the customer places an order, it is processed by the sales department and
the customer is given the bill.
The system allows the manager to manage customer accounts and answer any
queries posted by the customer.
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
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 −
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.
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 −
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
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
Contents
Features
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
public:
Customer() {
c = NULL;
} // assign c as NULL
Current_Account getCurrAc() {
return c;
}
void removeAcc() {
c = NULL;
}
};
public:
Department (/*parameters*/, Manager m) { //m is not NULL
// assign parameters to variables
mgr = m;
}
Manager getMgr() {
return mgr;
}
};
public:
void addDependent ( Dependent d) {
dep.push_back(d);
} // adds an employee to the department
Bi-directional Associations
class Project_Manager {
private:
// attributes
Project pj;
public:
void setProject(Project p);
Project removeProject();
};
class Department {
private:
char * deptName;
list <Employee> emp; //a list of Employees as attribute
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();
};
class WorksOn {
private:
Employee e;
Project p;
Hours h;
char * date;
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
}
In this approach, the states are represented by different values of a data member (or
set of data members). The values are explicitly defined by an enumeration within the
class. The transitions are represented by member functions that change the value of
the concerned data member.
In this approach, the states are arranged in a generalization hierarchy in a manner that
they can be referred by a common pointer variable. The following figure shows a
transformation from state chart diagram to a generalization hierarchy.
Overview of RDBMS
To map a class to a database table, each attribute is represented as a field in the table.
Either an existing attribute(s) is assigned as a primary key or a separate ID field is
added as a primary key. The class may be partitioned horizontally or vertically as per
requirement.
For example, the Circle class can be converted to table as shown in the figure below.
To implement 1:1 associations, the primary key of any one table is assigned as the
foreign key of the other table. For example, consider the association between
Department and Manager −
One–to–Many Associations
To implement 1:N associations, the primary key of the table in the 1-side of the
association is assigned as the foreign key of the table at the N-side of the association.
For example, consider the association between Department and Employee −
Many–to–Many Associations
Unit Testing
In unit testing, the individual classes are tested. It is seen whether the class attributes
are implemented as per design and whether the methods and the interfaces are error-
free. Unit testing is the responsibility of the application engineer who implements the
structure.
Subsystem Testing
This involves testing a particular module or a subsystem and is the responsibility of the
subsystem lead. It involves testing the associations within the subsystem as well as the
interaction of the subsystem with the outside. Subsystem tests can be used as
regression tests for each newly released version of the subsystem.
System Testing
System testing involves testing the system as a whole and is the responsibility of the
quality-assurance team. The team often uses system tests as regression tests when
assembling new releases.
The different types of test cases that can be designed for testing object-oriented
programs are called grey box test cases. Some of the important types of grey box
testing are −
State model based testing − This encompasses state coverage, state transition
coverage, and state transition path coverage.
Use case based testing − Each scenario in each use case is tested.
Class diagram based testing − Each class, derived class, associations, and
aggregations are tested.
Sequence diagram based testing − The methods in the messages in the
sequence diagrams are tested.
Alpha testing − This is carried out by the testing team within the organization
that develops software.
Beta testing − This is carried out by select group of co-operating customers.
Acceptance testing − This is carried out by the customer before accepting the
deliverables.
Quality Assurance
Auditing
Development of standards and guidelines
Production of reports
Review of quality system
Quality Factors
Object-Oriented Metrics
Metrics can be broadly classified into three categories: project metrics, product metrics,
and process metrics.
Project Metrics
Project Metrics enable a software project manager to assess the status and
performance of an ongoing project. The following metrics are appropriate for object-
oriented software projects −
Product Metrics
Product metrics measure the characteristics of the software product that has been
developed. The product metrics suitable for object-oriented systems are −
Methods per Class − It determines the complexity of a class. If all the methods
of a class are assumed to be equally complex, then a class with more methods
is more complex and thus more susceptible to errors.
Inheritance Structure − Systems with several small inheritance lattices are
more well–structured than systems with a single large inheritance lattice. As a
thumb rule, an inheritance tree should not have more than 7 (± 2) number of
levels and the tree should be balanced.
Coupling and Cohesion − Modules having low coupling and high cohesion are
considered to be better designed, as they permit greater reusability and
maintainability.
Response for a Class − It measures the efficiency of the methods that are
called by the instances of the class.
Process Metrics
Process metrics help in measuring how a process is performing. They are collected
over all projects over long periods of time. They are used as indicators for long-term
software process improvements. Some process metrics are −