2009-06-26 4 views
1

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

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

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

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

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

Примечание: Я знаю, что я страдаю от not invented here syndrome, но, на мой взгляд, это не аннулирует этот вопрос.

ответ

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 
+0

Большое спасибо за ваш ответ. –

Смежные вопросы