Скажем, в моем внутреннем API определены следующие константы:
User::USER_ROLE_NORMAL; // Equal to 0
User::USER_ROLE_ADMIN; // Equal to 1
В моем бэкэнде теперь я могу сделать следующие сравнения:
if ($user->role == User::USER_ROLE_NORMAL)
Что лучше всего подходит, когда мне нужно применить логику в моем интерфейсе? (где эти константы неизвестны)
Неправильно жестко кодировать числа во внешнем интерфейсе, например:
if (ajaxData.role == 0)
Для контекста: мне нужно применить логику во внешнем интерфейсе, чтобы изменить макеты
@bassxzero Да, я это знаю. Но я пытаюсь обойти тот факт, что мне пришлось бы определять константы в двух разных местах. Что избыточно.
Я использую одни и те же перечисления и другие константы в моем интерфейсе и бэкэнде (определены 2 раза). Я просто соблюдаю дисциплину: я всегда должен обновлять интерфейсные, каждый раз, когда меняю свои серверные. Я также сохраняю те же самые перечисления имен для убедительности и ясности. До сих пор эта стратегия мне нравилась, но, возможно, есть и другие способы справиться с этим ...
Front-end! = Back-end. Единственные способы определить это один раз, что я могу придумать: сделать монолит и позволить всему зависеть друг от друга. Что плохо. Или: создайте (микро) сервис, содержащий все ваши константы, а затем извлекайте их через HTTP, когда они вам понадобятся. Это, вероятно, часто, поэтому производительность, вероятно, будет проблемой.
Константы полезны только в пределах одного языка. Если вам нужно пересечь языковые границы, вы должны сериализовать их до полезных значений, например "normal" и "admin". Вы можете преобразовать это обратно в константы во внешнем интерфейсе, если хотите. В качестве альтернативы сохраните значения нейтральным для языка способом и каким-то образом скомпилируйте их в константы на обоих языках, если это имеет смысл для вашего рабочего процесса.
@Musa нет, это не избыточно, потому что интерфейс и бэкэнд не связаны, иначе вы могли бы создать сервис в бэкэнде, который предоставляет эти значения для интерфейса, чтобы его использовать
Поэтому создайте бэкэнд-код, который выводит постоянный файл, который вы можете импортировать в приложение.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Поскольку логика внешнего интерфейса и внутреннего интерфейса не обязательно (и должна быть связана нет), лучший подход здесь, я думаю, - это определение тех же констант в коде внешнего интерфейса. Помните, что код внешнего интерфейса всегда должен соответствовать спецификациям API.
Способ вы делаете это вам решать (можно найти много хороших альтернатив).
(Простой) подход может заключаться в использовании некоторых глобальных переменных или использования какого-либо сервиса, если вы используете некую структуру.
Что-то типа:
const role {
USER_ROLE_NORMAL: 0,
USER_ROLE_ADMIN: 1,
};
Затем вы можете использовать их следующим образом:
if (ajaxData.role == role.USER_ROLE_NORMAL) {}
Другой вариант (не очень используемый) заключается в том, что вы можете создать службу в API серверной части, которая предоставляет эти значения для внешнего интерфейса для ее использования. Поэтому, прежде чем код внешнего интерфейса сможет использовать какое-либо значение, относящееся к ролям (например), необходимо сделать запрос к бэкэнду, чтобы получить эти постоянные значения и сохранить их во внешнем интерфейсе, чтобы использовать его в будущих операциях.
Вы также можете сгенерировать содержимое файла JS со всеми константами, используя бэкэнд. Таким образом, вы управляете этими данными в одном месте, что может быть преимуществом.
Первым решением было бы создать другой файл для внешнего javascript, определяющий константы. Но у этого есть большой недостаток: вам нужно будет убедиться, что оба файла (константы внешнего интерфейса и константы внутреннего интерфейса) совпадают. Если вы измените одно, не забудьте изменить другое.
Но во-первых, обратите внимание, что этот недостаток также существует, если вы просто жестко запрограммируете константы в первую очередь (это ужасно и абсолютно не вариант).
Решение состоит в том, чтобы иметь автоматизированный процесс (так называемый шаг сборки разработки), который автоматически генерирует файл констант внешнего интерфейса на основе файла констант внутреннего интерфейса.
В разработке javascript очень часто используется этап сборки: Webpack, Grunt, Gulp и т. д. Если у вас уже есть один из них, добавьте на этап сборки скрипт, который автоматически генерирует файл констант внешнего интерфейса.
Если у вас нет этапа сборки в процессе разработки, сейчас отличное время для начала.
JS поддерживает константы. Вы даже можете определить их внутри функции, чтобы получить поведение, подобное классу.