iOS 应用程序 VIPER 架构 - 有多少数据管理器?
iOS Application VIPER Architecture - how many dataManagers?
我正在 VIPER Architectural pattern -
的上下文中寻找这个问题的答案
如果您的应用程序同时与 web api
和 database
通信,您应该有一个、两个还是三个 dataManagers
?
案例
a) dataManager
b) APIDataManager
和 LocalDataManager
c) dataManager
、APIDataManager
和 LocalDataManager
哪里在
a) interactor
与单个 dataManager
对话,后者与您可能拥有的任何服务(远程或本地)对话。
b) interactor
知道 local
和 remote
信息之间的区别 - 并调用 APIDataManager
或LocalDataManager
,分别与远程和本地服务对话。
c) interactor
只与将军dataManager
对话,将军dataManager
然后与APIDataManager
对话和 LocalDataManager
编辑
可能没有确定的解决方案。但如有任何意见,我们将不胜感激。
无论是 VIPER 还是 The Clean Architecture 都没有规定所有交互者必须只有一个数据管理器。引用的VIPER文章仅以一个manager为例,具体的存储实现被抽象掉了。
交互对象实现特定于应用程序的业务规则。如果应用程序所做的是与服务器对话,然后转身与本地磁盘存储对话,那么交互者知道这一点是完全正常的。更重要的是,一些互动者 有 来管理这个。
不要忘记正常的对象组合规则也适用于交互器。例如,您从一个从服务器获取数据并将其保存到本地存储的交互器开始。如果它变得太大,您可以创建两个新的交互器,一个执行获取,另一个 - 保存到本地存储。然后您的原始交互器将包含这些新交互器并将其所有工作委托给它们。如果您遵循定义边界的规则,在进行提取 class 重构时,您甚至不必更改与新复合交互器一起使用的对象。
另请注意,通常建议不要以 manager 或 controller 结尾的对象命名,因为它们的角色变得不明确.您可以将与服务器通信的接口命名为 APIClient
,将本地存储抽象化的接口命名为 EntityGateway
或 EntityRepository
.
这取决于抽象在您的应用程序中的位置,即区分您做什么和如何做。谁定义有两个不同的数据存储?
如果本地和远程数据存储是问题域本身的一部分(例如,有时问题需要获取远程数据,有时需要获取本地数据),交互者了解这两种不同的数据是明智的数据存储。
如果交互器只关心请求什么数据,而不关心数据是如何检索的,那么由单个数据管理器决定使用哪个数据源是有意义的。
这里有两个不同的角色——业务设计师和数据设计师。交互层负责满足业务设计者的需求,即业务逻辑、问题域等。数据层负责满足数据设计者的需求,即服务器团队、IT团队、数据库团队等。
谁可能会改变您检索数据的位置,业务设计师还是数据设计师?该问题的答案将指导您 class 拥有该责任。
我正在 VIPER Architectural pattern -
的上下文中寻找这个问题的答案如果您的应用程序同时与 web api
和 database
通信,您应该有一个、两个还是三个 dataManagers
?
案例
a) dataManager
b) APIDataManager
和 LocalDataManager
c) dataManager
、APIDataManager
和 LocalDataManager
哪里在
a) interactor
与单个 dataManager
对话,后者与您可能拥有的任何服务(远程或本地)对话。
b) interactor
知道 local
和 remote
信息之间的区别 - 并调用 APIDataManager
或LocalDataManager
,分别与远程和本地服务对话。
c) interactor
只与将军dataManager
对话,将军dataManager
然后与APIDataManager
对话和 LocalDataManager
编辑
可能没有确定的解决方案。但如有任何意见,我们将不胜感激。
无论是 VIPER 还是 The Clean Architecture 都没有规定所有交互者必须只有一个数据管理器。引用的VIPER文章仅以一个manager为例,具体的存储实现被抽象掉了。
交互对象实现特定于应用程序的业务规则。如果应用程序所做的是与服务器对话,然后转身与本地磁盘存储对话,那么交互者知道这一点是完全正常的。更重要的是,一些互动者 有 来管理这个。
不要忘记正常的对象组合规则也适用于交互器。例如,您从一个从服务器获取数据并将其保存到本地存储的交互器开始。如果它变得太大,您可以创建两个新的交互器,一个执行获取,另一个 - 保存到本地存储。然后您的原始交互器将包含这些新交互器并将其所有工作委托给它们。如果您遵循定义边界的规则,在进行提取 class 重构时,您甚至不必更改与新复合交互器一起使用的对象。
另请注意,通常建议不要以 manager 或 controller 结尾的对象命名,因为它们的角色变得不明确.您可以将与服务器通信的接口命名为 APIClient
,将本地存储抽象化的接口命名为 EntityGateway
或 EntityRepository
.
这取决于抽象在您的应用程序中的位置,即区分您做什么和如何做。谁定义有两个不同的数据存储?
如果本地和远程数据存储是问题域本身的一部分(例如,有时问题需要获取远程数据,有时需要获取本地数据),交互者了解这两种不同的数据是明智的数据存储。
如果交互器只关心请求什么数据,而不关心数据是如何检索的,那么由单个数据管理器决定使用哪个数据源是有意义的。
这里有两个不同的角色——业务设计师和数据设计师。交互层负责满足业务设计者的需求,即业务逻辑、问题域等。数据层负责满足数据设计者的需求,即服务器团队、IT团队、数据库团队等。
谁可能会改变您检索数据的位置,业务设计师还是数据设计师?该问题的答案将指导您 class 拥有该责任。