Object-Oriented Design Fundamentals
Object-Oriented Design Fundamentals
By, Anjana V
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
• In the object-oriented design method, the system is viewed as a collection of
objects (i.e., entities).
• The state is distributed among the objects, and each object handles its state
data.
• For example, in a Library Automation Software, each library representative may
be a separate object with its data and functions to operate on these data.
• The tasks defined for one purpose cannot refer or change data of other objects.
Objects have their internal data which represent their state.
• Similar objects create a class.
• In other words, each object is a member of some class. Classes may inherit
features from the superclass.
• The focus is on capturing the structure and behavior of information systems into
small modules that combines both data and process.
• The main aim of Object Oriented Design (OOD) is to improve the quality and
productivity of system analysis and design by making it more usable.
• In analysis phase, OO models are used to fill the gap between problem and
solution.
• It performs well in situation where systems are undergoing continuous design,
adaption, and maintenance.
• It identifies the objects in problem domain, classifying them in terms of data and
behavior.
1. Objects
All entities involved in the solution design are known as objects. For example,
person, banks, company, and users are considered as objects. Every entity has
some attributes associated with it and has some methods to perform on the
attributes.
2. Classes
3. Messages
4. Abstraction
In object-oriented design, complexity is handled using abstraction. Abstraction is
the removal of the irrelevant and the amplification of the essential
5. Encapsulation
6. Inheritance
OOD allows similar classes to stack up in a hierarchical manner where the lower
or sub-classes can import, implement, and re-use allowed variables and
functions from their immediate [Link] property of OOD is called an
inheritance. This makes it easier to define a specific class and to create
generalized classes from specific ones.
7. Polymorphism
Benefits of OO Model
• It facilitates changes in the system at low cost.
• It promotes the reuse of components.
• It simplifies the problem of integrating components to configure large system.
• It simplifies the design of distributed systems.
Modularization
• Modularization is the process of dividing a software system into multiple
independent modules where each module works independently.
• There are many advantages of Modularization in software engineering.
▪ Easy to understand the system.
▪ System maintenance is easy.
▪ A module can be used many times as their requirements. No need to
write it again and again.
Coupling
• Coupling is the measure of the degree of interdependence between the modules.
• Two modules that are tightly coupled are strongly dependent on each other.
• However, two modules that are loosely coupled are not dependent on each
other.
• Uncoupled modules have no interdependence at all within them.
• A good software will have low coupling.
1. No direct Coupling
2. Data Coupling
• When data of one module is passed to another module, this is called data
coupling.
• In data coupling, the components are independent to each other and communicating
through data.
• Module communications don’t contain tramp data.
• Example-customer billing system.
3. Stamp Coupling
• Two modules are stamp coupled if they communicate using composite data
items such as structure, objects, etc.
• When the module passes non-global data structure or entire structure to another
module, they are said to be stamp coupled.
• For example, passing structure variable in C or object in C++ language to a
module.
4. Control Coupling
• Control Coupling exists among two modules if data from one module is used to
direct the structure of instruction execution in another.
• It can be bad if parameters indicate completely different behavior and good if parameters
allow factoring and reuse of functionality.
• Example- sort function that takes comparison function as an argument.
5. External Coupling
• External Coupling arises when two modules share an externally imposed data
format, communication protocols, or device interface.
• This is related to communication to external tools and devices.
6. Common Coupling
• Two modules are common coupled if they share information through some global
data items.
• The changes in global data mean tracing back to all modules which access that data to
evaluate the effect of the change.
• So it has got disadvantages like difficulty in reusing modules, reduced ability to control
data accesses and reduced maintainability.
7. Content Coupling
• Content Coupling exists among two modules if they share code, e.g., a branch
from one module into another module.
• This is the worst form of coupling and should be avoided.
Cohesion
• cohesion defines to the degree to which the elements of a module belong
together.
• Thus, cohesion measures the strength of relationships between pieces of
functionality within a given module.
• For example, in highly cohesive systems, functionality is strongly related.
• Basically, cohesion is the internal glue that keeps the module together.
• Cohesion is an ordinal type of measurement and is generally described as "high
cohesion" or "low cohesion."
• A good software design will have high cohesion.
Types of Modules Cohesion
1. Functional Cohesion
2. Sequential Cohesion
3. Communication Cohesion
• A module is said to have communicational cohesion, if all tasks of the module
refer to or update the same data structure.
• e.g., the set of functions defined on an array or a stack.
4. Procedural Cohesion
5. Temporal Cohesion
• When a module includes functions that are associated by the fact that all the
methods must be executed in the same time, the module is said to exhibit
temporal cohesion.
• This cohesion contains the code for initializing all the parts of the system.
• Lots of different activities occur, all at init time.
6. Logical Cohesion
7. Coincidental Cohesion
Coupling shows the relationships Cohesion shows the relationship within the module.
between modules.
While creating, you should aim While creating you should aim for high cohesion, i.e., a
for low coupling, i.e., cohesive component/ module focuses on a single
dependency among modules function (i.e., single-mindedness) with little interaction
should be less. with other modules of the system.
In coupling, modules are linked In cohesion, the module focuses on a single thing.
to the other modules.
By, Minsha
Functional independence
A module having high cohesion and low coupling is said to be functionally independent of other
modules. By the term functional independence, we mean that a cohesive module performs a single
task or function. A functionally independent module has minimal interaction with other modules.
Error isolation: Functional independence reduces error propagation. The reason behind this
is that if a module is functionally independent, its degree of interaction with the other
modules is less. Therefore, any error existing in a module would not directly effect the other
modules.
Scope of reuse: Reuse of a module becomes possible. Because each module does some well-
defined and precise function, and the interaction of the module with the other modules is
simple and minimal. Therefore, a cohesive module can be easily taken out and reused in a
different program.
Understandability: Complexity of the design is reduced, because different modules can be
understood in isolation as modules are more or less independent of each other.
Unified Modeling Language (UML)
UML is a general purpose modelling language. The main aim of UML is to define a standard
way to visualize the way a system has been designed. It is quite similar to blueprints used in
other fields of engineering.
• UML is not a programming language, it is rather a visual language.
• UML is linked with object oriented design and analysis. UML makes the use of elements
and forms associations between them to form diagrams.
1. Class Diagram – The most widely use UML diagram is the class diagram.
It is the building block of all object oriented software systems
2. Composite Structure Diagram – We use composite structure diagrams
to represent the internal structure of a class and its interaction points
with other parts of the system.
3. Object Diagram – An Object Diagram can be referred to as a screenshot
of the instances in a system and the relationship that exists between
them.
4. Component Diagram – Component diagrams are used to represent the
how the physical components in a system have been organized. We use
them for modelling implementation details.
5. Deployment Diagram – Deployment Diagrams are used to represent
system hardware and its software.
6. Package Diagram – We use Package Diagrams to depict how packages
and their elements have been organized.
Behavior Diagrams
1. State Machine Diagrams – A state diagram is used to represent the
condition of the system or part of the system at finite instances of time.
2. Activity Diagrams – We use Activity Diagrams to illustrate the flow of
control in a system.
3. Use Case Diagrams – Use Case Diagrams are used to depict the
functionality of a system or a part of a system.
4. Sequence Diagram – A sequence diagram simply depicts interaction
between objects in a sequential order i.e. the order in which these
interactions take place.
5. Communication Diagram – A Communication Diagram(known as
Collaboration Diagram in UML 1.x) is used to show sequenced
messages exchanged between objects.
6. Interaction Overview Diagram – An Interaction Overview Diagram
models a sequence of actions and helps us simplify complex
interactions into simpler occurrences.
7. Timing Diagram – Timing Diagram are a special form of Sequence
diagrams which are used to depict the behavior of objects over a time
frame.
Use-Case Model
A use-case model is a model of how different types of users
interact with the system to solve a problem. As such, it describes the goals of the
users, the interactions between the users and the system, and the required
behavior of the system in satisfying these goals.
The use-case model may contain packages that are used to structure the model to
simplify analysis, communications, navigation, development, maintenance and
planning.
Actor
A model element representing each actor. Properties include the actors name and
brief description. See Concept: Actor for more information.
Use Case
A model element representing each use case. Properties include the use case
name and use case specification. See Artifact: Use Case and Concept: Use Case for
more information.
Associations
Associations are used to describe the relationships between actors and the use
cases they participate in. This relationship is commonly known as a
“communicates-association”.
Subject
A model element that represents the boundary of the system of interest.
Use-Case Package
A model element used to structure the use case model to simplify analysis,
communications, navigation, and planning. If there are many use cases or actors,
you can use use-case packages to further structure the use-case model in much
the same manner you use folders or directories to structure the information on
your hard-disk.
You can partition a use-case model into use-case packages for several reasons,
including:
To reflect the order, configuration, or delivery units in the finished system thus
supporting iteration planning.
Generalizations
A relationship between actors to support re-use of common properties.
By, Denson C Lona
UML
A UML diagram is a diagram based on the UML (Unified Modeling Language)
with the purpose of visually representing a system along with its main actors, roles,
actions, artifacts or classes, in order to better understand, alter, maintain, or
document information about the system
UML is an acronym that stands for Unified Modeling Language. Simply put, UML
is a modern approach to modeling and documenting software. In fact, it’s one of
the most popular business process modeling techniques.
class diagram
Class UML diagram is the most common diagram type for software
documentation. Since most software being created nowadays is still based on
the Object-Oriented Programming paradigm, using class diagrams to document the
software turns out to be a common-sense solution. This happens because OOP is
based on classes and the relations between them.
In a nutshell, class diagrams contain classes, alongside with their attributes (also
referred to as data fields) and their behaviors (also referred to as member
functions). More specifically, each class has 3 fields: the class name at the top, the
class attributes right below the name, the class operations/behaviors at the bottom.
The relation between different classes (represented by a connecting line), makes up
a class diagram.
Class diagrams are the most popular UML diagrams used for construction of
software applications. It is very important to learn the drawing procedure of class
diagram.
Class diagrams have a lot of properties to consider while drawing but here the
diagram will be considered from a top level view.
Class diagram is basically a graphical representation of the static view of the
system and represents different aspects of the application. A collection of class
diagrams represent the whole system.
The following points should be remembered while drawing a class diagram −
• The name of the class diagram should be meaningful to describe the aspect
of the system.
• Each element and their relationships should be identified in advance.
• Responsibility (attributes and methods) of each class should be clearly
identified
• For each class, minimum number of properties should be specified, as
unnecessary properties will make the diagram complicated.
• Use notes whenever required to describe some aspect of the diagram. At the
end of the drawing it should be understandable to the developer/coder.
• Finally, before making the final version, the diagram should be drawn on
plain paper and reworked as many times as possible to make it correct.
The following diagram is an example of an Order System of an application. It
describes a particular aspect of the entire application.
• First of all, Order and Customer are identified as the two elements of the
system. They have a one-to-many relationship because a customer can have
multiple orders.
• Order class is an abstract class and it has two concrete classes (inheritance
relationship) SpecialOrder and NormalOrder.
• The two inherited classes have all the properties as the Order class. In
addition, they have additional functions like dispatch () and receive ().
The following class diagram has been drawn considering all the points mentioned
above.
Interaction diagram
From the term Interaction, it is clear that the diagram is used to describe some
type of interactions among the different elements in the model. This interaction is
a part of dynamic behavior of the system.
This interactive behavior is represented in UML by two diagrams known
as Sequence diagram and Collaboration diagram. The basic purpose of both the
diagrams are similar.
Sequence diagram emphasizes on time sequence of messages and collaboration
diagram emphasizes on the structural organization of the objects that send and
receive messages.
Purpose of Interaction Diagrams
Figure – transition
State – We use a rounded rectangle to represent a state. A state represents the conditions or
1
Figure – a diagram using the fork notation
Join – We use a rounded solid rectangular bar to represent a Join notation with incoming arrows
from the joining states and outgoing arrow towards the common goal state. We use the join
notation when two or more states concurrently converge into one on the occurrence of an
event or events.
2
Figure – a state with internal activities
Final state – We use a filled circle within a circle notation to represent the final state in a state
machine diagram.
varification
Deployment diagram
Deployment diagrams are used to visualize the topology of the physical components of a
system, where the software components are deployed.
Deployment diagrams are used to describe the static deployment view of a system.
Deployment diagrams consist of nodes and their relationships
The purpose of deployment diagrams can be described as −
3
• Scalability
• Maintainability
• Portability.
Here, we have shown nodes as −Monitor,Modem,Caching server,Server.
The application is assumed to be a web-based application, which is deployed in a
clustered environment using server 1, server 2, and server 3. The user connects to
the application using the Internet. The control flows from the caching server to the
clustered environment.
The following deployment diagram has been drawn considering all the points
mentioned above.
4
✓ Remember that DFD is not a flow chart. Arrows is a flow chart that represents the
order of events; arrows in DFD represents flowing data. A DFD does not involve any
order of events.
✓ Suppress logical decisions. If we ever have the urge to draw a diamond-shaped box
in a DFD, suppress that urge! A diamond-shaped box is used in flow charts to
represents decision points with multiple exists paths of which the only one is taken.
This implies an ordering of events, which makes no sense in a DFD.
✓ Do not become bogged down with details. Defer error conditions and error handling
until the end of the analysis.
Level 0 or Context diagram--a basic overview of the system in general terms. It includes
all components of the system. Usually presented to a broad audience — such as customers,
analysts, and developers;
Level 1 -- slightly more detailed version of Level 0. It can be dedicated to the depiction of
specific elements of the system. The difference is in the breaking down of the items into sub-
elements.
5
Level 2 --further detailing of the processes. It can relate to particular
[Link] supplemented with extensive commentary to clarify individual bits;
Level 3-- and beyond is further elaboration. It can be applied to specify a particular process
through and through.
6
By, Mohamed Ajmal
REUSABILITY
Reusability is the use of existing assets in some form within the software product development
process; these assets are products and by-products of the software development life cycle and include
code, software components, test suites, designs and documentation.
INTEROPERABILITY
Interoperability is the property that allows for the unrestricted sharing of resources between
different systems. Approaches to improving or achieving interoperability include conducting
compatibility tests, engineering products with a common standard and using the same technology, coding
language or syntax across multiple systems when appropriate.
PORTABILITY
Portability in high-level computer programming is the usability of the same software in different
environments. The pre requirement for portability is the generalized abstraction between the application
logic and system interfaces. When software with the same functionality is produced for several computing
platforms, portability is the key issue for development cost reduction.
1. The abstraction level: At this level, we don’t reuse software directly but rather use knowledge of
successful abstractions in the design of your software.
2. The object level: At this level, we directly reuse objects from a library rather than writing the code
yourself. To implement this type of reuse, we have to find appropriate libraries and discover if the
objects and methods offer the functionality that you need.
3. The component level: Components are collections of objects and object classes that operate
together to provide related functions and services. We often have to adapt and extend the
component by adding some code of your own
4. The system level: At this level, you reuse entire application systems. This function usually involves
some kind of configuration of these systems. This may be done by adding and modifying code (if
reusing a software product line) or by using the system’s own configuration interface.
REUSE-BASED SOFTWARE ENGINEERING
● Application system reuse
The whole of an application system may be reused either by incorporating it without
change into other systems (COTS reuse) or by developing application families.
● Component reuse
Components of an application from sub-systems to single objects may be reused.
● Function reuse
Software components that implement a single well-defined function may be reused.
REUSE PRACTICE
● Application system reuse
Widely practised as software systems are implemented as application families. COTS
reuse is becoming increasingly common.
● Component reuse
Now seen as the key to effective and widespread reuse through component-based
software engineering. However, it is still relatively immature
● Function reuse
Common in some application domains (e.g. engineering) where domain-specific libraries
of reusable functions have been established
BENEFITS OF REUSE
● Increased reliability
Components exercised in working systems
● Reduced process risk
Less uncertainty in development costs
● Effective use of specialists
Reuse components instead of people
● Standards compliance
Embed standards in reusable components
● Accelerated development
Avoid original development and hence speed-up production
REUSE PROBLEMS
● Increased maintenance costs
● Lack of tool support
● Not-invented-here syndrome
● Maintaining a component library
● Finding and adapting reusable components
By, Limitha
Component-Level Design in software engineering
As soon as the first iteration of architectural design is complete, component-level design takes place. The
objective of this design is to transform the design model into functional software. To achieve this
objective, the component-level design represents -the internal data structures and processing details of all
the software components (defined during architectural design) at an abstraction level, closer to the actual
code. In addition, it specifies an interface that may be used to access the functionality of all the software
components.
The component-level design can be represented by using different approaches. One approach is to use a
programming language while other is to use some intermediate design notation such as graphical (DFD,
flowchart, or structure chart), tabular (decision table), or text-based (program design language) whichever
is easier to be translated into source code.
The component-level design provides a way to determine whether the defined algorithms, data structures,
and interfaces will work properly. Note that a component (also known as module) can be defined as a
modular building block for the software. However, the meaning of component differs according to how
software engineers use it. The modular design of the software should exhibit the following sets of
properties.
Provide simple interface: Simple interfaces decrease the number of interactions. Note that the number of
interactions is taken into account while determining whether the software performs the desired function.
Simple interfaces also provide support for reusability of components which reduces the cost to a greater
extent. It not only decreases the time involved in design, coding, and testing but the overall software
development cost is also liquidated gradually with several projects. A number of studies so far have
proven that the reusability of software design is the most valuable way of reducing the cost involved in
software development.
Ensure information hiding: The benefits of modularity cannot be achieved merely by decomposing a
program into several modules; rather each module should be designed and developed in such a way that
the information hiding is ensured. It implies that the implementation details of one module should not be
visible to other modules of the program. The concept of information hiding helps in reducing the cost of
subsequent design changes.
Modularity has become an accepted approach in every engineering discipline. With the introduction of
modular design, complexity of software design has considerably reduced; change in the program is
facilitated that has encouraged parallel development of systems. To achieve effective modularity, design
concepts like functional independence are considered to be very important.
Functional Independence
Functional independence is the refined form of the design concepts of modularity, abstraction, and
information hiding. Functional independence is achieved by developing a module in such a way that it
uniquely performs given sets of function without interacting with other parts of the system. The software
that uses the property of functional independence is easier to develop because its functions can be
categorized in a systematic manner. Moreover, independent modules require less maintenance and testing
activity, as secondary effects caused by design modification are limited with less propagation of errors. In
short, it can be said that functional independence is the key to a good software design and a good design
results in high-quality software. There exist two qualitative criteria for measuring functional
independence, namely, coupling and cohesion.
Coupling
Coupling measures the degree of interdependence among the modules. Several factors like interface
complexity, type of data that pass across the interface, type of communication, number of interfaces per
module, etc. influence the strength of coupling between two modules. For better interface and well-
structured system, the modules should be loosely coupled in order to minimize the 'ripple effect' in which
modifications in one module results in errors in other modules. Module coupling is categorized into the
following types.
No direct coupling: Two modules are said to be 'no direct coupled' if they are independent of each other.
Data coupling: Two modules are said to be 'data coupled' if they use parameter list to pass data items for
communication.
Stamp coupling: Two modules are said to be 'stamp coupled' if they communicate by passing a data
structure that stores additional information than what is required to perform their functions.
Control coupling: Two modules are said to be 'control coupled' if they communicate (pass a piece of
information intended to control the internal logic) using at least one 'control flag'. The control flag is a
variable whose value is used by the dependent modules to make decisions.
Control Coupling
Content coupling: Two modules are said to be 'content coupled' if one module modifies data of some
other module or one module is under the control of another module or one module branches into the
middle of another module.
Common coupling: Two modules are said to be 'common coupled' if they both reference a common data
block.
Cohesion
Cohesion measures the relative functional strength of a module. It represents the strength of bond between
the internal elements of the modules. The tighter the elements are bound to each other, the higher will be
the cohesion of a module. In practice, designers should avoid a low level of cohesion when designing a
module. Generally, low coupling results in high cohesion and vice versa.
Functional cohesion: In this, the elements within the modules are concerned with the execution of a single
function.
Sequential cohesion: In this, the elements within the modules are involved in activities in such a way that
the output from one activity becomes the input for the next activity.
Communicational cohesion: In this, the elements within the modules perform different functions, yet each
function references the same input or output information.
Procedural cohesion: In this, the elements within the modules are involved in different and possibly
unrelated activities.
Temporal cohesion: In this, the elements within the modules contain unrelated activities that can be
carried out at the same time.
Logical cohesion: In this, the elements within the modules perform similar activities, which are executed
from outside the module.
Coincidental cohesion: In this, the elements within the modules perform activities with no meaningful
relationship to one another.
Types of Cohesion
After having discussed various types of cohesions, the procedure which can be used in determining the
types of module cohesion for software design.
Designing Class based components, traditional Components
An individual software component is a software package, a web service, a web resource, or a module that
encapsulates a set of related functions (or data).
All system processes are placed into separate components so that all of the data and functions inside each
component are semantically related (just as with the contents of classes). Because of this principle, it is
often said that components are modular and cohesive.
With regard to system-wide co-ordination, components communicate with each other via interfaces.
When a component offers services to the rest of the system, it adopts a provided interface that specifies
the services that other components can utilize, and how they can do so. This interface can be seen as a
signature of the component - the client does not need to know about the inner workings of the component
(implementation) in order to make use of it. This principle results in components referred to as
encapsulated. The UML illustrations within this article represent provided interfaces by a lollipop-symbol
attached to the outer edge of the component.
However, when a component needs to use another component in order to function, it adopts a used
interface that specifies the services that it needs. In the UML illustrations in this article, used interfaces
are represented by an open socket symbol attached to the outer edge of the component.
Another important attribute of components is that they are substitutable, so that a component can replace
another (at design time or run-time), if the successor component meets the requirements of the initial
component (expressed via the interfaces). Consequently, components can be replaced with either an
updated version or an alternative without breaking the system in which the component operates.
As a general rule of thumb for engineers substituting components, component B can immediately replace
component A, if component B provides at least what component A provided and uses no more than what
component A used.
Software components often take the form of objects (not classes) or collections of objects (from object-
oriented programming), in some binary or textual form, adhering to some interface description language
(IDL) so that the component may exist autonomously from other components in a computer.
When a component is to be accessed or shared across execution contexts or network links, techniques
such as serialization or marshalling are often employed to deliver the component to its destination.
By, Sajil
COMPONENT BASED DEVELOPMENT
Definition -
Component-based development (CBD) is a procedure that accentuates the design and development of
computer-based systems with the help of reusable software components. With CBD, the focus shifts
from software programming to software system composing.
Save time and money when building large and complex systems: Developing complex software systems
with the help of off-the-shelf components helps reduce software development time substantially.
Function points or similar techniques can be used to verify the affordability of the existing method.
Enhance the software quality: The component quality is the key factor behind the enhancement of
software quality.
Detect defects within the systems: The CBD strategy supports fault detection by testing the components;
however, finding the source of defects is challenging in CBD.
Minimized delivery:
Improved efficiency:
Improved quality:
- Minimized expenditures
1
Component development
Component publishing
Component analysis
Component assembly
Text-Based User Interface : This method relies primarily on the keyboard. A typical example of this is
UNIX.
Advantages
Disadvantages
Graphical User Interface (GUI) : GUI relies much more heavily on the mouse. A typical example of this
type of interface is any versions of the Windows operating systems.
GUI Characteristics
2
Characteristics Descriptions
Advantages
Easier to Navigate and can look through folders quickly in a guess and check manner.
The user may switch quickly from one task to another and can interact with several different
applications.
Disadvantages
Usually less customizable. Not easy to use one button for tons of different variations.
3
UI Design Principles
Structure: Design should organize the user interface purposefully, in the meaningful and usual based on
precise, consistent models that are apparent and recognizable to users, putting related things together
and separating unrelated things, differentiating dissimilar things and making similar things resemble one
another. The structure principle is concerned with overall user interface architecture.
Simplicity: The design should make the simple, common task easy, communicating clearly and directly in
the user's language, and providing good shortcuts that are meaningfully related to longer procedures.
Visibility: The design should make all required options and materials for a given function visible without
distracting the user with extraneous or redundant data.
Feedback: The design should keep users informed of actions or interpretation, changes of state or
condition, and bugs or exceptions that are relevant and of interest to the user through clear, concise,
and unambiguous language familiar to users.
Tolerance: The design should be flexible and tolerant, decreasing the cost of errors and misuse by
allowing undoing and redoing while also preventing bugs wherever possible by tolerating varied inputs
and sequences and by interpreting all reasonable actions.
Commercial off-the-shelf(COTS)
Short for commercial off-the-shelf, an adjective that describes software or hardware products that are
ready-made and available for sale to the general public. For example, Microsoft Office is a COTS product
that is a packaged software solution for businesses. COTS products are designed to be implemented
easily into existing systems without the need for customization.
4
COTS software is usually less expensive than custom created software. This is because many such
packages are designed to be used by millions of users worldwide. Since a lot of time and effort has been
put into creating such software.
Another point is COTS software is usually very reliable. Developers of COTS components conduct
research into the most common types of business processes or problems solving techniques and
compress them into software packages that can be used across the board.
It is important to note that any software product that is bought as an “out of the box” product is COTS.
Inexpensive examples, like word processing or tax return software are easy to find and purchase from
retail stores.
COTS applications are easy to install, with instructions contained in the package that encloses the COTS
product. An electronic copy of the instructions is also usually included on the disc that contains the
installation files and resources and in several languages to boot.
Even though companies can make do with freeware or open source software, it is often a requirement
on their part to ensure that majority of the applications they rely on are COTS products. This is because,
other than having installation instructions, most of the COTS applications have a customer care section
that aids any organization that has bought their product.
When a problem is discovered with the COTS product, it will be usually taken care of using a patch, or
fix. A patch will cover the reported defect(s) that may make the product vulnerable to hackers or
operate incorrectly. A “fix”, on the other hand, usually addresses a small issue that gets in the way of
normal operation of the product.
When a COTS product is redesigned in any way to meet a specific user’s needs, it is sometimes called a
modified off-the shelf (MOTS) product. Unlike COTS software, MOTS is often accompanied with
modifiable source code that allows the owner, if they have enough knowledge, to change the product to
their choosing.
Usually, if a strictly COTS product is modified from the original version, that act “voids” any warranty
from the developing organization and so maintenance is left to the user. Any patches or fixes that may
not work are no longer the developer organization’s problems.