Совет, чтобы упростить работу с несколькими средами.

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

Итак, у меня есть несколько целей при переключении между конечными точками api:

  1. Делай проще. Это не должно быть сложным или трудоемким.
  2. Устраните как можно больше способов сделать опечатки.
  3. Сделайте так, чтобы при наличии нескольких различных служб API (распознавание изображений, база данных, платежное решение) мы могли переключаться между всеми ними одновременно.
  4. Сделайте место, где происходит переключение, как можно более читабельным для других, смотрящих на код.

Итак, как разработчик, мне нравится быть максимально СУХИМ, и моей целью было попытаться достичь всех четырех целей. Я нашел способ сделать это полезным, и, возможно, вы найдете это полезным. (Кроме того, если у вас есть идея, как лучше или иначе, поделитесь, пожалуйста!)

Во-первых, я начну с создания нового перечисления EnvironmentType. Во многих случаях это может быть так просто:

Если ваша команда использует больше конечных точек, чем это, или у вас есть другие варианты, или вы хотите иметь возможность переключаться между разными версиями, очевидно, не стесняйтесь настраивать его по мере необходимости. (Это может быть что-то вроде developmentV1, developmentV2, productionV1 для разных случаев, если вам это нужно.)

После его создания я создаю класс для управления средой. Это довольно просто и понятно.

Я сделал здесь несколько вариантов. Позвольте мне пройти через них.

  1. Я сделал среду current неявно развернутой. Это необходимо, чтобы убедиться, что функция настройки ДОЛЖНА быть вызвана перед использованием класса. Если он не вызывается, приложение вылетает при запуске.
  2. Я создал функцию configure для установки текущей переменной среды.

Итак, у нас есть несколько настроек, теперь давайте поговорим немного о том, как настроить класс, отвечающий за выполнение ваших веб-вызовов. Вот схема, которую я использую, чтобы убедиться, что в ней используется верная информация:

Итак, теперь мы настроили наш api так, чтобы мы могли написать только одну переменную baseUrlString и использовать ее как часть всех наших различных URL-адресов в нашем классе api. С этого момента мы просто настроим все различные веб-вызовы на использование одной и той же строки api.

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

Хорошо, теперь последний кусок, который заставляет все работать.

  1. Давайте добавим переменную для хранения текущей среды в делегате приложения, чтобы она оставалась доступной для приложения (чтобы она оставалась в области видимости на протяжении всего приложения).
  2. Вызовите функцию Environment.configure, чтобы установить текущую среду.

Хорошо, теперь, когда все сделано, наше приложение и наш api будут использовать правильные пути для среды разработки.

Итак, вот что мне нравится в этом способе работы.

  1. Настроить это в первый раз несложно.
  2. Обе конечные точки уже находятся в классе (ах) сетевого API, поэтому после того, как вы добавите их и убедитесь, что нет опечаток, вам не нужно их изменять (если, конечно, не изменятся фактические URL-адреса конечных точек).
  3. Переключение с .production на .environment - это только 1 значение, и это значение проверяется во время компиляции.
  4. Если у вас есть несколько разных конечных точек API как часть вашего приложения, это изменяет их все за один вызов. (Допустим, у вас есть API, предоставляющий ваши пользовательские данные, что-то вроде внутренней связи для обслуживания клиентов и что-то, что управляет вашими платежами.) Вы меняете это в одном месте, и он меняет это для всех.
  5. Вы используете только одну переменную baseUrlString для создания всех ваших URL-адресов в вашем классе API, поэтому вы минимизируете количество опечаток и повторений.

Итак, я нашел это полезным для себя. Что вы думаете?