A Day in the Life

2005-10-24

AoE3

届いた!ヤバス!

TDD13章

あーどこのインターフェイスにまとめりゃいいとかまだまだだなぁ。リファクタリング力がタリナサス。

TDD12章

日本語が難しくなってまいりました。(長瀬メソッド)

rubyのIntegerの加算

ってInteger#+しか無いんだっけ?うー

これ

サブクラス作る必要ないよなぁ。Currentで定義してあるもんだけ作れればいいんだし、必要があったらevalしてClass作る、ていうのはあまり美しくないんでしょうか。

TDD 11章

実装の変更はない。テストから冗長な部分を削除。削除新鮮。

TDD 10章

整理するために全部を書いてみる。

class Money
  attr_reader :amount, :currency

  def initialize(amount, currency)
    @amount = amount.to_i
    @currency = currency
  end

  def equal?(money)
    (@amount == money.amount) && (currency == money.currency)
  end
  alias_method :==, :equal?

  def *(multiplier)
    Money.__send__(self.class.to_s.underscore, @amount * multiplier, currency)
  end

  Currency = {
    :dollar => 'USD',
    :franc => 'CHF'
  }
  def self.method_missing(name, amount, currency = Currency[name])
    klass = name.to_s.classify.constantize.new(amount, currency)
    if klass.is_a? Money
      klass
    else
      raise NameError
    end
  end
end

class Dollar < Money
end

class Franc < Money
end

class MoneySpecification < Spec::Context
  def dollar_multiplication
    five = Money.dollar(5)
    Money.dollar(10).should_equal(five * 2)
    Money.dollar(15).should_equal(five * 3)
 end

  def franc_multiplication
    five = Money.franc 5
    Money.franc(10).should_equal(five * 2)
    Money.franc(15).should_equal(five * 3)
  end

  def equality
    Money.dollar(5).equal?(Money.dollar(5)).should_be_true
    Money.dollar(5).equal?(Money.dollar(6)).should_be_false
    Money.franc(5).equal?(Money.franc(5)).should_be_true
    Money.franc(5).equal?(Money.franc(6)).should_be_false

    Money.franc(5).equal?(Money.dollar(5)).should_be_false
  end

  def currency
    Money.dollar(1).currency.should_equal 'USD'
    Money.franc(1).currency.should_equal 'CHF'
  end

  def different_class_equality
    Money.new(10, 'CHF').equal?(Franc.new(10, 'CHF')).should_be_true
  end

  def money_factory
    Money.dollar(1).class.should_equal Dollar
    Money.franc(1).class.should_equal Franc
    e = nil
    begin
      Money.array('foo')
    rescue Exception => e
    end
    e.is_a?(Exception).should_be_true
  end
end

TDD 9章

Railsちっく(?)な考え方でやってたらDollar FrancはMoneyを継承しているだけのクラスになっちゃった。

今のMoneyはこんな感じ。既存テストall blue.

class Money
  attr_reader :amount, :currency

  def initialize(amount, currency)
    @amount = amount.to_i
    @currency = currency
  end

  def equal?(money)
    (@amount == money.amount) && (self.class == money.class)
  end
  alias_method :==, :equal?

  def *(multiplier)
    Money.__send__(self.class.to_s.underscore, @amount * multiplier)
  end

  Currency = {
    :dollar => 'USD',
    :franc => 'CHF'
  }
  def self.method_missing(name, amount)
    klass = name.to_s.classify.constantize.new(amount, Currency[name])
    if klass.is_a? Money
      klass
    else
      raise NameError
    end
  end
end

下のfactory

ダメくさい!

def self.method_missing(name, *args)
    klass = name.to_s.classify.constantize.new(*args)
    if klass.is_a? Money
      klass
    else
      raise NameError
    end
  end

に書き直し。これもどうなんかなぁ。テストは

def money_factory
    Money.dollar(1).class.should_equal Dollar
    Money.franc(1).class.should_equal Franc
    e = nil
    begin
      Money.array('foo')
    rescue Exception => e
    end
    e.is_a?(Exception).should_be_true
  end

うわぁこれはどうなんよ。だれか助けて!assert_exceptionにあたるのが無いのが痛いなぁ。

TDD 八章

active_supportのstring拡張 + method_missingでfactory実装。

def self.method_missing(name, *args)
    klass = name.to_s.classify.constantize
    klass.new(*args) if klass.ancestors.include? Money
  end

ぴあそんのページ

http://www.pearsoned.co.jp/washo/seigo.shtml

FirefoxでもIEでもひらけねーよ!

TDD 七章

終わり。equal?の実装変更。

TDD 第六章

終わり。Javaって大変そう。俺メモ timesは*に変えたんだよ

TDD 五章

終わり。Francコピペ。今後の展開が読めてきた。

TDD 四章

Dollar.new(1).should_equal Dollar.new(1)

にならなくてちょっとはまった。Object#==の比較だもんなぁ。あとmethod名をequals -> equal?とrubyっぽく変更。timesも*に変更。今のところのDollarクラスは

class Dollar
  attr_reader :amount

  def initialize(amount)
    @amount = amount
  end

  def *(multiplier)
    Dollar.new(@amount * multiplier)
  end

  def equal?(dollar)
    @amount == dollar.amount
  end

  alias_method :==, :equal?
end

TDD 三章

終わり。三角測量って何。

def equality
    Dollar.new(5).equals(Dollar.new(5)).should_be_true
    Dollar.new(5).equals(Dollar.new(6)).should_be_false
  end

()が入ると結構解りにくくなるかも -> should_*

TDD 二章

終わり。test自体の変更。

TDD本写経開始

テストはrSpecで。BDDの場合はテストつわんか。とりあえず一章終わり。

シロップタイプの葛根湯

うわぁ幼児向けシロップ風邪薬の味だマズー。

みんなOO厨って日記に書くいうてたのに

誰も書いてないよ><><

PofEAA呑み

OO厨!OO厨!

ぼくもOO厨になりたかった…。

記事の一覧 >