Pull to refresh

Comments 26

UFO just landed and posted this here
Пример красивый, спасибо. Сейчас внесу в статью. Но вот обоснование немного некорректно. Это все-таки не приоритеты операторов, а порядок разбора аргументов функции, когда мы передаем их без скобок.
UFO just landed and posted this here
Я к тому, что do end и {} это операторные скобки. Сами они вроде как не операторы. (Тапками кидаться можно, в терминологии постоянно путаюсь)
UPD. По приведенной ссылке с приоритетом операторов нет операторных скобок (либо я совсем слепой).
UFO just landed and posted this here
Спасибо за информацию. А можно ссылку, чтобы проникнуться? Вообще, очень люблю Ruby, но иногда он все-таки действительно очень японский.
UFO just landed and posted this here
Хм… В спокойной обстановке я пересмотрю, конечно, но беглым взглядом про приоритеты операторных скобок я там ничего не увидел, потому и вопрос, собственно.
Дискуссия к сожалению утеряна.
К сожалению да. Восстановил комментарий, начавший тред, в статье. Искать по «mudasobwa».
Как то ужасно стало после прочтения. Может мест где ошибиться стало меньше, но код стал куда сложнее и запутаннее, особенно для того кто не писал его.
Как там у нас говорят:
Явное лучше, чем неявное.
Простое лучше, чем сложное.
Мне тоже не очень нравится использованный автором подход. Но, имхо, если заменить это
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
Ну что сказать. Предложенный Вами синтаксис самый логичный, конечно. Сам я, кстати говоря, при решении подобной задачи использовал примерно такой же. Единственное, все может сломаться, если круг задач шире, чем указанный автором при написании статьи. Тогда простая конфигурация хешем уже может и не проскочить (например, нам надо как-то хитро конфигурировать еще и саму модель, а не только штато-зависимые поля)

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, а потом его запрограммировать. Правда, пошаговую статью тогда было бы не написать.

Противоречит с
В данном случае, мы будем работать «задом наперед»: вместо того, чтобы начинать с создания классов и методов, мы разработаем идеальный синтаксис и будем строить все остальное вокруг него.
UFO just landed and posted this here
Заворачивается в Proc <=> требует лишних телодвижений, добавляет слабочитаемой лапши и может поиметь сайд-эффекты от которых опять же можно поседеть. Приведенный Вами пример кода это, имхо, прекрасно демонстрирует (или это был такой тонкий троллинг?).
UFO just landed and posted this here
А поясните пожалуйста про store_accessor.
Что именно? Если что это такое, то здесь есть исчерпывающий ответ. Если коротко, то это вариант на тему attr_accessor для сериализованных полей.
А где именно в вашем примере сказано, что наследоваться нужно от AR?
В коде по ссылке. Когда читал оригинал, сразу же туда полез смотреть, как оно все устроено. Мне всегда казалось, что со стеком проще ознакомиться взглянув на код.

Вообще, этот код создавался явно не для копипасты, а как иллюстрация принципов, поэтому не очень роляет, какая ORM использована.
Store_accessor не имеет отношения к ORM в контексте иллюстрации принципов DSL.
В общем, у тех кому нужно объяснять принципы построения DSL, store_acсessor вызывает сильную головную больше, поскольку не каждый джун использует AR без рельсы.
Далее, про принципы:
в чем разница между
MyClass.new.instance_eval { say_hello } # => 'Hello!'
и
MyClass.new.say_hello # => 'Hello!'
не ясно
Пожалуй, тут мой косяк. Несмотря на то, что в оригинальной статье прямо не сказано про то, что весь код написан в рамках рельсов (хотя, при отсылке к репозиторию это указано), стоило в шапке перевода указать. Так что тут, скорее, «не каждый джун использует рельсу без AR».

Далее, про принципы:
в чем разница между
MyClass.new.instance_eval { say_hello } # => 'Hello!'
и
MyClass.new.say_hello # => 'Hello!'
не ясно

В этом случае разницы никакой, да. Но, ИМХО, достаточно очевидно, что первый способ позволяет внутрь блока засунуть что угодно так, что будет казаться, что мы описали у класса новый метод и его вызвали.

PS. Вообще, у меня сложилось впечатление, что вы упорно считаете меня автором, хотя я всего лишь переводчик. Более того, как видно из преамбулы и некоторых комментариев, я далеко не всегда согласен с автором.
Вы же решились перевести эту статью? Можно было бы написать свою, а на эту сослаться, как делают в большинстве научных работ.
Решился, потому что подходы интересны. Достаточно понятно объяснено то, что многими новичками рассматривается как «магия» в чистом виде. Свою статью можно было бы написать, однако, я себя не считаю а) достаточно компетентным, чтобы чему-то учить и б) обладающим языком, позволяющим написать приличную статью.
Если вас все-таки действительно интересует мой взгляд на решение подобных задач, то, принимая во внимание хотя бы одного заинтересованного читателя, я постараюсь выкроить время, подобрать подходящую задачу и описать свои подходы к ее решению.
Проблема не в наличии взгляда, но в способности оратора этот взгляд донести.
Sign up to leave a comment.

Articles