我们能否在系统组件或彼此通信的不同系统之间实现100%的解耦?我认为不可能。如果两个系统相互通信,那么它们之间应该有一定程度的耦合。我是对的吗?
答案 0 :(得分:2)
如果组件100%解耦,则意味着它们不会相互通信。
实际上有different types of coupling。但一般的想法是,如果对象不相互依赖,则不会耦合。
答案 1 :(得分:2)
右。即使您写入接口或协议,您也要承诺。你可以安静地忘记100%去耦,并放心,无论你做什么,你都不能只是抢掉一个组件而不是至少进行少量修改,除非你提交非常基本的协议,如HTTP(甚至然后。)
毕竟,我们人类只是LOOVE标准。这就是为什么我们......好吧,没关系。
答案 2 :(得分:0)
你可以做到这一点。想想通过网络相互通信的两个组件。一个组件可以在Windows上运行,而其他组件在Unix上运行这不是100%脱钩吗?
答案 3 :(得分:0)
至少,来自某个界面的防火墙保护需要允许来自每台机器的流量转到另一台机器。仅这一点就可以被认为是一种“耦合”形式,因此,耦合是通信机器所固有的,至少在一定程度上。
答案 4 :(得分:0)
这可以通过引入两个组件理解而不是直接在组件之间传递数据的通信接口或协议来实现。
答案 5 :(得分:0)
两个互不引用的Web服务可能是100%解耦的一个很好的例子。 然后,耦合将以app util的形式到达,通过使用它们将它们“耦合”在一起。
耦合本身并不是很糟糕,但你必须做出关于何时这样做的可靠判断调用(是仅在实现时,还是在你的框架中?)以及耦合是否合理。
答案 6 :(得分:0)
如果组件设计为100%正交,则应该可以。明确区分关注点可以实现这一目标。所有组件需要知道的是其输入的接口。
耦合应该是单向的:组件知道它们的参数的语义,但应该是彼此不可知的。
只要组件之间有1%的耦合,1%开始增长(在一个持续时间更长的系统中)
然而,通常会在对等组件中注入知识以获得更高的性能。
答案 7 :(得分:0)
即使两个组件没有直接通信,第三个组件使用另外两个组件是系统的一部分,它与它们耦合。
@Vadmyst:如果您的组件通过网络进行通信,则必须使用某种协议,该协议与两个本地组件的接口相同。
答案 8 :(得分:0)
这是一个令人痛苦的抽象问题。如果所述系统是单个应用程序的组件,那么有各种技术,例如涉及MVC(模型视图控制器)和IoC /依赖注入的接口,这些技术有助于组件的解耦。
从物理隔离的软件架构的角度来看,CORBA和COM支持本地或网络互操作,并使用像ATL这样的东西的“共同语言”。这些已经被SOAP等XML服务所弃用,它使用WSDL来执行耦合。没有什么可以阻止SOAP客户端使用WSDL进行运行时延迟耦合,尽管我很少看到它。然后有像JSON这样的东西,比如XML但是经过优化,而Google协议缓冲区则优化了互操作,但通常是预编译而不是后期耦合。
对于IPC(进程间通信),两个系统只需要说一个共同的“协议”。这可以是XML,它可以是共享类库,也可以是专有的。即使在专有级别,您仍然可以通过内存流,TCP / IP网络,共享文件(内存或硬盘)或其他一些机制“耦合”,并且您仍在使用字节,最终使用1和0。
所以最终这个问题真的无法公平回答;严格来说,100%只能通过彼此相互作用的系统来实现。根据具体情况优化您的问题。
答案 9 :(得分:0)
区分直接和间接组件非常重要。努力删除直接连接(一个类引用另一个)并使用间接连接。将两个“无知”类别与第三个类别绑定,以管理它们之间的相互作用。
这就像坐在表单上的一组用户控件,或者数据库连接池和连接池类。更基本的组件(控件和连接)由更高的组件(表单和连接池)管理,但没有基本组件知道另一个组件。基本组件暴露事件和方法,另一个组件“拉动字符串”。
答案 10 :(得分:0)
答案 11 :(得分:0)
很长一段时间考虑API非常困难,然后确保它尽可能小,直到它几乎消失的地方......
Lego Software Process建议这个...... :) - 实际上很好地实现了这个......
如何“紧密耦合”是生物体的两个细胞......?
生物体内的细胞仍然可以通信,但不是通过任何需要任何关于接收(或发送)部分的知识来实现,而是通过将化学物质释放到体内来实现......;)