August 2010
Intermediate to advanced
376 pages
10h 6m
English
This rendition comes from Steen Lehmann.
require 'osx/cocoa'
#!/usr/bin/env ruby
# Lean Architecture example in Ruby -
# with ContextAccessor
# Module that can be mixed in to any class
# that needs access to the current context. It is
# implemented as a thread-local variable.
module ContextAccessor
def context
Thread.current[:context]
end
def context=(ctx)
Thread.current[:context] = ctx
end
def execute_in_context
old_context = self.context
self.context = self
yield
self.context = old_context
end
end#
# This is the base class (common code) for all
# Account domain classes.
#
class Account
attr_reader :account_id, :balance
def initialize(account_id)
@account_id = account_id
@balance = 0
end
def decreaseBalance(amount)
raise "Bad argument to withdraw" if amount < 0
raise "Insufficient funds" if amount > balance
@balance -= amount
end
def increaseBalance(amount)
@balance += amount
end
def update_log(msg, date, amount)
puts "Account: #{inspect}, #{msg}, \ #{date.to_s},
#{amount}"
end
def self.find(account_id)
@@store ||= Hash.new
return @@store[account_id] if @@store.has_key?
account_id
if :savings == account_id
account = SavingsAccount.new(account_id)
account.increaseBalance(100000)
elsif :checking == account_id
account = CheckingAccount.new(account_id)
else
account = Account.new(account_id)
end
@@store[account_id] = account
account
end
end# This module is the methodless role type. Since # we don't really use types to declare identifiers, # it's kind ...