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, хотя и похоже. Или я не прав?
You Win an Internet!
Хм… Извините, но ruby-код (1):
с Python-кодом (2):
и тем более с ruby-кодом (3) даже с учётом вашей реализации декораторов:
Никак не могут считаться эквивалентными друг другу.
Вы похоже на ruby пытаетесь писать как на python. Код (3) сложно назвать естественным для руби. Eсть несколько вариантов сделать это более естественным для ruby способом.
Например, я бы код (3) реализовал так:
где synchronize, time, memoize это функции, принимающие в качестве параметра объект класса proc.
На Ruby надо писать как на Ruby, а на Python как на Python. Это разные языки. У каждого языка свои языковые конструкции, инструменты и ограничения, и соответственно свои методы и стиль решения задач. Что-то есть интересное в Python, но нет в Ruby. Что-то наоборот. И это нормально.
Один язык уже есть, куда попытались всё втиснуть. У него даже название характерное — Язык Ада.
Но статья небесполезная. Дает пищу для размышления. Мне по крайней мере. Спасибо…
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. Что-то наоборот. И это нормально.
Один язык уже есть, куда попытались всё втиснуть. У него даже название характерное — Язык Ада.
Но статья небесполезная. Дает пищу для размышления. Мне по крайней мере. Спасибо…
Точнее не вы, а автор. Пардон…
Но как красиво автор жонглирует синтаксисом! И манки-патчинг, и операторы, и элегантное решение с +Class. Я задумался о том, как плохо я знаю Ruby.
Э-э… Есть подозрение, что автор статьи (не переводчик :)) именно это и хотел продемонстрировать своей статьей.
Перегрузка операторов, это «крутая» штука, но в массе своей мало востребованная и даже вредная.
Было время я «умирал» от крутости перегрузки операторов в С++ и использовал это где надо и где не надо. Пока однажды не пришлось самому разбираться в коде такого же как я любителя перегрузки операторов. После этого зарёкся…
Перегрузка операторов, это «крутая» штука, но в массе своей мало востребованная и даже вредная.
Было время я «умирал» от крутости перегрузки операторов в С++ и использовал это где надо и где не надо. Пока однажды не пришлось самому разбираться в коде такого же как я любителя перегрузки операторов. После этого зарёкся…
Вы это реализовали с точки зрения вызова. А декораторы описываются с точки зрения определения метода и повторного использования этих кода в декораторах. Тут ближе подход реализованный методом synchronize в AS.
github.com/rails/rails/blob/d9c288207731e61c40ce6276fd91f0b800d3fabb/activesupport/lib/active_support/core_ext/module/synchronization.rb#L20
Но он, естественно, неуниверсальный.
github.com/rails/rails/blob/d9c288207731e61c40ce6276fd91f0b800d3fabb/activesupport/lib/active_support/core_ext/module/synchronization.rb#L20
Но он, естественно, неуниверсальный.
Магическая палочка типа @synchronize вообще мне кажется бредовой идеей, нечто похожее на аннотации Java. Сильно усложняет понимание кода
в итоге получился сферический конь. нет, я не против задачек во имя академического интереса, но тут совсем мало практической пользы — все можно сделать гораздо красивей на чистом руби
Было бы здорово увидеть пример.
Тут далеко ходить не надо
выглядит читабельней и понятней и гораздо проще в отладке и тестах
таким же блоком я ловлю ошибки и посылаю оповещения о них
ruby суперский язык, в котором можно вывернуться как угодно (ну или почти как угодно), но не стоит придумывать гемор. проще надо быть — KISS
все это имхо
ActiveRecord::Base.transaction do
end
выглядит читабельней и понятней и гораздо проще в отладке и тестах
таким же блоком я ловлю ошибки и посылаю оповещения о них
ruby суперский язык, в котором можно вывернуться как угодно (ну или почти как угодно), но не стоит придумывать гемор. проще надо быть — KISS
все это имхо
Sign up to leave a comment.
Расширяем Ruby с помощью Ruby: заимствуем у Python декораторы функции