Comments 26
UFO just landed and posted this here
Пример красивый, спасибо. Сейчас внесу в статью. Но вот обоснование немного некорректно. Это все-таки не приоритеты операторов, а порядок разбора аргументов функции, когда мы передаем их без скобок.
UFO just landed and posted this here
Я к тому, что do end и {} это операторные скобки. Сами они вроде как не операторы. (Тапками кидаться можно, в терминологии постоянно путаюсь)
UPD. По приведенной ссылке с приоритетом операторов нет операторных скобок (либо я совсем слепой).
UPD. По приведенной ссылке с приоритетом операторов нет операторных скобок (либо я совсем слепой).
UFO just landed and posted this here
Спасибо за информацию. А можно ссылку, чтобы проникнуться? Вообще, очень люблю Ruby, но иногда он все-таки действительно очень японский.
Как то ужасно стало после прочтения. Может мест где ошибиться стало меньше, но код стал куда сложнее и запутаннее, особенно для того кто не писал его.
Как там у нас говорят:
Как там у нас говорят:
Явное лучше, чем неявное.
Простое лучше, чем сложное.
Мне тоже не очень нравится использованный автором подход. Но, имхо, если заменить это
все становится вполне прозрачно для человека, который будет пользоваться этим DSL.
В конце концов, в том же ActiveRecord Вы, я думаю, не пишете механизм валидации, а используете что-то типа
и не переживаете по поводу того, что кто-то не поймет, что делает этот код, потому что это стандартная вещь. Также в этой компании ввели свой внутренний стандарт. А вот человеку с улицы может быть и непонятно, что тут происходит.
Если честно, перевести (а сначала внимательно прочитать) статью меня сподвигло то, что пробежав ее по диагонали и читая только код, я не понял, что это и как этим пользоваться.
StateBuilder.build('CA') do
company do
edd { format '\d{3}-\d{4}-\d' }
sos { format '[A-Z]\d{7}' }
end
employee do
...
end
end
на это:StateBuilder.build('CA') do
company do
field edd, format: '\d{3}-\d{4}-\d'
field sos, format: '[A-Z]\d{7}'
end
employee do
...
end
end
все становится вполне прозрачно для человека, который будет пользоваться этим DSL.
В конце концов, в том же ActiveRecord Вы, я думаю, не пишете механизм валидации, а используете что-то типа
validates :name, presence: true
и не переживаете по поводу того, что кто-то не поймет, что делает этот код, потому что это стандартная вещь. Также в этой компании ввели свой внутренний стандарт. А вот человеку с улицы может быть и непонятно, что тут происходит.
Если честно, перевести (а сначала внимательно прочитать) статью меня сподвигло то, что пробежав ее по диагонали и читая только код, я не понял, что это и как этим пользоваться.
UFO just landed and posted this here
Ну что сказать. Предложенный Вами синтаксис самый логичный, конечно. Сам я, кстати говоря, при решении подобной задачи использовал примерно такой же. Единственное, все может сломаться, если круг задач шире, чем указанный автором при написании статьи. Тогда простая конфигурация хешем уже может и не проскочить (например, нам надо как-то хитро конфигурировать еще и саму модель, а не только штато-зависимые поля)
Однако, мне показалось, что целью статьи было больше показать способы метапрограммирования, а не написания DSL.
Противоречит с
Ну все-таки на самом деле можно, только осторожно. Смотрим примеры из роутов:state 'CA' { # вот и пригодилось знание про «почему тут нельзя do» company edd: '\d{3}-\d{4}-\d', sos: '[A-Z]\d{7}' }
namespace :nspace do
resources :resname do
get 'path', on: :collection
end
end
Главное, не пытаться что-то сделать с результатом выполнения этого когда (тогда будет указанный Вами упс).Однако, мне показалось, что целью статьи было больше показать способы метапрограммирования, а не написания DSL.
Они плясали от старого кода к DSL. Нужно было написать идеальный DSL, а потом его запрограммировать. Правда, пошаговую статью тогда было бы не написать.
Противоречит с
В данном случае, мы будем работать «задом наперед»: вместо того, чтобы начинать с создания классов и методов, мы разработаем идеальный синтаксис и будем строить все остальное вокруг него.
А поясните пожалуйста про store_accessor.
А где именно в вашем примере сказано, что наследоваться нужно от AR?
В коде по ссылке. Когда читал оригинал, сразу же туда полез смотреть, как оно все устроено. Мне всегда казалось, что со стеком проще ознакомиться взглянув на код.
Вообще, этот код создавался явно не для копипасты, а как иллюстрация принципов, поэтому не очень роляет, какая ORM использована.
Вообще, этот код создавался явно не для копипасты, а как иллюстрация принципов, поэтому не очень роляет, какая ORM использована.
Store_accessor не имеет отношения к ORM в контексте иллюстрации принципов DSL.
В общем, у тех кому нужно объяснять принципы построения DSL, store_acсessor вызывает сильную головную больше, поскольку не каждый джун использует AR без рельсы.
Далее, про принципы:
в чем разница между
MyClass.new.instance_eval { say_hello } # => 'Hello!'
и
MyClass.new.say_hello # => 'Hello!'
не ясно
В общем, у тех кому нужно объяснять принципы построения DSL, store_acсessor вызывает сильную головную больше, поскольку не каждый джун использует AR без рельсы.
Далее, про принципы:
в чем разница между
MyClass.new.instance_eval { say_hello } # => 'Hello!'
и
MyClass.new.say_hello # => 'Hello!'
не ясно
Пожалуй, тут мой косяк. Несмотря на то, что в оригинальной статье прямо не сказано про то, что весь код написан в рамках рельсов (хотя, при отсылке к репозиторию это указано), стоило в шапке перевода указать. Так что тут, скорее, «не каждый джун использует рельсу без AR».
В этом случае разницы никакой, да. Но, ИМХО, достаточно очевидно, что первый способ позволяет внутрь блока засунуть что угодно так, что будет казаться, что мы описали у класса новый метод и его вызвали.
PS. Вообще, у меня сложилось впечатление, что вы упорно считаете меня автором, хотя я всего лишь переводчик. Более того, как видно из преамбулы и некоторых комментариев, я далеко не всегда согласен с автором.
Далее, про принципы:
в чем разница между
MyClass.new.instance_eval { say_hello } # => 'Hello!'
и
MyClass.new.say_hello # => 'Hello!'
не ясно
В этом случае разницы никакой, да. Но, ИМХО, достаточно очевидно, что первый способ позволяет внутрь блока засунуть что угодно так, что будет казаться, что мы описали у класса новый метод и его вызвали.
PS. Вообще, у меня сложилось впечатление, что вы упорно считаете меня автором, хотя я всего лишь переводчик. Более того, как видно из преамбулы и некоторых комментариев, я далеко не всегда согласен с автором.
Вы же решились перевести эту статью? Можно было бы написать свою, а на эту сослаться, как делают в большинстве научных работ.
Решился, потому что подходы интересны. Достаточно понятно объяснено то, что многими новичками рассматривается как «магия» в чистом виде. Свою статью можно было бы написать, однако, я себя не считаю а) достаточно компетентным, чтобы чему-то учить и б) обладающим языком, позволяющим написать приличную статью.
Если вас все-таки действительно интересует мой взгляд на решение подобных задач, то, принимая во внимание хотя бы одного заинтересованного читателя, я постараюсь выкроить время, подобрать подходящую задачу и описать свои подходы к ее решению.
Если вас все-таки действительно интересует мой взгляд на решение подобных задач, то, принимая во внимание хотя бы одного заинтересованного читателя, я постараюсь выкроить время, подобрать подходящую задачу и описать свои подходы к ее решению.
Sign up to leave a comment.
Как быстро и просто написать DSL на Ruby