Комментарии 17
Честно говоря мне тоже показалось, что статья не очень оправдывает свое название. Я постараюсь в следующий раз быть более избирательным при выборе статьи для перевода. Мне не приятно осознавать, что я потратил зря ваше время. Спасибо за критику.
При этом, как пример программирования Elixir, статья хорошая. Потому что на конкретном примере понять легче. Раскрыты многие темы: матчинг функций по параметрам, guards, циклы через рекурсию, агенты, pipeline. Вообще, конечно, вопросы есть по необходимости их применения. Но автор оригинального текста новичек. Так же хочу заметить, что, как мне кажется, автор ошибся с организацией приложения. Он сделал модуль, в котором все вместе, и который он запускает и в нем же все проверяет. А надо было сделать приложение, в нем модуль, который понимает строку такого вида и отвечает на эту строку. Проверку нужно было сделать через юнит тестирование.
Достаточно название выбрать более подходящее. Статья очень хорошая для тех, кто делает или планирует делать первые шаги в элексире.
Мой хохот должно было быть хорошо слышно в Денвере, штат Колорадо.
1. Зачем тут `Agent`? «Джо Армстронг (создатель Erlang) говорит, что с Erlang и Elixir „Вам не нужна база данных!“»—Джо говорит не про агентов. В эрланге никаких агентов нет. Я лично спрашивал Вирдинга про них, и Вирдинг сказал: «Не понимаю, зачем Хосе придумал лишнюю сущность». В общем, в ответ на вопрос «когда лучше всего использовать агенты эликсира, правильный ответ — никогда. С этим тяжело смириться людям, пришедшим из руби, питонов и прочих перлов, но — нет. Бейте себя по рукам, если вдруг. Возвращаясь к Джо, он имел в виду [D]ETS.
Ну и на закуску: в такой архитектуре навернувшийся агент утянет за собой все приложение, но супервизоры — это слишком сложно для автора.
2. Регулярки принято оформлять фигурными скобками `~r{}`. Да, это гайдлайн, но все же.
3. `acc ^^^ Bitwise.band(n, 1)` — щито? ⇒ `acc ^^^ n &&& 1`.
4. `Regex.run` не всегда возвращает список.
Ну и так далее. Не нужно учиться новым языкам, глядя на код восторженных недотыкомок.
Спасибо, внес правки.
Не могли бы вы указывать ссылку, например на Википедию, когда указываете чье-то мнение.
В Getting started guide на странице Sigils в синтаксисе для регулярных выражений используется
~r//
как и в статье. Поэтому оставил как есть.
acc ^^^ Bitwise.band(n, 1)
изменил наacc ^^^ (n &&& 1)
— этого не было в оригинальной статье, добавил комментарий об этом.
Regex.run
заменил наRegex.scan
+List.flatten
. Честно говоря, так и было в оригинальной статье, я напрасно позволил себе что-то менять.
Вся конструкция с извлечением чисел из строки нелепа и неуклюжа. Лучше уж тогда заматчить результат `Regex.scan` на `[[first, last]]`.
Про агенты — ну давайте все же будем снисходительны. Это далеко не худший способ написать простое хранилище стейта с синхронизированным доступом и несложной логикой.
Но идеологически это неправильно. Вы вот можете навскидку — прямо сейчас — не заглядывая никуда —сказать: что произойдет, если агент под супервизором навернулся, рестартнуть не успел, а вы из него пытаетесь данные достать?
Либо предсказуемый эксепшн про несуществующий процесс, либо мне вернут nil прекрасные разработчики stdlib. Либо там наворотили что-то совсем невероятное, и тогда я сдаюсь.
Вообще, это выглядит вполне обычной проблемой — обычный gen_server поведет себя точно так же.
Заглянул. Ничего там особенного, обычный noproc вылетит, вполне предсказуемо.
Всегда давайте имена своим агентам!
Отлично, просто отлично. С учетом отсутствия в эрланге нормального встроенного регистратора это очень интересное предложение.
Вообще, знаете, я вот смотрю на переводные посты про Elixir, смотрю в /r/elixir, и это все какой-то ад. Полезных постов незначительно больше нуля.
Я бы, кстати, не поленился бы и перевести на русский описание своей библиотечки для работы с сильно вложенными сущностями https://github.com/am-kantox/elixir-iteraptor
Там и про макросы можно было бы поговорить, и про доступ по `Access.{key!, all}`, и вообще есть много для новичка интересного. Да вот, незадача — меня забанили за то, что я после пятого наезда на меня в холиварном треде задел тонкую ранимую душу одного из местных редакторов обсценным эпитетом.
Техники в Elixir для начинающих: Метод проб и ошибок (перевод)