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 に答える