3

我们能否在一个系统的组件或相互通信的不同系统之间实现 100% 的解耦?我不认为这是可能的。如果两个系统相互通信,那么它们之间应该存在某种程度的耦合。我对吗?

4

12 回答 12

2

如果组件是 100% 解耦的,则意味着它们之间不相互通信。

实际上有不同类型的耦合。但一般的想法是,如果对象不相互依赖,它们就不是耦合的。

于 2008-09-16T08:52:57.167 回答
2

正确的。即使您写入接口或协议,您也正在致力于某事。您可以平静地忘记 100% 的解耦,并放心,无论您做什么,您都不能随便取出一个组件并在不进行至少小的修改的情况下替换另一个组件,除非您承诺使用非常基本的协议,例如 HTTP(甚至然后。)

毕竟,我们人类只是喜欢标准。这就是为什么我们有......好吧,没关系。

于 2008-09-16T08:56:15.583 回答
0

如果组件设计为 100% 正交,则应该是可能的。清晰的关注点分离可以实现这一点。组件需要知道的只是其输入的接口。

耦合应该是单向的:组件知道其参数的语义,但应该彼此不可知。

一旦组件之间有 1% 的耦合,那 1% 就会开始增长(在一个持续时间更长的系统中)

然而,知识通常被注入到对等组件中以实现更高的性能。

于 2008-09-16T09:00:55.103 回答
0

即使两个组件不直接通信,使用另外两个组件的第三个组件也是系统的一部分,并且与它们耦合。

@Vadmyst:如果您的组件通过网络进行通信,它们必须使用某种协议,该协议与两个本地组件的接口相同。

于 2008-09-16T09:01:24.773 回答
0

这是一个令人痛苦的抽象问题。如果所述系统是单个应用程序的组件,那么有各种技术,例如涉及 MVC(模型视图控制器)和 IoC / 依赖注入接口的技术,可以促进组件的解耦。

从物理隔离软件架构的角度来看,CORBA 和 COM 支持本地或网络互操作,并使用 ATL 之类的“通用语言”。这些已被 XML 服务(例如 SOAP)弃用,后者使用 WSDL 来执行耦合。没有什么可以阻止 SOAP 客户端使用 WSDL 进行运行时延迟耦合,尽管我很少看到它。然后是 JSON 之类的东西,它类似于 XML,但经过优化,还有 Google Protocol Buffers,它优化了互操作,但通常是预编译的,而不是后期耦合的。

当谈到 IPC(进程间通信)时,两个系统只需要说一个通用的“协议”。这可能是 XML,可能是共享类库,也可能是专有的。即使在专有级别,您仍然与内存流、TCP/IP 网络、共享文件(内存或硬盘)或其他一些机制“耦合”,并且您仍在使用字节,最终使用 1 和 0。

所以最终这个问题真的不能公平地回答;严格来说,100% 只有通过相互关联的系统才能实现。将您的问题细化为上下文。

于 2008-09-16T09:02:55.957 回答
0

区分直接成分和间接成分很重要。努力删除直接连接(一个类引用另一个类)并改用间接连接。将两个“无知”类与第三个管理它们的交互的类绑定。

这类似于位于表单上的一组用户控件,或者是一个数据库连接池和一个连接池类。更基本的组件(控件和连接)由更高的部分(表单和连接池)管理,但没有基本组件知道另一个。基本组件公开事件和方法,另一部分“拉弦”。

于 2008-09-16T09:03:56.983 回答
0

不,我们不能。阅读 Joel 的优秀文章The Laws of Leaky Abstraction,让很多人大开眼界。但是,这不一定是坏事,它就是。泄漏抽象提供了很好的机会,因为它们使底层平台可利用。

于 2008-09-16T09:05:09.977 回答
0

你可以做到这一点。想想两个通过网络相互通信的组件。一个组件可以在 Windows 上运行,而另一个在 Unix 上运行。这不是100%脱钩吗?

于 2008-09-16T08:52:09.367 回答
0

至少,防火墙保护,至少来自某个接口,需要允许来自每台机器的流量流向另一台机器。仅此一项就可以被认为是“耦合”的一种形式,因此,耦合是至少在一定程度上进行通信的机器所固有的。

于 2008-09-16T08:53:43.123 回答
0

这可以通过引入两个组件都理解的通信接口或协议而不是在组件之间直接传递数据来实现。

于 2008-09-16T08:54:35.477 回答
0

两个不相互引用的 web 服务可能是 100% 解耦的一个很好的例子。然后,耦合将以应用程序实用程序的形式到达,该应用程序通过同时使用它们来将它们“耦合”在一起。

耦合本质上并不是坏事,但是您必须对何时执行(仅在实现时,还是在您的框架本身中?)以及耦合是否合理做出可靠的判断。

于 2008-09-16T08:56:07.377 回答
0

很长一段时间都非常努力地思考 API,然后确保它尽可能小,直到它几乎消失的地方......

Lego Software Process提出了这一点...... :) - 实际上很好地实现了这一点......

一个有机体的两个细胞有多“紧密耦合”……?

生物体中的细胞仍然可以进行交流,但不是通过任何需要有关接收(或发送)部分知识的方式进行交流,而是通过将化学物质释放到体内来进行交流...;)

于 2009-08-10T18:45:11.163 回答