Prägnante Ruby messages

Im verfügbaren Ruby Methoden Namensraum gibt auch Methodennamen, die auch von den collection Klassen Array und Hash bekannt sind. Da sie sehr gebräuchlich sind, ist es schnell und einfach zu verstehen, was die Methoden machen; besonders wenn sie in einem ähnlichen Kontext verwendet werden.
Zum Beispiel ein einfaches Bankkonto:

class BankAccount
  def initialize attributes={}
    valid_keys = %i(name amount)
    @attributes = attributes.select { |key, value| valid_keys.include?(key) }
  end

  def add_money money
    @attributes[:amount] += money
  end

  def attribute key
    @attributes[key]
  end

  def set_attribute key, value
    @attributes[key] = value
  end
end

funktioniert zwar:

bank_account = BankAccount.new name: 'Chris', amount: 1000
bank_account.add_money 300 # => 1300
bank_account.set_attribute :amount, 2000 # => 2000
bank_account.attribute :name # => "Chris"

aber ist offensichtlich ziemlich umständlich. Besonders der setter BankAccount#set_attribute sieht ungünstig aus.
Glücklicherweise kann die Klasse refactored werden, indem sich aus dem Ruby Methoden Namensraum bedient wird:

class BankAccount
  def initialize attributes={}
    valid_keys = %i(name amount)
    @attributes = attributes.select { |key, value| valid_keys.include?(key) }
  end

  def << money
    @attributes[:amount] += money
  end

  def [] key
    @attributes[key]
  end

  def []= key, value
    @attributes[key] = value
  end
end

Die Verwendung der accessors ist dann sehr viel ausdruckstärker und prägnanter:

bank_account = BankAccount.new name: 'Chris', amount: 1000
bank_account << 300 # => 1300
bank_account[:amount] = 2000 # => 2000
bank_account[:name] # => "Chris"

Es ist es wert.