2009-08-10 44 views
0

实现极其松散耦合的最佳方法是什么?如何实现软件项目的模块化

如果您想将软件模块化到极端程度,以至于没有任何部件依赖系统中的任何其他部件,但他们仍然能够进行通信,这意味着我们必须使用(技术不可知)来实现这一目标,那么

建议请,认为这是一个脑力激荡... :)

回答

1

数据。

如果你想松耦合,答案是数据。您的程序或组件不会相互“执行功能”,它们会将数据传递给对方。 (在内部,这可能会通过调用一个方法来完成 - 但是除了机制之外,它应该在概念上传递数据)。

如果您的流程中的数据被视为不可变的,甚至更好。

这给出了清晰的组件边界,并在很大程度上保护了对你的改变(因为你可以相对容易地将一种形式的数据转换成另一种形式)。它还可以轻松地转移到多进程或联网应用程序,因为数据传递的语义无处不在 - 没有传递一些新的数据,就不会假设神奇的隐藏状态更改。

定义良好的接口传递数据,你是金。我的意思是数据 - 不是知道如何做各种魔法事物的“对象”。只是简单的纯数据。顺便说一下 - 这并不是说对象在程序中没有位置 - 它们是对您的数据采取行动的事情。

此外,请确保您的程序中处理数据的部分与程序中负责实际穿梭的部分以及将其显示给用户的部分分开。我知道,这就是整个'保持你的业务逻辑与持久性和UI层'分开的东西。

+0

相当辉煌其实:) – 2009-08-13 01:34:22

+0

我不知道这是多么重要之前我开始走下这条道路,我只是想让你知道这是我见过的最重要也是最好的建议。 '辉煌*...! – 2009-09-19 10:15:05

2

使用一些域名独立式数据格式,以使模块之间的通信或交换信息,如XML,RPC,HTTP等。

让不同的团队开发不同的模块而不让他们与每个模块交谈或者协调他们的努力。为他们设定一个目标,即设计一个统一的模块和一个通用接口,以便以后在各种角色的系统(当然,在模块的功能范围内)使用。

1

使用控制反转框架,以便组件不必知道如何加载它们的依赖关系。

+0

不错的。非常酷的想法;) – 2009-08-10 22:06:04

0

我认为做到这一点的唯一方法是采用某种形式的“白板”系统,其中组件在一些可访问的区域记下事实并观察记录事实的其他组件。这种体系结构被用于分布式AI系统,但我从来没有听说过使用它们的真实世界的分布式系统。您的组件显然需要同意“白板”消息的格式和实际的实现,例如共享内存。

1

我认为你提到的内容不能实现,或者即使可以实现,实现起来也很难,而且它没有什么优势。

模块化可以很好,但是有限制。当然,你可以设计你的系统,以便某些部分依赖于API,但不是特定的实现,我鼓励这样做,但“绝对没有依赖”是幻想。 “沟通”很可能会产生依赖关系。

尝试模块化软件是一件好事,但你太过分了。

+0

+1为“通信很可能会创建依赖关系”,但我不同意......;) – 2009-08-10 22:08:21

1

让每个系统都将其功能作为REST或WS- *接口公开。

但是,更有趣的问题是您何时想要这样做?您需要从您选择的技术中挤出尽可能多的生产力/性能,这意味着使用技术特定的解决方案。

0

要100%模块化可能很困难,不值得付出努力。对于应用程序中的类,可以使用依赖注入和控制反转来松散耦合。

如果您正在讨论更分散的系统方法,您可以使用SOAP或REST(REST是技术最中性的),以便每个模块都提供合同,但在这种情况下,您将需要某种类型的集中式消息传递/路由系统,它知道模块在哪里和他们的合同,这样他们就可以被调用,并实现某种标准的通信来报告成功/失败,除非你的模块沟通,你希望它进入黑洞永不再次听到:)

只记得你越一般化,调试,维护,理解越困难,如果你的应用程序需要任何性能的表现,这些方法将是一些最慢的事情,你可以很有可能。