【发布时间】:2020-06-18 14:26:29
【问题描述】:
Clean Architecture 中的数据转换周期对我来说并不完全清楚。
Datasource 从本地/外部源接收原始数据,对其进行解析并返回 DTO。
Repository 使用 Mapper 从该数据创建域模型并返回到 UseCase。
但是 UseCase 返回 View 的数据类型是什么?
如果域模型包含一些复杂的逻辑 - 业务规则检查,一些方法等等 - View 不需要。存储这些对象的数组是不必要的性能浪费。
但是,如果视图将这些数据转换为它自己的模型 - 它也会影响性能,因为我们必须遍历域模型数组并将它们转换为视图模型数组。在此之前,我们将数据模型转换为领域模型。 也许我什么都不懂)
例如我执行 GetAllPostsUseCase。
我收到了一个包含 100 个帖子的数组。我在那一步有Array<IPostResponseDTO>。
从中创建域模型以检查有效性。在这里我有Either<Failure, Array<Post>>。或者只是为了简单起见Array<Post>。
例如 Post 模型有一些验证规则和一个“业务规则”方法 addLike,它仅在喜欢计数小于 100 时才增加喜欢计数(例如)。而 View 不需要那种逻辑。例如在 AddLikeToPostUseCase 中使用。
然后 UseCase 将该数组返回给 ViewModel ?并将其按原样存储在传递给 View 的一些可观察数据数组中?还是转换为 View 层模型和存储?
还有数据合并发生在哪里?
例如,我有... CosmeticShops,其中包含brandIds 数组。 我从 ShopsRepository 收到 CosmeticShops,从 BrandsRepository 收到 Brands。 在视图中,我必须显示商店的 ShopsList,用户可以在其中按下每个 ShopCard 上的按钮 查看这家商店出售的品牌列表。 最好合并数据以供该 ShopsList 使用?
如果有人也能解释反向数据流,我将不胜感激。
据我了解:
在 ViewModel 中,我有一些可观察的帖子数组,例如js mobx observable、kotlin mutablelivedata、flutter bloc state 等(如果我理解 ViewModel 正确)
例如我执行 ViewModel 的方法addLike(postId)。
这个方法执行await this.addLikeToPostUseCase.execute(postId)
该用例将调用const post = await this.postsRepository.getPostById(postId),然后调用它的方法post.addLike(),并根据结果将该帖子保存在repo中并返回成功或返回失败。
然后在这里我看到两个变体:
我可以在 ViewModel 数据中增加该帖子的点赞数,然后它会在 View 中呈现。比执行用例,如果一切正常,则比什么都不做或显示错误 toast 或快餐栏,并在发生故障时恢复 ViewModel 数据的更改。
或者实际显示一个加载器,先执行UseCase,然后在视图中增加点赞数或显示一些错误。
我对那个数据流正确吗?
【问题讨论】: