Cohesion With Example
Cohesion With Example
All elements contribute to the execution of one and only one problem-related task
Focussed - strong, single-minded purpose
No elements doing unrelated activities
Communicational Cohesion
Elements contribute to activities that use the same input or output data
Not flexible, for example, if we need to focus on some activities and not the others
Possible links that cause activities to affect each other
Better to split to functional cohesive ones
Example of Communicational Cohesion
module determine customer details
use customer account no
find customer name
find customer loan balance
return customer name, loan balance
Procedural cohesion
Elements are related only by sequence, otherwise the activities are unrelated
Similar to sequential cohesion, except for the fact that elements are unrelated
Commonly found at the top of hierarchy, such as the main program module
Example of Procedural Cohesion
module write read and edit something
use out record
write out record
read in record
pad numeric fields with zeros
return in record
Temporal cohesion
Elements are involved in activities that are related in time
Commonly found in initialisation and termination modules
Elements are basically unrelated, so the module will be difficult to reuse
Good practice is to initialise as late as possible and terminate as early as possible
Example of Temporal Cohesion
module initialize
set counter to 0
open student file
clear error message variable
initialize array
Logical cohesion
Elements contribute to activities of the same general category (type)
For example, a report module, display module or I/O module
Usually have control coupling, since one of the activities will be selected
Example of Logical Cohesion
module display record
use record-type, record
Coincidental cohesion
Elements contribute to activities with no meaningful relationship to one another
Similar to logical cohesion, except the activities may not even be the same type
Mixture of activities - like ‘rojak’!
Difficult to understand and maintain, with strong possibilities of causing ‘side
effects’ every time the module is modified
Example of Coincidental Cohesion
module miscellaneous functions
use customer record
display customer record
calculate total sales
read transaction record
return transaction record
In object-oriented programming, if the methods that serve a class tend to be similar in many
aspects, then the class is said to have high cohesion. [4] In a highly cohesive system, code
readability and reusability is increased, while complexity is kept manageable.
Cohesion
The functionalities embedded in a class, accessed through its methods, have much
in common.
Methods carry out a small number of related activities, by avoiding coarsely
grained or unrelated sets of data.
Related methods are in the same source file or otherwise grouped together; for
example, in separate files but in the same sub-directory/folder.
Advantages of high cohesion (or "strong cohesion") are:
Types of cohesion[edit]
Cohesion is a qualitative measure, meaning that the source code to be measured is examined
using a rubric to determine a classification. Cohesion types, from the worst to the best, are as
follows:
Coincidental cohesion (worst)
Coincidental cohesion is when parts of a module are grouped arbitrarily; the only
relationship between the parts is that they have been grouped together (e.g., a “Utilities”
class). Example:
/*
Groups: The function definitions
Parts: The terms on each function
*/
Module A{
/*
Implementation of r(x) = 5x + 3
There is no particular reason to group functions in this way,
so the module is said to have Coincidental Cohesion.
*/
r(x) = a(x) + b(x)
a(x) = 2x + 1
b(x) = 3x + 2
}
Logical cohesion
Logical cohesion is when parts of a module are grouped because they are logically
categorized to do the same thing even though they are different by nature (e.g., grouping
all mouse and keyboard input handling routines or bundling all models, views, and
controllers in separate folders in an MVC pattern).
Temporal cohesion
Temporal cohesion is when parts of a module are grouped by when they are processed -
the parts are processed at a particular time in program execution (e.g., a function which
is called after catching an exception which closes open files, creates an error log, and
notifies the user).
Procedural cohesion
Procedural cohesion is when parts of a module are grouped because they always follow
a certain sequence of execution (e.g., a function which checks file permissions and then
opens the file).
Communicational/informational cohesion
Communicational cohesion is when parts of a module are grouped because they operate
on the same data (e.g., a module which operates on the same record of information).
Sequential cohesion
Sequential cohesion is when parts of a module are grouped because the output from one
part is the input to another part like an assembly line (e.g., a function which reads data
from a file and processes the data).
Functional cohesion (best)
Functional cohesion is when parts of a module are grouped because they all contribute to
a single well-defined task of the module (e.g., Lexical analysis of an XML string).
Example:
/*
Groups: The function definitions
Parts: The terms on each function
*/
Module A {
/*
Implementation of arithmetic operations
This module is said to have functional cohesion because
there is an intention to group simple arithmetic operations
on it.
*/
a(x, y) = x + y
b(x, y) = x * y
}
Module B {
/*
Module B: Implements r(x) = 5x + 3
This module can be said to have atomic cohesion. The whole
system (with Modules A and B as parts) can also be said to have
functional
cohesion, because its parts both have specific separate purposes.
*/
r(x) = [Module A].a([Module A].b(5, x), 3)
}
/*
Groups: The function definitions
Parts: The terms on each function
*/
Module A {
/*
Implementation of r(x) = 2x + 1 + 3x + 2
It's said to have perfect cohesion because it cannot be reduced any
more than that.
*/
r(x) = 5x + 3
}