如何构建模块化应用程序
How to build a modular app
我的应用程序包含大约 10 个不同的组件(聊天、提要、个人资料、设置等)。
我需要能够创建多个应用程序,每个应用程序都包含多个组件。
示例:
- app1 - 将有聊天设置和个人资料。
- app2 - 将有提要和设置。
我应该如何处理这个问题?
我正在考虑将每个组件构建为一个库,然后对于我需要构建的每个应用程序,只需像拼图一样连接各个部分。
这是正确的方法吗?或者谁有更好的建议?
谢谢
您可以开发一个 "SDK" 项目(如 Facebook SDK),其中包含所有组件(聊天、提要、个人资料、用户等),您可以将其 "SDK" 用作库在其他项目中。为该特定应用程序使用您想要的任何组件。
这种方法将使 "SDK" 项目易于维护和升级。当您添加新功能(例如相册)时,您可以将其集成到 "SDK" 项目中并与现有应用程序一起使用。
这种可扩展的模块化设计对于构建更大规模的软件或旨在处理各种未预料到的未来需求的软件通常非常有用,尤其是当您混合使用 bottom-up 方法时。
但是,根据您使用的语言和工具,解决此问题的有效方法会有所不同。
一个尴尬的部分是如何使模块能够在需要时相互通信,以便您可以像乐高积木一样有效地将它们拼凑在一起。这通常会成为一种实际需求,因为您的软件的复杂性会增长到这样一种程度,即通常不再需要简单地将模块彼此完全解耦为孤立的孤岛,并且只有一个 "master" 模块可以与所有模块进行通信。他们。通常您的需求会增长,要求他们开始互相交谈。
例如,如果您使用像 Python 这样的动态脚本语言,那么每个模块都可以轻松发布自己的 public 接口,并且您可以开始让模块相互通信几乎毫不费力。
如果您使用的是编译器和 statically-typed 语言,如 C 或 C++,那么让每个模块发布自己独特的接口(直接导入并供其他人使用)会变得更加尴尬。在那里,您需要让所有模块都可以访问 headers,担心在进行更改时保留 ABI,等等。大量的更改会破坏 ABI 并破坏其他模块,具体取决于特定的接口,所以我们倾向于设计有点不同。
在这种情况下,您几乎总是需要一个包含所有抽象接口的中央软件开发工具包。然后你的模块实现这些接口并仍然相互通信,尽管是间接的(插件 A 与 SDK 接口对话,SDK 接口间接与另一个插件 B 通信)。 SDK 建立了通信的中央总部,将消息从一个模块中继到另一个模块。
我的应用程序包含大约 10 个不同的组件(聊天、提要、个人资料、设置等)。
我需要能够创建多个应用程序,每个应用程序都包含多个组件。
示例:
- app1 - 将有聊天设置和个人资料。
- app2 - 将有提要和设置。
我应该如何处理这个问题?
我正在考虑将每个组件构建为一个库,然后对于我需要构建的每个应用程序,只需像拼图一样连接各个部分。
这是正确的方法吗?或者谁有更好的建议?
谢谢
您可以开发一个 "SDK" 项目(如 Facebook SDK),其中包含所有组件(聊天、提要、个人资料、用户等),您可以将其 "SDK" 用作库在其他项目中。为该特定应用程序使用您想要的任何组件。
这种方法将使 "SDK" 项目易于维护和升级。当您添加新功能(例如相册)时,您可以将其集成到 "SDK" 项目中并与现有应用程序一起使用。
这种可扩展的模块化设计对于构建更大规模的软件或旨在处理各种未预料到的未来需求的软件通常非常有用,尤其是当您混合使用 bottom-up 方法时。
但是,根据您使用的语言和工具,解决此问题的有效方法会有所不同。
一个尴尬的部分是如何使模块能够在需要时相互通信,以便您可以像乐高积木一样有效地将它们拼凑在一起。这通常会成为一种实际需求,因为您的软件的复杂性会增长到这样一种程度,即通常不再需要简单地将模块彼此完全解耦为孤立的孤岛,并且只有一个 "master" 模块可以与所有模块进行通信。他们。通常您的需求会增长,要求他们开始互相交谈。
例如,如果您使用像 Python 这样的动态脚本语言,那么每个模块都可以轻松发布自己的 public 接口,并且您可以开始让模块相互通信几乎毫不费力。
如果您使用的是编译器和 statically-typed 语言,如 C 或 C++,那么让每个模块发布自己独特的接口(直接导入并供其他人使用)会变得更加尴尬。在那里,您需要让所有模块都可以访问 headers,担心在进行更改时保留 ABI,等等。大量的更改会破坏 ABI 并破坏其他模块,具体取决于特定的接口,所以我们倾向于设计有点不同。
在这种情况下,您几乎总是需要一个包含所有抽象接口的中央软件开发工具包。然后你的模块实现这些接口并仍然相互通信,尽管是间接的(插件 A 与 SDK 接口对话,SDK 接口间接与另一个插件 B 通信)。 SDK 建立了通信的中央总部,将消息从一个模块中继到另一个模块。