耦合,是程序员面对的最主要的编程问题之一。无数编程技术的诞生其目的就在于为程序解耦。比如面相对象中的多态,解决了对功能的需求与特定实现紧耦合的问题。MVC的框架模式解决了数据与视图紧耦合的问题。工厂设计模式解决了功能使用者与功能提供者紧耦合的问题。MQ解决了请求与答复紧耦合的问题。
耦合原本是机械和电学领域的概念,用以形容多个组件或元件相互影响,相互配合,相互制约。比如传动轴与齿轮的耦合,放大电路和滤波电路的耦合。在工程领域,耦合是利器,是多组件,多模块,多系统之间相互协作的主要办法。耦合在软件领域却表现出了和工程领域不同的特性,除了其带来的协作上的好处以外,耦合最主要的特性就是难以修改。工程领域很少对已存在的事物进行修改和重构,多以更新换代,产出新产品的方式迭代,所以耦合在工程领域不是问题。而软件,是思维的直接产物,没有脱离于人的思维以外的东西可以产出软件(至少目前如此),意思就是,你不能对着一个机器指手画脚就指望它能将你所需要的软件生产出来。所以通过类似工程领域那样每次都制造新产品的方式迭代软件,是不可行的。软件因此面临着在原有基础上不断修改和重构的情形。这时,耦合就变成了一大致命缺陷,它导致你的每一次修改都有牵一发而动全身的效果。而你在面对一个超出自己理解能力的复杂体时,并不能有效的控制这种连带的变化,解耦成为了软件领域的一大核心问题。