If systems are decoupled in time, it is difficult to also provide transactional integrity; additional coordination protocols are required.
Loose coupling in broader distributed system design is achieved by the use of transactions, queues provided by message-oriented middleware, and interoperability standards.
[5] However, overengineered and mispositioned ESBs can also have the contrary effect and create undesired tight coupling and a central architectural hotspot.
[6] Loose coupling of interfaces can be enhanced by publishing data in a standard format (such as XML or JSON).
Loose coupling between program components can be enhanced by using standard data types in parameters.
For comparison, this diagram illustrates the alternative design with strong coupling between the dependent class and a provider:
Object-oriented languages like Smalltalk and Ruby have code blocks, whereas Eiffel has agents.
Phone numbers are an excellent analog and can easily illustrate the degree of this decoupling.
This level of indirection is what makes function objects an excellent technology for achieving loosely coupled programs.
Communication between loosely coupled components may be based on a flora of mechanisms, like the mentioned asynchronous communication style or the synchronous message passing style [7] The degree of the loose coupling can be measured by noting the number of changes in data elements that could occur in the sending or receiving systems and determining if the computers would still continue communicating correctly.