В некоторых языках, таких как Python или JavaScript, переменные или константы, определенные на уровне модуля, могут быть импортированы в других частях программы. С одной стороны, это открывает больше возможностей по сравнению с языками, где любые данные должны находиться внутри функций, классов и так далее. С другой стороны, становится гораздо легче писать плохо поддерживаемый код.
Представим, что мы пишем веб-сервис, который умеет конвертировать валюты. В этом конвертере присутствует описание того, какая валюта в какую может конвертироваться, и по какому курсу:
Остальные части программы используют эту информацию для своих вычислений и проверок:
Код получился простой, но ненадежный. Если пользователь выполнит запрос на рейт валют, которых нет в системе, возникнет ошибка доступа к объекту:
Даже если первая валюта есть, то при отсутствии второй в константе rate
окажется undefined
, что может быть неверным (зависит от приложения).
Перепишем код и избавимся от ошибки:
Ошибка больше не возникнет, но решение все еще плохое. Работа с rates
наверняка не ограничится одним обработчиком. С ростом приложения рейты начнут использоваться повсеместно, а это значит, что и обработку ошибок придется делать в каждом месте. Кроме того, любое изменение структуры данных также потребует переписывания всех мест, где они используются.
Подписывайтесь на канал Кирилла Мокевнина в Telegram — чтобы узнать больше о программировании и профессиональном пути разработчика
Указанные проблемы типичны для всех ситуаций, когда работа с данными идет напрямую без создания хотя бы минимальной абстракции (функций) для доступов к данным. Решается все очень просто, нужно лишь добавить функцию в модуль currency.js.
Kirill Mokevnin
5 лет назад