Coupling can be "low" (also "
loose" and "weak") or "high" (also "tight" and "strong"). Some types of coupling, in order of highest to lowest coupling, are as follows:
Procedural programming A module here refers to a subroutine of any kind, i.e. a set of one or more statements having a name and preferably its own set of variable names. ;Content coupling (high): Content coupling is said to occur when one module uses the code of another module, for instance a branch. This violates
information hiding – a basic software design concept. ;Common coupling: Common coupling is said to occur when several modules have access to the same global data. But it can lead to uncontrolled error propagation and unforeseen side-effects when changes are made. ;External coupling: External coupling occurs when two modules share an externally imposed data format,
communication protocol, or device interface. This is basically related to the communication to external tools and devices. ;Control coupling: Control coupling is one module controlling the flow of another, by passing it information on what to do (e.g., passing a what-to-do flag). ;Stamp coupling (data-structured coupling): Stamp coupling occurs when modules share a composite
data structure and use only parts of it, possibly different parts (e.g., passing a whole record to a function that needs only one field of it). :In this situation, a modification in a field that a module does not need may lead to changing the way the module reads the record. To illustrate the concept of stamp coupling, consider a scenario involving a UserProfile
component. This component is designed to return the entire user profile information in response to
requests, even when
consumers only require a specific
attribute. This practice exemplifies stamp coupling, which can lead to significant
bandwidth issues, especially at scale. When any attribute within the UserProfile component changes, all consumers that interact with it may need to undergo
testing, even if they do not utilize the modified attribute. ;Data coupling: Data coupling occurs when modules share data through, for example, parameters. Each datum is an elementary piece, and these are the only data shared (e.g., passing an integer to a function that computes a square root).
Object-oriented programming ;Subclass coupling: Describes the relationship between a child and its parent. The child is connected to its parent, but the parent is not connected to the child. ;Temporal coupling: It is when two actions are bundled together into one module just because they happen to occur at the same time. In recent work various other coupling concepts have been investigated and used as indicators for different modularization principles used in practice.
Dynamic coupling The goal of defining and measuring this type of coupling is to provide a run-time evaluation of a software system. It has been argued that static coupling metrics lose precision when dealing with an intensive use of dynamic binding or inheritance. In the attempt to solve this issue, dynamic coupling measures have been taken into account.
Semantic coupling This kind of a coupling metric considers the conceptual similarities between software entities using, for example, comments and identifiers and relying on techniques such as
latent semantic indexing (LSI).
Logical coupling Logical coupling (or evolutionary coupling or change coupling) analysis exploits the release history of a software system to find change patterns among modules or classes: e.g., entities that are likely to be changed together or sequences of changes (a change in a class A is always followed by a change in a class B). == Dimensions of coupling ==