Теория управления версиями для RPC и COM
Только два полностью безотказных метода поддерживают новые функции без риска проблем совместимости проводов:
- Изменить версию интерфейса в соответствии с правилами; это не позволяет новым клиентам взаимодействовать со старым сервером, а также может или не препятствовать обмену данными старого клиента с новым сервером. Это разъясняется далее в этом разделе.
- Введите другой интерфейс для работы с новыми функциями.
Стандартный интерфейс RPC определяется сочетанием GUID и номера версии; COM-интерфейс идентифицируется по его GUID. Версия состоит из основных и дополнительных частей. Для стандартных интерфейсов с одним и тем же ИДЕНТИФИКАТОРом GUID и разными номерами версий подключение возможно только в том случае, если основная версия совпадает, а клиент не превышает дополнительную версию сервера.
Следствием является то, что изменение GUID интерфейса RPC нарушает совместимость проводов, а изменение имени интерфейса — нет.
В стандартном RPC путь для обновлений и расширений четко определен и в основном требует, чтобы новые методы добавлялись только в конце интерфейса, а новые типы использовались только в новых методах. Если требуется такое добавление, необходимо увеличить дополнительную версию. Любое другое изменение требует изменения основной версии, так как клиентское и серверное программное обеспечение будут несовместимы по сети. Соблюдение этих правил гарантирует, что при наличии соединения между новым клиентом и старым сервером или наоборот обе стороны полностью совместимы.
Для COM-интерфейса нельзя использовать атрибут version. Создание новых интерфейсов и наследование от старых интерфейсов эквивалентно управлению версией в RPC. Как правило, лучшим подходом в COM является создание нового интерфейса для расширенной функциональности. Эквивалентом дополнительной версии является новый интерфейс, наследующий от старого. Для изменения старых методов или старых типов данных требуется совершенно новый COM-интерфейс, который не наследуется от старого.
Для COM функция QueryInterface — это установленный метод проверки того, поддерживает ли сервер интерфейс; Следовательно, ситуации, когда клиент может взаимодействовать со старой или новой версией интерфейса, могут быть легко решены.