Как обеспечить обратную совместимость API IPC - PullRequest
1 голос
/ 26 июня 2009

Я разрабатываю (SOAP-подобный) протокол межпроцессного взаимодействия для выполнения вызовов функций по сети. Я хочу убедиться, что старый клиент может общаться с новым сервером. Подумав немного, кажется, единственное, что я могу сделать, это:

  • избегая изменений API
  • позволяет добавлять функции
  • позволяет добавить параметры функции

Однако, когда функциональные возможности сервера полностью изменяются, этого недостаточно. Например:

  • параметр, который необходимо переместить из одного вызова функции в другой.
  • тип параметра, который изменяется, например, с целого числа на строку.

У меня вопрос: можно ли вносить такого рода изменения, оставаясь обратно совместимыми, или единственный вариант - просто не вносить их?

Примечание: Я знаю, я страдаю от синдрома не изобретенного здесь , но, по моему мнению, это не отменяет этот вопрос.

1 Ответ

1 голос
/ 26 июня 2009

Вы не сказали точно, как вы внедряете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...