рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдорд╛рдЗрдХрд▓ рдлреЗрдпрд░рд▓реА рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВ - рд░реВрдмреА рдХреЗ рд╕рд╛рде рд░реВрдмреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ ред рдореИрдВрдиреЗ рддреАрдиреЛрдВ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЕрдзрд┐рдХрддрдо рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдореВрд▓реНрдп рдФрд░ рд▓рд╛рдн рд╣реИред рдлрд┐рд░ рднреА, рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдкреВрд░реА рдкреНрд░рд╕реНрддреБрддрд┐ рдкрдврд╝реЗрдВ, рдЬреЛ рдХрд┐ рдкрд╛рдпрдерди рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣рд╛рд╕реНрдХреЗрд▓ рдФрд░ рд╕реНрдХрд╛рд▓рд╛ рд╕реЗ рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдЪрд┐рдкреНрд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИредрд╕рдорд╛рд░реЛрд╣ рд╕рдЬреНрдЬрд╛рдХрд╛рд░
рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рдРрд╕реА рдЪреАрдЬ рд╣реИ - рд╕рдЬреНрдЬрд╛рдХрд╛рд░, рдЬреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдЪреАрдиреА рд╣реИред рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рд╡реЗ рд░реВрдмреА рдореЗрдВ рдХреНрдпреЛрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдВ рдкрд╛рдпрдерди рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдХрд╛рдо рдХрд░рддрд╛ рдерд╛, рдФрд░ рдлрдВрдХреНрд╢рди рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬреЛ рдореИрдВ рддрдм рд╕реЗ рдЧрд╛рдпрдм рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣рдо рд▓рдЧрднрдЧ рд╕рднреА рдХреЛ рдЕрдкрдирд╛ рд░реВрдмреА рдХреЛрдб рдХреНрд▓реАрдирд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд░реВрдмреА рд▓реЗ рд▓реЛ рдФрд░ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░реЛ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдмреИрдВрдХ рдЦрд╛рддреЗ рд╕реЗ рджреВрд╕рд░реЗ рдЦрд╛рддреЗ рдореЗрдВ рдкреИрд╕рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ, рд╣реИ рдирд╛?
def send_money(from, to, amount) from.balance -= amount to.balance += amount from.save! to.save! end
рд╣рдо рдЦрд╛рддреЗ
рд╕реЗ "рд╢реЗрд╖" рд░рд╛рд╢рд┐ рдХреЛ рдХрд╛рдЯ
рд▓реЗрддреЗ рд╣реИрдВ ...
from.balance -= amount
рдФрд░ рд╣рдо рдЗрд╕ рд░рд╛рд╢рд┐
рдХреЛ "рдЦрд╛рддреЗ" рдХреЗ рд╢реЗрд╖ рд░рд╛рд╢рд┐ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ ...
to.balance += amount
рдФрд░ рджреЛрдиреЛрдВ рдЕрдХрд╛рдЙрдВрдЯ рдХреЛ рд╕реЗрд╡ рдХрд░реЗрдВред
from.save! to.save!
рд▓реЗрдХрд┐рди рдХреБрдЫ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдПрдХ рд▓реЗрди-рджреЗрди рдХреА рдХрдореА (рдпрджрд┐ "
from.save! "
рд╕рдлрд▓ рд╣реЛрддреА рд╣реИ , рд▓реЗрдХрд┐рди "
to.save! " рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдкреИрд╕рд╛ рд╣рд╡рд╛ рдореЗрдВ рдШреБрд▓ рдЬрд╛рдПрдЧрд╛)ред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, ActiveRecord рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдмрд╣реБрдд рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред рд╣рдо рдмрд╕ рдПрдХ рд▓реЗрдирджреЗрди рд╡рд┐рдзрд┐ рдХреЗ рдмреНрд▓реЙрдХ рдореЗрдВ рдЕрдкрдирд╛ рдХреЛрдб рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╣рдореЗрдВ рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд╕рдм рдХреБрдЫ рдпрд╛ рддреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
def send_money(from, to, amount) ActiveRecord::Base.transaction do from.balance -= amount to.balance += amount from.save! to.save! end end
рдЖрдЗрдП рдЕрдм рдЙрд╕реА рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкрд╛рдпрдерди рдореЗрдВ рджреЗрдЦреЗрдВред рдПрдХ рд▓реЗрдирджреЗрди рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд▓рдЧрднрдЧ рд░реВрдмреА рдореЗрдВ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
def send_money(from, to, amount): from.balance -= amount to.balance += amount from.save() to.save()
рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд▓реЗрди-рджреЗрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдФрд░ рдХреЛрдб рдЕрдм рдмрд╣реБрдд рд╕реБрдВрджрд░ рдирд╣реАрдВ рд▓рдЧ рд░рд╣рд╛ рд╣реИред
def send_money(from, to, amount): try: db.start_transaction() from.balance -= amount to.balance += amount from.save() to.save() db.commit_transaction() except: db.rollback_transaction() raise
рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рдХреЛрдб рдХреА 10 рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ 4 рд╣рдорд╛рд░реЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
from.balance -= amount to.balance += amount from.save() to.save()
рдЕрдиреНрдп 6 рд▓рд╛рдЗрдиреЗрдВ рд▓реЗрди-рджреЗрди рдХреЗ рдЕрдВрджрд░ рд╣рдорд╛рд░реЗ рддрд░реНрдХ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИрдВред рдпрд╣ рдмрджрд╕реВрд░рдд рдФрд░ рдмрд╣реБрдд рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░ - рдЖрдкрдХреЛ рдЗрди рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕рд╣реА рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдФрд░ рд░реЛрд▓рдмреИрдХ рд╢рдмреНрджрд╛рд░реНрде рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред
def send_money(from, to, amount): try: db.start_transaction() ... db.commit_transaction() except: db.rollback_transaction() raise
рддреЛ рд╣рдо рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рдХреИрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЦреБрдж рдХреЛ рдХрдо рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ? рдкрд╛рдпрдерди рдореЗрдВ рдХреЛрдИ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд░реВрдмреА рдХреА рддрд░рд╣ рдПрдХ рдлреЛрдХрд╕ рдпрд╣рд╛рдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд╛рдпрдерди рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдФрд░ рдкреБрди: рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо "
рдЯреНрд░рд╛рдВрд╕реЗрдХреНрд╢рдирд▓ " рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рджреВрд╕рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЙрд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓реЗрдирджреЗрди рдХреЛрдб рдореЗрдВ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рд╣реИрдВред
def send_money(from, to, amount): from.balance -= amount to.balance += amount from.save() to.save() send_money = transactional(send_money)
рдФрд░ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐
рдЯреНрд░рд╛рдВрд╕реЗрдХреНрд╢рдирд▓ рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ ...
def transactional(fn): def transactional_fn(*args): try: db.start_transaction() fn(*args) db.commit_transaction() except: db.rollback_transaction() raise return transactional_fn
рдпрд╣ рдЕрдкрдиреЗ рдПрдХрдорд╛рддреНрд░ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди ("
send_money " рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ) рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
def transactional(fn):
рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдп рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
def transactional_fn(*args):
рдирдП рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд▓реЗрди-рджреЗрди рдореЗрдВ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реЛрддрд╛ рд╣реИред
try: db.start_transaction() ... db.commit_transaction() except: db.rollback_transaction() raise
рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЕрдВрджрд░, рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдирдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред
fn(*args)
рдЕрдВрдд рдореЗрдВ, рдирдпрд╛ рдлреАрдЪрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИред
return transactional_fn
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо
send_money рдлрд╝рдВрдХреНрд╢рди рдХреЛ
рдЯреНрд░рд╛рдВрд╕реЗрдХреНрд╢рдирд▓ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЕрднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ рдЬреЛ
Send_money рдлрд╝рдВрдХреНрд╢рди рдХреЗ
рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рднреА рд▓реЗрдирджреЗрди рдХреЗ рдЕрдВрджрд░ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдлрд┐рд░ рд╣рдо рдЕрдкрдиреА рдореВрд▓ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реБрдП рдЗрд╕ рдирдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣рдорд╛рд░реЗ
send_money рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВред рдЕрдм, рдЬрдм рднреА рд╣рдо
send_money рдлрд╝рдВрдХреНрд╢рди рдХреЛ
рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд▓реЗрдирджреЗрди рд╕рдВрд╕реНрдХрд░рдг рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред
send_money = transactional(send_money)
рдФрд░ рдпрд╣реА рдореИрдВ рдЗрд╕ рд╕рдордп рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рдореБрд╣рд╛рд╡рд░рд╛ рдЕрдХреНрд╕рд░ рдкрд╛рдпрдерди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдбреЗрдХреЛрд░реЗрдЯрд░, рдЗрд╕реЗ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдпрд╣ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЖрдк Django ORM рдореЗрдВ рдХреБрдЫ рд▓реЗрдирджреЗрди рдХрд░рддреЗ рд╣реИрдВред
@transactional def send_money(from, to, amount): from.balance -= amount to.balance += amount from.save() to.save()
рддреЛ рдХреНрдпрд╛?
рдЕрдм рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ, тАЬрддреЛ рдХреНрдпрд╛? рдЖрдкрдиреЗ рдЕрднреА рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдпрд╣ рд╕рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдореБрдВрдмрд╛-рдпреБрдореНрдмрд╛ рдЙрд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рд▓ рдХрд░рддреА рд╣реИред рд╣рдореЗрдВ рд░реВрдмреА рдореЗрдВ рдЗрд╕ рдЯреЛрдкреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? тАЭрдареАрдХ рд╣реИ, рдЖрдЗрдП рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдЙрд╕ рдорд╛рдорд▓реЗ рдкрд░ рдЬрд┐рд╕рдореЗрдВ рдмреНрд▓реЙрдХ рдЕрдм рдЗрддрдиреЗ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдирд╣реАрдВ рджрд┐рдЦрддреЗред
рдЖрдЗрдП рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ nth рддрддреНрд╡ рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред
def fib(n) if n <= 1 1 else fib(n - 1) + fib(n - 2) end end
рд╡рд╣ рдзреАрдорд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрд╕реЗ рдпрд╛рдж рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдо рддреМрд░ рдкрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг "
= = " рд╣рд░ рдЬрдЧрд╣ рд╣реИ, рдЬреЛ рдПрдХ рд▓реЗрдирджреЗрди рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдмреАрдорд╛рд░реА рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИ - рд╣рдо рдЕрдкрдиреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХреЛрдб рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдШреЗрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
def fib(n) @fib ||= {} @fib[n] ||= if n <= 1 1 else fib(n - 1) + fib(n - 2) end end
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдпрд╣рд╛рдВ рдХреБрдЫ рдЪреАрдЬреЛрдВ рдХреЛ рднреВрд▓ рдЧрдП, рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рддрдереНрдп рдХрд┐ "рдиреАрд▓" рдФрд░ "рдЧрд▓рдд" рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдпрд╛рдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдПрдХ рдФрд░ рдмрд┐рдВрджреБ рдЬрд┐рд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
def fib(n) @fib ||= {} return @fib[n] if @fib.has_key?(n) @fib[n] = if n <= 1 1 else fib(n - 1) + fib(n - 2) end end
рдареАрдХ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдПрдХ рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмреНрд▓реЙрдХ рдХреЗ рдкрд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рдпрд╛ рддрд░реНрдХреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
def fib(n) memoize(:fib, n) do if n <= 1 1 else fib(n - 1) + fib(n - 2) end end end
рдФрд░ рдЕрдм, рдЕрдЧрд░ рд╣рдо рдХреЛрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдФрд░ рдЕрдзрд┐рдХ рдмреНрд▓реЙрдХ рдЬреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ ...
def fib(n) memoize(:fib, n) do time(:fib, n) do if n <= 1 1 else fib(n - 1) + fib(n - 2) end end end end
... рд╣рдо рдмрд╛рд░-рдмрд╛рд░ рд╡рд┐рдзрд┐ рдХреЗ рдирд╛рдо рдФрд░ рдЙрд╕рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдВрдЧреЗред
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
рдпрд╣ рдПрдХ рдирд╛рдЬрд╝реБрдХ рдирд┐рд░реНрдорд╛рдг рд╣реИ рдФрд░ рдпрд╣ рдЙрд╕реА рдХреНрд╖рдг рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ рдЬрдм рд╣рдо рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╡рд┐рдзрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░реЗрдВрдЧреЗред
рдлрд┐рд░ рднреА, рд╣рдорд╛рд░реА рдкрджреНрдзрддрд┐ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдареАрдХ рдмрд╛рдж рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬрд╝ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
def fib(n) if n <= 1 1 else fib(n - 1) + fib(n - 2) end end ActiveSupport::Memoizable.memoize :fib
рдФрд░ рдпрд╣ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдордиреЗ рдкрд╛рдпрдерди рдореЗрдВ рдХреНрдпрд╛ рджреЗрдЦрд╛ рдерд╛ - рдЬрдм рд╡рд┐рдзрд┐ рдХрд╛ рд╕рдВрд╢реЛрдзрди рд╕реНрд╡рдпрдВ рд╡рд┐рдзрд┐ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЪрд▓рд╛ рдЧрдпрд╛ред
рдХреНрдпреЛрдВ рдкрд╛рдпрдерди рд╕рдореБрджрд╛рдп рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рдирд╣реАрдВ рдерд╛? рджреЛ рдХрд╛рд░рдг:
- рдЕрдм рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рдЯреНрд░реИрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;
- рдХрд╣реАрдВ рднреА рд╡рд┐рдзрд┐ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдЖрдП рдХреЛрдб рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред
рдЖрдЗрдП рдкрд╛рдпрдерди рдореЗрдВ рд╣рдорд╛рд░реЗ рдлрд┐рдмреЛрдирд╛рдЪреА рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВред
def fib(n): if n <= 1: return 1 else return fib(n - 1) + fib(n - 2)
рд╣рдо рдЗрд╕реЗ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ
рдореЗрдореЛрдЗрдЬрд╝ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде
рд╕рдЬрд╛рддреЗ рд╣реИрдВред
@memoize def fib(n): if n <= 1: return 1 else return fib(n - 1) + fib(n - 2)
рдФрд░ рдЕрдЧрд░ рд╣рдо рдЕрдкрдиреА рд╡рд┐рдзрд┐ рдХреЗ рдЪрд▓ рд░рд╣реЗ рд╕рдордп рдХреЛ рдорд╛рдкрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕рдХреА рдХреЙрд▓ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рд┐рд░реНрдл рдПрдХ рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╡рд╣ рд╕рдм рд╣реИред
@synchronize @time @memoize def fib(n): if n <= 1: return 1 else return fib(n - 1) + fib(n - 2)
рдФрд░ рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рд░реВрдмреА рдореЗрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ("@" рдХреЗ рдмрдЬрд╛рдп "+" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рдмрдбрд╝реЗ рдЕрдХреНрд╖рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рд▓рд╛ рдЕрдХреНрд╖рд░)ред рдФрд░ рд╕рдмрд╕реЗ рдордЬреЗрджрд╛рд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд░реВрдмреА рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИ, рдХреЛрдб рдХреА рд╕рд┐рд░реНрдл 15 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рдеред
+Synchronized +Timed +Memoized def fib(n) if n <= 1 1 else fib(n - 1) + fib(n - 2) end end
рдбреБрдмрдХреА
рдЖрдЗрдП рдЕрдкрдиреЗ
send_money рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рд╣рдо рдЗрд╕рдореЗрдВ
рдЯреНрд░рд╛рдВрдЬреЗрдХреНрд╢рдирд▓ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
+Transactional def send_money(from, to, amount) from.balance -= amount to.balance += amount from.save! to.save! end
Transactional рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдПрдХ рдЙрдкрд╡рд░реНрдЧ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВред
class Transactional < Decorator def call(orig, *args, &blk) ActiveRecord::Base.transaction do orig.call(*args, &blk) end end end
рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ
рдХреЙрд▓ рд╡рд┐рдзрд┐ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдорд╛рд░реА рдореВрд▓ рдкрджреНрдзрддрд┐ рдХреЗ рдмрдЬрд╛рдп рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд╣ рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ "рд░реИрдк", рдЙрд╕рдХреЗ рддрд░реНрдХ рдФрд░ рдЙрд╕рдХреЗ рдмреНрд▓реЙрдХ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдЙрд╕реЗ рдкрд╛рд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
def call(orig, *args, &blk)
рд╣рдо рдПрдХ рд▓реЗрди-рджреЗрди рдЦреЛрд▓рддреЗ рд╣реИрдВред
ActiveRecord::Base.transaction do
рдФрд░ рдлрд┐рд░ рд╣рдо рд▓реЗрдирджреЗрди рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдореВрд▓ рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВред
orig.call(*args, &blk)
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдкрд╛рдЗрдерди рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╕реЗ рдЕрд▓рдЧ рд╣реИред рддрд░реНрдХреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдирдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдорд╛рд░реЗ рд░реВрдмреА рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд╣рд░ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд╕реНрд╡рдпрдВ рдФрд░ рдЙрд╕рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреАред рд░реВрдмреА рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА рддрд░реАрдХреЛрдВ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдХрд╛рд░рдг рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдиреАрдЪреЗ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рдХрдХреНрд╖рд╛ "
рдбреЗрдХреЛрд░реЗрдЯрд░ " рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реИ?
class Decorator def self.+@ @@decorator = self.new end def self.decorator @@decorator end def self.clear_decorator @@decorator = nil end end
рдпрд╣ рдЪреАрдЬрд╝, "
+ @ ", "рдпреВрдиреАрд░реА рдкреНрд▓рд╕" рдСрдкрд░реЗрдЯрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рддрдм рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рд╣рдо
+ рдбреЗрдХреЛрд░реЗрдЯрд░рдирд╛рдо рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ
+ рд▓реЗрди-рджреЗрди рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ред
def self.+@
рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рднреА рдЪрд╛рд╣рд┐рдПред
def self.decorator @@decorator end
рдФрд░ рд╡рд░реНрддрдорд╛рди рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ред
def self.clear_decorator @@decorator = nil end
рдПрдХ рд╡рд░реНрдЧ рдЬреЛ рд╕рдЬрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдЙрд╕реЗ
рдореЗрдердбреЗрдХрдЯреЛрд░рд░реНрд╕ рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
class Bank extend MethodDecorators +Transactional def send_money(from, to, amount) from.balance -= amount to.balance += amount from.save! to.save! end end
рддреБрд░рдВрдд рдХреНрд▓рд╛рд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдгрдп рдХреЛ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╡рд┐рд╡реЗрдХ рдкрд░ рдЫреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
module MethodDecorators def method_added(name) super decorator = Decorator.decorator return unless decorator Decorator.clear_decorator orig_method = instance_method(name) define_method(name) do |*args, &blk| m = orig_method.bind(self) decorator.call(m, *args, &blk) end end end
"
Method_added " рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдирд┐рдЬреА рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рд░ рдмрд╛рд░ рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдХреЛ рдХрдХреНрд╖рд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╣рдореЗрдВ рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдХрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдорд┐рд▓ рдЬрд╛рддрд╛ рд╣реИред
def method_added(name)
рдкреИрд░реЗрдВрдЯ
рдореЗрдердб_рдбреЗрдб рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред рдЖрдк "
method_added ", "
method_missing " рдпрд╛ "
response_to " рдЬреИрд╕реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВ
? "рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
super
рд╣рдо рд╡рд░реНрддрдорд╛рди рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдХреЛрдИ рдбреЗрдХреЛрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдВ, рдЕрдиреНрдпрдерд╛ рд╡рд░реНрддрдорд╛рди рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд╢реВрдиреНрдп рдХрд░реЗрдВред рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддрдм рд╣рдо рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдлрд┐рд░ рд╕реЗ рд╣рдорд╛рд░реЗ "
method_added " рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
decorator = Decorator.decorator return unless decorator Decorator.clear_decorator
рд╣рдо рд╡рд┐рдзрд┐ рдХрд╛ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред
orig_method = instance_method(name)
рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред
define_method(name) do |*args, &blk|
"
Instance_method " рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "
UnboundMethod " рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреА рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рд╡рд╕реНрддреБ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рд╡рд╕реНрддреБ рд╕реЗ рдмрд╛рдВрдзрдирд╛ рдЪрд╛рд╣рд┐рдПред
m = orig_method.bind(self)
рдФрд░ рдлрд┐рд░ рд╣рдо рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдмреБрд▓рд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдореВрд▓ рд╡рд┐рдзрд┐ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рджреЗрддреЗ рд╣реИрдВред
decorator.call(m, *args, &blk)
рдФрд░ рдХреНрдпрд╛?
рдмреЗрд╢рдХ, рдЗрд╕ рдХреЛрдб рдХреЛ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдПрдХ рдирдВрдмрд░ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХрдИ рд╕рдЬреНрдЬрд╛рдХрд╛рд░
рдЬрд┐рд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдореИрдВрдиреЗ рд╣рд╡рд╛рд▓рд╛ рджрд┐рдпрд╛, рд╡рд╣ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
+Timed +Memoized def fib(n) ... end
рдХреНрд╖реЗрддреНрд░
Define_method рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдирд┐рдЬреА рдФрд░ рд╕рдВрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЙрдирдХреЗ рджрд╛рдпрд░реЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕рдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
private +Transactional def send_money(from, to, amount) ... end
рдХреНрд▓рд╛рд╕ рдХреЗ рддрд░реАрдХреЗ
"
Method_added " рдФрд░ "
define_method " рдХреЗрд╡рд▓ рдХрдХреНрд╖рд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдХреБрдЫ рдФрд░ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рддрд╛рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдВред
+Memoize def self.calculate ... end
рдмрд╣рд╕
рдкрд╛рдпрдерди рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рд╣рдо рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдорд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВред
+Retry.new(3) def post_to_facebook ... end
рдордгрд┐ рд╕реНрдерд╛рдкрд┐рдд method_decorators
github.com/michaelfairley/method_decoratorsрдореИрдВрдиреЗ рдЗрди рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдкреВрд░реНрдг рд╕реЗрдЯ рдЬреЛрдбрд╝рд╛ рдФрд░ рдЗрд╕реЗ рд╕рднреА рдХреЛ рдордгрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд░реЛрд▓ рдЖрдЙрдЯ рдХрд┐рдпрд╛ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдХреНрд▓реАрдирд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред