【问题标题】:obj-c pattern to separate model and network-layerobj-c 模式来分离模型和网络层
【发布时间】:2015-12-11 14:25:41
【问题描述】:

我正在尝试改进我的应用程序模型初始化和更新的设计。

我有什么

目前我有一个或多或少的 MVC 结构,模型类具有大部分变量 readonly 并且这些只能通过将应用程序与服务器同步来更新:将接收一个 json 文件并传递一个字典到一个预置的模型类方法

[ModelClass updatewithDictionary:(NSDictionary*)jsonDictionary] 

但是通过这种方式,我认为应该保存在我的应用程序的网络层中的所有 json 关键字和结构都必须由模型处理。

另一种选择

另一种解决方案是让模型为read/write,并有一个工厂/初始化器/任何类来实例化或更新它们。不幸的是,这会导致暴露我的模型类的应该是私有的成员。

我在寻找什么

是否有一种模式可以将模型与其实例化分开,让信息隐藏原则得以存在并且不使用代理类(或任何类似 java 的类爆炸生成方法)? c++ 中有点friend 的原则。

【问题讨论】:

  • 你试过使用DTO协议吗?
  • 不确定它是什么,但如果它是一种自动反序列化数据的方法,那么恐怕不是那么容易,因为我使用的后端服务有古怪的接口,并且数据需要在之前进行预处理初始化模型。你能再解释一下吗?谢谢。
  • 基本上,DTO 是一种传输协议。因此,如果您正在向 REST 服务请求资源(假设您要检索“服务”对象的列表),当响应到达时,您知道如何解析它:在复制为 NSObject 或的服务对象中AnyObject 如果你在 Swift 上

标签: objective-c design-patterns model-view-controller


【解决方案1】:

正如@LucaD 在他的评论中所说,我建议从网络层返回一些 DTO(数据传输对象)类,然后将其传递给模型进行更新。例如:

@interface ModelClass : NSObject
@property (nonatomic, readonly) ...

- (void)synchronizeBasedOnResponse:(ServiceResponse *)response;
@end


@interface ServiceResponse : NSObject // This is the DTO
@property (nonatomic) ...
@end


@interface MyService : NSObject
- (void)synchronizeModel:(ModelClass *)model
                 success:(void(^)(ServiceResponse *response))successBlock
                 failure:(void(^)(NSError *error))failureBlock;
@end

然后实际的 JSON 可能会发生变化(在某种程度上),您可以在 MyServiceServiceResponse 的某些 init 方法中将模型与 JSON 解析代码中的更改隔离开来,同时保持公共接口ServiceResponse 的一样。

【讨论】:

  • 是的,这就是我(可能是错误地)调用代理对象的原因。目前我认为它是唯一真正的替代方案,它具有生成大量类的巨大负面影响,这取决于项目的类型(特别是小型项目)在我看来可能并不总是让它变得有利。如果在一段时间内我找不到更好的答案,我必须接受这一点。谢谢。
  • @jalone 我理解你对小班泛滥的担忧。但是,(a) 在适当的时候,您通常可以通过将模型类用作响应类的成员来减少类的数量(例如,在上面的示例中将 ModelClass 作为 ServiceResponse 的成员); (b) 我经常不觉得拥有大量的小类是那么糟糕,因为它们通常应该很容易理解并将您的模型与您的网络代码隔离开来。我看到的主要问题是重复,可以通过使用 DTO 中的模型类来改善。
  • 再次感谢,我会尝试为当前项目找到一个混合解决方案。
猜你喜欢
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 2014-07-24
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多