松耦合

优点和缺点

松耦合系统中的组件能够被提供相同服务的替代实现所替换。松耦合系统中的组件不太受相同的平台、语言、操作系统或构建环境的约束。
如果系统在时间上是解耦的，那么也很难提供事务完整性；需要额外的协调协议。跨系统的数据复制提供了松耦合性（可用性），但是造成了维护一致性（数据同步）的问题。

降低耦合的方法

接口的松耦合可以透过发布标准格式的数据(如XML或JSON)来增强。
程序组件之间的松耦合可以透过使用标准数据类型参数来增强。传递自定义数据类型或对象需要组件双方了解自定义数据的定义。
服务的松耦合可以透过减少给服务传入的关键数据的信息来增强。例如，当只有客户标识传入并且客户地址在服务内获取，服务发送一个字母是最可重用的。这将解耦服务，因为服务不需要按特定的顺序调用（如：GetCustomerAddress，SendLetter）

编程

耦合是指一个组件直接了解其他组件的程度。运算中的松耦合解释为封装与无封装。
紧耦合的一个例子发生在依赖类直接包含一个提供所需行为的具体类的指针。在不改变依赖类的情况下，无法替换依赖，或改变“签名”。松耦合发生在依赖类只包含接口的指针，接口可以由一个或多个具体类实现。依赖类只依赖接口指定的“契约”：实现类必须提供的方法和/或属性的定义列表。任何实现了接口的类就可以满足依赖类的依赖而无需修改类。这使得软件设计具有可扩展性；无需改变依赖类，可以编写一个新类实现接口来取代当前的依赖在部分或全部的情况下；新老类可以自由交换。强耦合不允许这样做。
这个UML图说明依赖类和一组提供所需行为的具体类之间的松耦合的例子：
相比之下,这个图表显示了强的替代设计相关类之间的耦合和提供者:

松耦合的其他形式

拥有作为核心模块的函数(参见函数式编程)或函数对象的计算机编程语言提供了松耦合编程的极好的例子。函数式语言拥有延续、闭包或生成器等模式。函数式编程语言的例子参见Clojure和Lisp。Smalltalk和Ruby等面向对象的语言拥有代码块，而Eiffel拥有agent。基本思想是具象化(封装为对象)独立于任何其他封闭概念的函数(例如将对象函数与封闭对象的任何直接知识解耦)。作为头等函数的一种形式，函数作为对象的更进一步知识参见头等函数。
例如，在面向对象的语言中，当对象的一个函数被引用为一个对象（无需了解包含他的宿主对象）时，新的函数对象可以传递，存储，稍后调用。（功能对象交给的）接收对象可以在自己方便的时候安全地执行(调用)所包含的函数，无需了解包含他的宿主对象。透过这种方式，一个程序可以执行功能对象的链或组，而安全地脱离拥有任何包含他们的宿主对象的直接引用。
电话号码是一个极好的类比，很容易说明这种分离的程度。
例如：一些实体为他人提供电话号码来完成一个特定的工作。当号码被调用时，调用者实体实际上说,“请帮我做这项工作。”解耦或松耦合是显而易见的。拿到号码的实体调用时可能并不了解号码从哪儿来的(例如号码提供者的引用)。另一方面，调用者和被调用者之间解耦了，无需知道他们是谁，他们在哪里，调用接收者内部是如何操作的。
将例子更进一步，调用者可能会对接收者说“请为我做这个工作。干完了用这个号码打电话回复我。”提供给接收者的“号码”称为“回调”。同样,这个函数对象的松耦合或分离性质是明显的。回调的接收者不知道调用的是谁。只知道它可以调用，并决定何时调用。在现实中，回调的可能都不是最初的提供者。这种级别的间接使函数对象成为实现松耦合程序的一个优秀技术。