Главная » Хабрахабр » [Из песочницы] О том, как из C# перешел в Elixir/Phoenix

[Из песочницы] О том, как из C# перешел в Elixir/Phoenix

Как-то раз пришлось мне менять работу. До этого я работал только с языками типа Python, C++, C# и ещё парочкой подобных. А теперь пришлось начать работать с функциональным языком. Первые впечатления были «да что за фигня?». Однако у меня получилось достаточно быстро адаптироваться. Далее я расскажу об основных моментах, к которым пришлось привыкнуть или которые пришлось понять, чтобы начать писать быстро и адекватно.
1. Pattern matching

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

По определению: Пример 1.

= tuple

– разбивает 2-х элементный кортеж на две переменных, которые далее можно использовать.

[head_item | tail_list] = list

– разбивает список на первый элемент в списке и список без первого элемента.

Сопоставление в case: Пример 2.

case get_elem(struct) do {:ok, elem} -> … {:error, reason} -> …
end

Функция get_elem(struct) возвращает кортеж, и case позволяет сразу извлечь данные и выбрать дальнейшую последовательность действий.

Сопоставление функций: Пример3.

def function_1(params, :ok) do
end def function_1(params, :error) do
end def function_1(params, _) do
end

Здесь по сути представлена одна и та же функция принимающая два параметра. Сопоставление паттернов позволяет выбрать, какую именно функцию исполнить.

Сопоставление идет всегда «сверху-вниз». Немного о работе сопоставления паттернов. Если первая проверка провалится, то произойдет проверка на :error. В данном примере при вызове function_1 от двух параметров, сначала произойдет проверка, что второй параметр равен :ok. Нижнее подчеркивание обозначает «любые данные», а также то, что пришедшие данные нас не интересуют, то есть мы их не будем использовать. И если опять нет, то мы в любом случае войдем в третий вариант метода. Если не будет найден нужный паттерн, то вылезет исключение. Если бы function_1(params, _) стояла первой в списке, то программа всегда выбирала бы её, и остальные два метода не работали бы никогда.

Pipeline 2.

Это конструкции следующего вида:

param_1
|> func_1()
|> func_2(param_2)

С первого взгляда кажется фигня какая-то. Но стоит вспомнить о том, что Elixir – функциональный язык. И в функциональном языке вполне нормально делать вычисления функции от функции, без промежуточных переменных. Пайплайн – всего лишь удобная запись. Сам язык просит для ясности начинать пайплайн с переменной или значения.

Пример выше можно переписать следующим образом:

func_2(func_1(param_1), param_2)

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

Отсутствие циклов 3.

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

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

Заменой циклам служат 2 вещи – рекурсия и библиотечные методы работы с enumerable элементами языка.

Немного ещё о мелочах.

В Элексире нет классов, но есть контексты. 1. Наиболее близкое описание контекста глазами си-шарпера: контексты это нечто среднее между классом и пространством имен в шарпе, причем к пространству имен контекст намного ближе. По сути контексты в некотором роде заменяют классы.

Атомы. 2. Атом по сути это нечто вроде «метки». В Элексире есть такое понятие как атом. В примерах этой статьи уже было два атома: :ok, :error. Проще всего к ним относится как к особым строкам. По сути это константы, у которых значением является их имя. Благодаря атомам намного проще осуществлять сопоставление паттернов, и сложные логические конструкции. Атом всегда имеет «:» перед именем.

Как правильно читать заголовки методов. 3. Читается это как метод с именем «function» и арностью 2. В Elixir принято обозначать методы следующим образом (особенно часто это видно в документации): &function/2. Арность – количество принимаемых аргументов.

Что мне помогло влиться в язык.

Он хорош тем, что кратко охватывает основные моменты языка и его синтаксиса, и его можно почитать в автобусе. Во-первых, это справочник на андройде «Elixir Tutorial». Минус: он на английском, так что подойдет не каждому.

Легко читается и позволяет значительно улучшить свою работу с языком. Во-вторых, книга «Введение в Elixir» за авторством Сенлорен С., Эйзенберг Д… В данной книге показывают приемы работы с языком и объясняют их. Также её можно найти на русском языке.

Она сделана удобно и позволяет быстро находить нужные разделы/методы, с подробным описанием и примерами. В-третьих, официальная онлайн документация.

На этом все.

Список приведенных материалов:

Elixir Tutorial 1.

Сенлорен С., Эйзенберг Д. 2. Введение в функциональное программирование. Введение в Elixir. – O'Reilly, 2017.

Официальная документация. 3.


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

MIDI-router на Raspberry Pi

Хочу рассказать о том, как решить проблему, которая наверняка знакома любителям аппаратных синтезаторов. Причем, по понятным причинам хочется все это сделать не используя компьютер. Что делать, если хочется состыковать MIDI-контроллер и синтезатор, но у одного из них есть только USB ...

DynamicData: Изменяющиеся коллекции, шаблон проектирования MVVM и реактивные расширения

В феврале 2019 года состоялся релиз ReactiveUI 9  —  кроссплатформенного фреймворка для построения приложений с графическим пользовательским интерфейсом на платформе Microsoft .NET. ReactiveUI  — это инструмент для тесной интеграции реактивных расширений с шаблоном проектирования MVVM. Знакомство с фреймворком можно начать с ...