Каков правильный шаблон для обеспечения обратной совместимости клиент-сервер? - PullRequest
4 голосов
/ 26 января 2011

Я разрабатываю клиент-серверное приложение и не могу заставить пользователей не использовать более старые версии клиента или даже других клиентов, поскольку протокол - WebDAV.

Что мне нужно, так это поддерживать их все с некоторой обратной совместимостью, чтобы серверная часть работала по-разному, в зависимости от версии клиента, с которой она работает.

Мой вопрос заключается в том, как подготовить мое заявление к этой ситуации, прежде чем столкнуться с ней. Нужно ли использовать какой-то шаблон дизайна? Как разработать обратную совместимость?

Ответы [ 3 ]

3 голосов
/ 26 января 2011

Если вы создадите правильный API ( Фасад шаблон проектирования) для своего сервера, в будущем вы упростите свою жизнь.

предположим, что ваш сервер предоставляет API, который состоит из сервисов A, B и C. Эти сервисы реализованы на уровне бизнес-логики. Доступ к этим услугам со стороны клиентов всегда осуществляется через фасад, прямого доступа нет. так что ваш фасад (версия 1) выставляет A, B & C. ничего страшного пока ...

Теперь предположим, что вам нужно добавить службу D, удалить службу B и изменить службу C. Вы создаете новый фасад (версия 2), который предоставляет службы A, D и обновленный C. На вашем бизнес-уровне вы добавляете логика для службы D, пометьте B как «устаревший», а что касается изменения в C, то оно зависит от того, является ли изменение обратно совместимым. если да, это просто, просто добавьте перегрузку. если сервис C теперь работает совершенно иначе, внедрите его как новый сервис. хотя иногда происходят изменения, которые ломают старых клиентов ...

Фасад сам по себе может быть веб-сервисом (в большинстве случаев моим предпочтительным решением), и у него нет собственной бизнес-логики, его единственная обязанность - делегировать вызов от клиента соответствующему сервису.

2 голосов
/ 27 января 2011

Я думаю, что ваши сложные проблемы с дизайном находятся на другом уровне, чем адрес шаблонов проектирования.

Конечно, вы можете применять Фасады перед своей основной бизнес-логикой, открывая различные интерфейсы

MyServiceV1  { // the original interface

MyServiceV2  { // the new interface 

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

createItem( String name,
            Integer value);

, а в новой версии у вас есть

 createItem( String name,
            Integer value,
            String justification
 );

Так что, когда на фасад приходит запрос v1, онне будет данных для «обоснования», так что должен делать фасад?Возможно, добавьте некоторую «НЕИЗВЕСТНУЮ» ценность, но то, что вы делаете, - это не столько вопрос дизайна, сколько понимание требований бизнеса.Очевидно, что есть много хитрых проблем такого рода, в зависимости от различных изменений, внесенных при создании новой версии служб.

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

0 голосов
/ 24 июня 2016

Я думаю, что шаблон проектирования, который следует использовать в этой ситуации, - это шаблон проектирования стратегии .

Грубо ... идея состоит в том, что:

  • Экземпляр Server всегда ожидает новых подключений.
  • Когда новые соединения устанавливаются с Server, Server создает экземпляр ClientConnection для управления им.все последующие данные, полученные из этого соединения, направляются и обрабатываются экземпляром ClientConnection.
  • каждый ClientConnection управляет всеми коммуникациями между Server и отдельным удаленным клиентским хостом.
  • Первое, что делает ClientConnection, - это согласование с удаленным клиентом и выяснение, какая это версия.как только это будет сделано, ClientConnection создаст экземпляр соответствующей реализации ServerBehaviorStrategy для обработки всех последующих сообщений ClientConnection.

UML class diagram of architecture

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...