Iphone Objective-c设计建议,用于不同数据源的使用,在测试和现场之间交换

Iphone Objective-c设计建议,用于不同数据源的使用,在测试和现场之间交换,iphone,objective-c,design-patterns,architecture,Iphone,Objective C,Design Patterns,Architecture,我正在设计一个应用程序,这是一项更大工作的一部分,依赖于其他人构建一个应用程序可以用来检索数据的API 当我在考虑如何设置这个项目并围绕它设计架构时,我想到了一些事情,我相信很多人都遇到过类似的情况 由于我的工作依赖于其他人来完成他们的任务,以及一个测试服务器,这会降低我的工作速度 因此,问题是: 创建测试存储库和类,实现它们,并且不必改变代码中的几个位置来在测试类和实际存储库/正确的api调用之间进行交换的最佳实践是什么 设想以下情景: GetDataFromApiCommand *getDa

我正在设计一个应用程序,这是一项更大工作的一部分,依赖于其他人构建一个应用程序可以用来检索数据的API

当我在考虑如何设置这个项目并围绕它设计架构时,我想到了一些事情,我相信很多人都遇到过类似的情况

由于我的工作依赖于其他人来完成他们的任务,以及一个测试服务器,这会降低我的工作速度

因此,问题是: 创建测试存储库和类,实现它们,并且不必改变代码中的几个位置来在测试类和实际存储库/正确的api调用之间进行交换的最佳实践是什么

设想以下情景:

GetDataFromApiCommand *getDataCommand = [[GetDataFromApiCommand alloc]init];
getDataCommand.delegate = self;
[getDataCommand getData];
一旦数据通过API可用,“GetDataFromApiCommand”就可以使用实际的API,但在此之前,可以在调用[getDataCommand getData]时返回一组模拟数据

在代码中的不同位置可能有多个这样的实例,因此无论它们在哪里,替换它们都是一个缓慢而痛苦的过程,这不可避免地会导致一两个被忽略

在强类型语言中,我们可以使用依赖注入,只需改变一个位置。 在objective-c中,可以实现工厂模式,但这是实现这一目标的最佳途径吗

GetDataFromApiCommand *getDataCommand = [GetDataFromApiCommandFactory buildGetDataFromApiCommand];
getDataCommand.delegate = self;
[getDataCommand getData];
实现这一结果的最佳实践是什么

由于这将是最有用的,即使您有可用的实际API来运行测试或离线工作,ApiCommand不一定要永久替换,而是选择“我想使用TestApiCommand还是ApiCommand”选项

更有趣的是,可以选择在以下各项之间切换: 所有命令都是经过测试的 和 所有命令都使用live API, 但是,这对于测试一个或两个实际的API命令、将它们与测试数据混合也很有用,而不是逐个选择它们


编辑 我选择的方法是使用工厂模式

我按如下方式建立工厂:

@implementation ApiCommandFactory
+ (ApiCommand *)newApiCommand
{
    // return [[ApiCommand alloc]init];
    return [[ApiCommandMock alloc]init];
}
@end
以及任何我想使用ApiCommand类的地方:

GetDataFromApiCommand *getDataCommand = [ApiCommandFactory newApiCommand];
当需要实际的API调用时,可以删除注释并注释掉模拟

在消息名中使用new意味着谁使用工厂获取对象,谁就负责释放它(因为我们希望避免在iPhone上自动释放)

如果需要其他参数,工厂需要考虑这些参数 i、 e:

这也可以很好地用于存储库

在消息名中使用new意味着谁使用工厂获取对象,谁就要负责释放它(因为我们希望避免在iPhone上自动释放)

你不必过分担心没有自动释放。它只适用于在事件循环的一次迭代中创建大量自动释放对象的情况。如果此对象的寿命足够长,否则您将在factory方法之外保留它,那么返回自动释放的对象只需要在自动释放池中使用一个引用

无论如何,要回答你的问题,你的选择和我会做的差不多。还要考虑创建一个与API匹配的ObjtoE-C协议,并且ApCimMundMod和ApCiMMand必须符合。这将记录API并为您和其他团队提供一些规则。例如,它将确定方法名称和参数类型等内容

[ApiCommandFactory newSecondApiCommand:@"param1"];