Использование постоянных целых чисел во внешнем и внутреннем интерфейсе

Скажем, в моем внутреннем 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)

Для контекста: мне нужно применить логику во внешнем интерфейсе, чтобы изменить макеты

JS поддерживает константы. Вы даже можете определить их внутри функции, чтобы получить поведение, подобное классу.

bassxzero 20.08.2018 16:14

@bassxzero Да, я это знаю. Но я пытаюсь обойти тот факт, что мне пришлось бы определять константы в двух разных местах. Что избыточно.

Musa 20.08.2018 16:15

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

Alkis Mavridis 20.08.2018 16:17

Front-end! = Back-end. Единственные способы определить это один раз, что я могу придумать: сделать монолит и позволить всему зависеть друг от друга. Что плохо. Или: создайте (микро) сервис, содержащий все ваши константы, а затем извлекайте их через HTTP, когда они вам понадобятся. Это, вероятно, часто, поэтому производительность, вероятно, будет проблемой.

Loek 20.08.2018 16:18

Константы полезны только в пределах одного языка. Если вам нужно пересечь языковые границы, вы должны сериализовать их до полезных значений, например "normal" и "admin". Вы можете преобразовать это обратно в константы во внешнем интерфейсе, если хотите. В качестве альтернативы сохраните значения нейтральным для языка способом и каким-то образом скомпилируйте их в константы на обоих языках, если это имеет смысл для вашего рабочего процесса.

deceze 20.08.2018 16:18

@Musa нет, это не избыточно, потому что интерфейс и бэкэнд не связаны, иначе вы могли бы создать сервис в бэкэнде, который предоставляет эти значения для интерфейса, чтобы его использовать

lealceldeiro 20.08.2018 16:19

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

epascarello 20.08.2018 16:21
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
7
969
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Поскольку логика внешнего интерфейса и внутреннего интерфейса не обязательно (и должна быть связана нет), лучший подход здесь, я думаю, - это определение тех же констант в коде внешнего интерфейса. Помните, что код внешнего интерфейса всегда должен соответствовать спецификациям 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 и т. д. Если у вас уже есть один из них, добавьте на этап сборки скрипт, который автоматически генерирует файл констант внешнего интерфейса.

Если у вас нет этапа сборки в процессе разработки, сейчас отличное время для начала.

Другие вопросы по теме