Pull to refresh

Comments 20

Мне одному кажется что bank.send_money как-то не по дзену? Логичнее было бы from.send_money 10, to

Но за статью спасибо.
Возможно это не область ответственности классов аккаунтов — знать как переводить деньги, они просто хранят свое текущее состояние. А вообще я думаю автор об этом не задумывался даже, главное же показать принцип и сделать это просто, а не по дзену :)
Вполне себе хорошо. А еще лучше Transaction.create и параметры. Но точно не from.send_money 10, to
если уж придираться то: account.send_money(10).to another_account
Кавай и няша. Вот только на питоне ЕСТЬ блоки. with называются.
Я не знаком с Python, но немного гугления дало понять, что with — это все-таки не совсем аналог блоков Ruby, хотя и похоже. Или я не прав?
Вы правы. Оператор with не имеет никакого отношения к блокам Ruby.

Скорее он близок к оператору using в C#.
да, это не совсем аналог, тем не менее, для транзакций это как раз самое то —
with transaction():
do…
если свалися — rollback автоматом, если закончится — commit автоматом.
Хм… Извините, но ruby-код (1):

def fib(n)
  memoize(:fib, n) do
    time(:fib, n) do
      synchronize(:fib) do
        if n <= 1
          1
        else
          fib(n - 1) * fib(n - 2)
        end
      end
    end
  end
end


с Python-кодом (2):

@synchronize
@time
@memoize
def fib(n):
  if n <= 1:
    return 1
  else
    return fib(n - 1) * fib(n - 2)


и тем более с ruby-кодом (3) даже с учётом вашей реализации декораторов:

+Synchronized
+Timed
+Memoized

def fib(n)
  if n <= 1
    1
  else
    fib(n - 1) * fib(n - 2)
  end
end


Никак не могут считаться эквивалентными друг другу.

Вы похоже на ruby пытаетесь писать как на python. Код (3) сложно назвать естественным для руби. Eсть несколько вариантов сделать это более естественным для ruby способом.

Например, я бы код (3) реализовал так:

synchronize time memoize { fib(n) }

где synchronize, time, memoize это функции, принимающие в качестве параметра объект класса proc.

На Ruby надо писать как на Ruby, а на Python как на Python. Это разные языки. У каждого языка свои языковые конструкции, инструменты и ограничения, и соответственно свои методы и стиль решения задач. Что-то есть интересное в Python, но нет в Ruby. Что-то наоборот. И это нормально.

Один язык уже есть, куда попытались всё втиснуть. У него даже название характерное — Язык Ада.

Но статья небесполезная. Дает пищу для размышления. Мне по крайней мере. Спасибо…
Точнее не вы, а автор. Пардон…
В оригинальной презентации, автор в конце говорит, что: «ruby > python, поскольку любую фичу из python мы можем реализовать в ruby, но не наоборот»
Думаю он просто сделал proof of concept, не особо намекая на то, что это надо использовать.
Но как красиво автор жонглирует синтаксисом! И манки-патчинг, и операторы, и элегантное решение с +Class. Я задумался о том, как плохо я знаю Ruby.
Э-э… Есть подозрение, что автор статьи (не переводчик :)) именно это и хотел продемонстрировать своей статьей.

Перегрузка операторов, это «крутая» штука, но в массе своей мало востребованная и даже вредная.

Было время я «умирал» от крутости перегрузки операторов в С++ и использовал это где надо и где не надо. Пока однажды не пришлось самому разбираться в коде такого же как я любителя перегрузки операторов. После этого зарёкся…
Вы это реализовали с точки зрения вызова. А декораторы описываются с точки зрения определения метода и повторного использования этих кода в декораторах. Тут ближе подход реализованный методом synchronize в AS.
github.com/rails/rails/blob/d9c288207731e61c40ce6276fd91f0b800d3fabb/activesupport/lib/active_support/core_ext/module/synchronization.rb#L20

Но он, естественно, неуниверсальный.
Магическая палочка типа @synchronize вообще мне кажется бредовой идеей, нечто похожее на аннотации Java. Сильно усложняет понимание кода
в итоге получился сферический конь. нет, я не против задачек во имя академического интереса, но тут совсем мало практической пользы — все можно сделать гораздо красивей на чистом руби
Было бы здорово увидеть пример.
Тут далеко ходить не надо
ActiveRecord::Base.transaction do
end

выглядит читабельней и понятней и гораздо проще в отладке и тестах
таким же блоком я ловлю ошибки и посылаю оповещения о них
ruby суперский язык, в котором можно вывернуться как угодно (ну или почти как угодно), но не стоит придумывать гемор. проще надо быть — KISS
все это имхо
даже alias_method и то понятней :)
Sign up to leave a comment.

Articles