我正在使用与JSON API通信的iPhone / iPad / Android应用程序。
该应用程序版本的第一个版本已完成,现在正在进行其他开发阶段。在其他阶段,应用程序需要与新版本的API集成,并允许用户访问其他功能,如新屏幕或现有屏幕中的修改行为。但是,应用程序确实需要使用以前版本的API。
解决此类要求的最佳做法是什么? 我可以在整个代码中做检查:
if (APIVersion == 1) {
} else if (APIVersion == 2) {
} else if (APIVersion == ....) {
}...
但我担心这种方法的可扩展性。 我想到了工厂方法,但我不确定这会给我带来多大的帮助。
谢谢, 标记
答案 0 :(得分:22)
发布新的API版本是非常罕见的事情。通常,只需添加新的可选参数或新方法即可实现向后兼容性。例如,如果您使用名为search
的方法,但现在您对其工作方式不满意,您可以通过各种方式处理它:
如果更改很简单,您可以添加一个新的mode
参数,默认为mode1
(因此它向后兼容)。如果用户提供mode2
,则会按照您自己的建议检测到if
条件。 (另外,通常你可以想到一个比“模式”更好的名字。)
如果更改很大,您可以添加使用新界面的新search2
服务。然后将search
方法标记为已弃用(但仍在工作且向后兼容)。通常,当您执行此操作时,您可以通过这种方式重构代码,几乎所有逻辑都在search2
方法中,并且您的旧search
方法调用{ {1}}在内部修改参数(并适当地重新格式化结果)。如果您正确执行此操作,则无需再更改search2
方法。当您更改表格等时 - 您只需要修改search
。
我的观点是,避免发布API的search2
版本。如此大的发布意味着您的方法 ALL 的重大变化,而不仅仅是一个。许多主要的API从未发布过他们的API版本2,他们仍然使用版本1,只是略微修改它的一部分,如上例所示。
如果您完全确定关于发布API的N+1
版本,请为您的方法的所有创建新的入口点。如果您有一个名为N+1
的文件夹,请创建一个名为services
的新文件夹。重构您的services-v2
代码,使其使用services
的大部分代码。如果您认为它有点过分,那么我认为您还不需要services-v2
- 您的API版本。
答案 1 :(得分:2)
我猜你已经分开了一些担忧。我的意思是,获取应用程序的数据只能通过模型完成(例如)。
所以你只需要改变模型。
我的建议是只有一个入口点:“路由器”文件。此文件检查所需的API版本,并加载正确的文件。这样,您就可以为每个API获取不同的文件。 “路由器”文件不会很大,每个新的API版本都有自己的文件,因此你不会混合所有内容。
例如,在“路由器”文件中:
function dispatch() {
switch (APIVersion) {
case 1:
use('file.1.ext');
break;
case 2:
use('file.2.ext');
break;
case 3:
use('file.3.ext');
break;
}
}