You can read the following article at: http://www.infoq.com/news/2009/04/coupling

Gervas

<<Coupling <http://en.wikipedia.org/wiki/Coupling_%28computer_science%29> is "the degree to which each program module relies on each one of the other modules". Low coupling is typically a sign of a well-design implementation supporting the general goals of high readability and maintainability.

In his new post <http://iansrobinson.com/2009/04/27/temporal-and-behavioural-coupling/> Ian Robinson explores how different distributed systems design approaches - Distributed 3-layer, Command-oriented, Event-oriented and Emergency services - impact two specific types of coupling: temporal and behavioral.

He starts by defining temporal coupling as:



   ... the degree to which the sending and handling of a message are
   connected in time. If a sender is dependent on a receiver being
   available when a message is sent, we have high temporal coupling...
   Processes whose activities are strictly ordered or whose results
   carry forward, leaving subsequent activities unable to start until a
   response to a prior request has been received, are similarly
temporally coupled.
And behavioral coupling as:

   ...the degree to which parties share assumptions regarding
   behaviors, more specifically, to the implications of assigning the
   twin responsibilities for determining what action to execute and how
   to execute that action to the parties in a distributed interaction.
   In systems that exhibit an extremely high degree of behavioral
   coupling, the sender of a message determines what to do, and also
   knows something of how the receiver ought satisfy its request...
   High behavioral coupling requires a provider to evolve its service
offerings in response to changed consumer requirements. When a traditional 3-layer architecture is used for building of distributed systems (*Distributed 3-layer*), it is typically implemented using synchronous interactions (even when asynchronous messaging is used as a transport), typically leading to a high temporal and behavioral coupling. In this case:

   Senders tell receivers what to do; receivers execute the sender's
   orders. Sender and all intermediaries block until the call stack
   unwinds, effectively locking and/or consuming system resources
   further up the call chain. This blocking behavior undermines the
   autonomy of upstream components and at the same time increases the
   availability requirements of downstream components... in these
   circumstances the availability of the overall system can be no more
   than that of the least available participant, and the probability of
   failure is the joint probability of failure in any component or
service. Usage of the *Command-oriented* design typically allows to lower the degree of temporal coupling, especially when asynchronous interactions are used. Coupling can be lowered even further by implementing a "resumable" programming model common for orchestration engines implementations. In this design:

   Senders typically determine what needs to be done, but rely on
   receivers to determine how to execute their instructions. This
   behavioral coupling can require providers to evolve (message
   formats, supported operations) in lockstep with changing consumer
demands. Lowest degree of both temporal and behavioral coupling can be achieved in the case of the *Event-oriented* design, especially when it is coupled with a "resumable" programming model:

   Receivers determine both what needs to be done and how to do it
   based on the content of received messages. Can be difficult to trace
   the execution path of an end-to-end transaction or activity.
   Exposing an "ExtinguishFire" operation is a command-oriented way of
   executing a business process; acting on "FireStarted" notifications
an event-oriented approach. Finally *Emergency services* design is characterized by implementing a set of services, receiving information about what has happened and deciding what to do in any particular situations. This design is characterized by very low behavioral coupling, which allows for the independent evolution of emergency services implementations, but a higher degree of temporal coupling - someone has to be there to react at the given situation. Many RESTful solutions are based on this design.

   URI-templated solutions have a higher degree of behavioral coupling
   than hypermedia-driven solutions (where servers constrain and guide
   what a client can do next, and determine how best to satisfy
   requests); client polling and caching can mitigate some of these
temporal coupling issues. The post provides an interesting analysis of impact of distributed systems design approaches on the coupling of the resulting systems. Unfortunately not all of Ian's conclusions seem to be correct.

When it comes to temporal coupling the answer is quite straightforward - synchronous interactions (not communications) lead to strong temporal coupling, while asynchronous ones lead to low temporal coupling. Because any of the design approaches described in the post allow for use of both, it is not the design approach but rather the interaction used inside design that defines the temporal coupling characteristics of the resulting system.

When it comes to behavioral coupling, the issue becomes slightly more involved. First of all, there are several slightly different definitions of behavioral coupling, for example <http://www.grok-programming.com/2008/09/05/watch-coupling-kill-your-project/>:

   Behavioral coupling is a sub-form of Content Coupling but instead of
   accessing local data within the two pieces of code one module is
restricted because of how another module is implemented (i.e. behaves). If this definition is accepted, then the most common solution <http://www.grok-programming.com/2008/09/05/watch-coupling-kill-your-project/>for the behavioral coupling is an intermediary that shields one of the participants from behavioral effects of the other.Again, such intermediary can be used regardless of the design approach.>>

Reply via email to