实现极松耦合的最佳方法是什么?
如果您想将您的软件模块化到如此极端的程度,以至于没有任何部分依赖于系统中的任何其他部分,但它们仍然能够通信,这意味着我们必须使用(与技术无关的)来实现这个目标
请提出建议,将此视为头脑风暴... :)
实现极松耦合的最佳方法是什么?
如果您想将您的软件模块化到如此极端的程度,以至于没有任何部分依赖于系统中的任何其他部分,但它们仍然能够通信,这意味着我们必须使用(与技术无关的)来实现这个目标
请提出建议,将此视为头脑风暴... :)
数据。
如果你想松耦合,答案就是数据。您的程序或组件不会相互“执行功能”,它们会相互传递数据。(在内部,这可能会通过调用一个方法来完成——但抛开机制不谈,从概念上讲,它应该是传递数据)。
如果您的流程中的数据被视为不可变的,那就更好了。
这提供了清晰的组件边界,并在很大程度上保护了您免受更改的影响(因为您可以相对轻松地将一种形式的数据转换为另一种形式)。它还使得传输到多进程或网络应用程序变得容易,因为数据传递的语义在任何地方都是相同的——在不传递一些新数据的情况下,不会假设神奇的隐藏状态发生变化。
传递数据的定义明确的接口,你是金子。我的意思是数据——而不是知道如何做各种神奇事情的“对象”。只是简单、纯粹的数据。
顺便说一句-这并不是说对象在您的程序中没有位置-它们是作用于您的数据的事物。
此外,请确保将处理数据的程序部分与负责实际传输数据的程序部分以及向用户显示数据的部分分开。我知道,这就是“将您的业务逻辑与您的持久性和 UI 层分开”的全部内容。
使用一些域分离的数据格式来实现模块之间的通信或交换信息,如 XML、RPC、HTTP 等。
让不同的团队开发不同的模块,而不让他们互相交谈或协调他们的工作。为他们设定一个目标,即设计一个具有通用接口的统一模块,以便以后在各种系统中以各种角色使用(当然,在模块的功能范围内)。
使用控制反转框架,这样组件就不必知道如何加载它们的依赖项。
我认为您所说的无法实施,即使可以实施,也很难实施,而且优势很少。
模块化可能很好,但也有局限性。当然,您可以设计您的系统,使某些部分依赖于 API,而不是特定的实现,我鼓励这样做,但“绝对没有依赖关系”是一种错觉。“通信”很可能会产生依赖关系。
尝试将软件模块化是件好事,但你走得太远了。
让每个系统将其功能公开为 REST 或 WS-* 接口。
然而,一个更有趣的问题是你什么时候想这样做?您需要从您选择的技术中挤出尽可能多的生产力/性能,这意味着使用特定于技术的解决方案。
实现 100% 模块化可能很难,不值得付出努力。对于应用程序中的类,您可以使用依赖注入和控制反转来松散耦合。
如果您正在谈论一种更加分布式的系统方法,您可以使用 SOAP 或 REST(REST 是技术上最中立的一种),以便每个模块都提供一个合同,但在这种情况下,您将需要某种集中式消息传递/路由系统知道模块的位置及其合约,以便可以调用它们并实现某种标准通信以报告成功/失败,除非当您的模块通信时,您希望它进入黑洞,再也不会被听到:)
请记住,您概括得越多,调试、维护、理解就越困难,如果您的应用程序需要任何类型的性能,这些方法将是您可能做的最慢的事情。
我认为做到这一点的唯一方法是某种形式的“白板”系统,组件在一些通常可访问的区域写下事实,并观察其他组件写下他们的事实。这种架构用于分布式 AI 系统,但我从未听说过使用它们的真实分布式系统。您的组件显然需要同意“白板”消息的格式和实际实现,例如共享内存。