Elixir - это невероятно универсальный функциональный язык программирования на основе Erlang с чистым синтаксисом, вдохновленным рубином. Созданный основным выпускником Rails Хосе Валимом, я невероятно впечатлен его руководством и развитием языка даже на его начальной стадии.

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

Именно из-за этой прекрасной репутации, когда я сталкиваюсь с особенно запутанным аспектом языка, я обращаю на это внимание. Одно из таких замечаний в последнее время заключалось в том, что я никогда не могу вспомнить, как и когда использовать директивы зависимостей use, require, import и alias. Давайте углубимся здесь, чтобы узнать больше об этих директивах и о том, есть ли возможности для улучшения.

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

Хорошо, если я хочу сократить полное имя модуля, я использую «псевдоним». Если я хочу убедиться, что какой-то модуль доступен, я использую «require». Если я хочу, чтобы мне были доступны все функции определенного модуля, я использую «импорт». Если мне нужно подключиться к внешней функциональности, я использую «использовать». Хорошо понял.

Беглый взгляд, вы можете принять это за чистую монету и продолжить свой день. Однако, когда вы занимаетесь разработкой и вам нужно использовать какую-то часть функциональности, огромное количество способов доступа к другому модулю просто сводит с ума - вам нужно проработать дерево решений в своей голове, чтобы выполнить очень простую программную задачу. . "Чего я хочу? Для вызова Your.Foo.bar. Как мне на это сослаться? Как «Фу». Это макрос? Эммм, я так думаю (идет и проверяет документацию библиотеки). да. Хорошо - «требовать» это так. Но… мне тоже нужно «использовать» это (идет и проверяет документацию библиотеки). Нет ладно. Уф! ».

Я утверждаю, что хотя могут быть причины реализации для такого множества директив, их множественность пагубно сказывается на новом опыте разработчиков. Как пользователь Elixir я использую эти директивы с одной целью - убедиться, что зависимость доступна и достижима. Существуют ли обстоятельства, при которых я хочу использовать псевдоним или импортировать модуль, при котором я не хочу гарантировать, что модуль скомпилирован и доступен? Скорее всего, нет, поскольку в его нынешнем воплощении «require» кажется излишним. А «псевдоним» и «импорт» настолько похожи по своему назначению, что кажется мелочным иметь их отдельными директивами.

Интересно, насколько возможно было бы, чтобы «требовать» сочетали функциональность «псевдонима» и «импорта», при этом обеспечивая компиляцию и доступность ссылочного модуля:

Это объединяет три директивы в одну без потери, насколько мне известно, какой-либо функциональности, присутствующей с текущим псевдонимом / require / import trifecta.

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

Несомненно, существуют очень веские причины для существования этих четырех директив. Многие умные люди потратили больше времени на размышления об этой функции и ее последствиях, чем я, когда писал этот пост. Цель здесь не в том, чтобы оспаривать эти решения, а в том, чтобы просто представить точку зрения нового пользователя и выступить за пересмотр компромиссов.

Продолжение: вы можете увидеть мой световой разговор по этой теме здесь.

Спасибо Хосе и Крису за то, что они потратили время на объяснение цели и истории этих директив. Резюмируя, они признают, что эти директивы могут сбивать с толку, но сейчас потребуется немало усилий, чтобы изменить их семантику.