我目前正忙于重构我的应用程序中的大部分内容。主要目的是尽可能多地去除不同模块之间的依赖关系。我现在偶然发现以下问题:
在我的应用程序中,我有一个定义了接口 IDataProvider 的 GUI 模块。该接口需要由应用程序实现,用于向 GUI 模块“提供数据”。例如,可以给一个数据网格这个 IDataProvider 并使用它来循环所有应该在数据网格中显示的实例,并获取它们的数据。
现在有了另一个模块(实际上还有更多模块),它们都需要类似的东西(比如报告模块、数据库集成模块、数学求解器模块……)。此刻我可以看到两件事我可以做:
- 我可以将 IDataProvider 从 GUI 层移动到更低级别的层,并在所有其他模块中重用相同的接口。
- 这样做的好处是应用程序可以更轻松地使用所有模块(它只需实现一次数据提供程序)。
- 缺点是我在模块和中央 IDataProvider 之间引入了依赖关系。如果有人开始使用一个模块所需的其他方法来扩展 IDataProvider,它也会开始污染其他模块。
- 另一种选择是为每个模块提供自己的数据提供者,如果应用程序想要使用所有模块,则强制应用程序实现所有这些。
- 优点是模块不依赖于公共部分
- 缺点是我最终得到了 IGridDataProvider、IReportDataProvider、IDatabaseDataProvider、ISolverDataProvider。
最好的使用方法是什么?如果所有模块都需要[几乎或完全]相同类型的接口,是否可以让所有模块依赖于相同的公共接口?
如果我使用相同的 IDataProvider 接口,这是否会在未来产生令人讨厌的问题(我目前不知道)?