gpt4 book ai didi

ios - 将远程数据与本地对象映射/解耦

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:45:43 28 4
gpt4 key购买 nike

应用程序从服务器拉取数据(通常是 JSON 字符串)是一种相当常见的场景。这些数据然后被解析并转换为本地类,如 NSString、NSArray、NSDictionary 等。

然而,大多数时候,我们希望使用自定义模型来表示此远程数据。

例如,如果我们要提取博客文章的 JSON 数组,我们希望将它们映射到 BlogPost 模型对象中,例如:

// BlogPost.h
@interface BlogPost: NSObject
@property NSString *title;
@property NSString *body;
@property NSDate *dateCreated;
@property NSArray *comments;
@end

将“JSON”模型与 native 模型分离的方法是什么?

我经常发现自己在模型中编写自定义初始化程序,它接受字典(通常来自 JSON 提要)。

例如:

// BlogPost.h
+ (BlogPost *)blogPostWithJSON:(NSDictionary *)jsonDictionary;

然后我必须跟踪服务器上使用的 key 并将它们映射到我的属性。

我总是觉得这样做有点不自在,因为应用程序中的模型实际上不必知道服务器上使用了哪些 key 。

我是否应该将这个 JSON 到对象的映射移到另一个类中?也许是工厂?或者我的网络管理员应该直接创建现成的对象并将其返回给我吗?

也许是这样的:

// NetworkManager.h
- (void)getBlogPostWithCompletion:(void (^)(BlogPost *blogPost))completionBlock;

(当然,我在这里省略了很多细节,比如要获取哪篇博文,但这只是为了演示一种方法)。

还有其他方法吗?您如何将服务器数据与本地模型分离?

最佳答案

我遇到过几次这个问题,得到的问题与您几乎相同。最后我发现对我有用的是:

  • 创建原始模型的 OO 表示。在您的情况下,这意味着将 JSON 数组解码为它用作基础模型(字典?)的任何内容。根据您正在使用的服务的建模方式,您最终可能会得到一些“记录类”(即没有行为的类)。我通常更喜欢使用这些类型的类而不是数组或字典,因为随着您的软件的发展,这允许在需要时向它们添加行为。另一方面,如果您使用数组或字典,则不能这样做。
  • 一旦有了低级 OO 模型,就可以创建 OO 领域模型。在这个新模型中,您可以根据领域的需要设计事物,而不是绑定(bind)到服务提供商的模型。很多时候您会发现您的域类和提供者的域类之间存在一对一的映射,但这不是强制性的。这里的要点是,您应该抽象您的领域并按照您认为正确的方式进行设计。

这两个模型之间的映射可以根据其复杂性以不同的方式完成。我通常喜欢选择这三种方法中的一种并坚持使用,以便在项目中采用同质方法:

  1. 在您的域模型中编写一个类方法(class)HighLevelObject>>from(aLowLevelObject)。这需要一个低级对象并自行配置。您对具有低级对应物的所有高级对象执行此操作。
  2. 与前一个相反:在创建域模型实例的低级对象中编写实例方法LowLevelObject>>createHighLevelObject()。在这里,您正在将创建新对象的责任转移到较低层。
  3. 创建 factorybuilder (取决于模型的复杂性)负责整个创建过程。

如果您有简单的模型,它们之间有许多一对一的映射,我会选择选项 1 或 2。选择哪一个在很大程度上取决于您的口味;选项 1) 的优点是对象知道如何构造自身,但将转换过程的负担放在域模型中。第二种方法留下了一个“更干净”的领域模型,但迫使下层了解上层的细节,并可能迫使您打破封装。我不认为这里有 Elixir ;恕我直言,您应该选择最适合您的需求和编程品味的方法。

HTH

关于ios - 将远程数据与本地对象映射/解耦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14311654/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com