1

我正在设计一个(类 SOAP)进程间通信协议,用于通过网络进行函数调用。我想确保较旧的客户端可以与较新的服务器通信。想了一会儿,似乎我唯一能做的就是:

  • 避免 API 更改
  • 使添加功能成为可能
  • 可以添加函数参数

但是,当服务器的功能彻底改变时,这还不够。例如:

  • 必须从一个函数调用移动到另一个函数调用的参数。
  • 改变的参数类型,例如从整数到字符串。

我的问题是:可以在保持向后兼容的同时进行这种更改,还是唯一的选择就是不进行更改?

注意:我知道,我患有此处未发明综合症,但在我看来,这并没有使这个问题无效。

4

1 回答 1

1

您还没有确切说明您是如何实施 IPC 的,所以我可能在这里做出了一些糟糕的假设。无论如何,在我的脑海中,有几种方法可以解决这样的问题。

首先,关于参数顺序/类型更改的问题,您可以使用 Python 之类的动态语言来解决这个问题。

>>> def discriminant(a,b,c):
...     return b*b - 4*a*c

>>> discriminant(1,8,2)
56
>>> 
>>> discriminant (c=2, a=1, b=8)
56

Python 允许您使用命名参数,以便您可以按您喜欢的任何顺序命名变量,并且所有变量都是动态类型的。

解决排序问题的一种效率较低的方法可能是将所有参数作为字典传递(用 Python 编写,但可以适用于任何一种语言):

>>> def disc2(in_dict):
...     return in_dict['b']*in_dict['b'] - 4 * in_dict['a'] * in_dict['c']
... 
>>> d = dict(a=1, b=8, c=2)
>>> d
{'a': 1, 'c': 2, 'b': 8}
>>> disc2(d)
56

为了扩展这个想法,您还可以在字典中包含一个“版本”字段(或参数,等等),以允许服务器根据传入的参数进行相应的调整。它不必是字典,您也可以在包含 IPC 消息的数据包中放置一个版本字段。这可能是一个人为的示例,但您也可以通过这种方式来解释缺少的字段。

>>> def disc3(d):
...     if d['version'] == 1: # original spec
...             return d['b'] * d['b'] - 4 * d['a'] * d['c']
...     else: # newer clients returning smaller values of c
...             return d['b'] * d['b'] - 4 * d['a'] * (2*d['c'])
... 
>>> d['version'] = 1
>>> disc3(d)
56
>>> d['version'] = 2
>>> disc3(d)
48
于 2009-06-26T11:43:30.447 回答