『テスト駆動開発入門』を Ruby で写経する 1章〜8章
まとまった時間が取れたので、積読になっていた『テスト駆動開発入門』を、Ruby に読み換えながら写経しました。
TDD 力アップのため、まずは量をこなす予定。
やったこと
1章〜8章までの写経
テストコード
require 'test/unit' require 'money' class TC_Money < Test::Unit::TestCase def testMultiplication five = Money.dollar(5) assert_equal(Money.dollar(10), five.times(2)) assert_equal(Money.dollar(15), five.times(3)) end def testEquality assert(Money.dollar(5).equals(Money.dollar(5))) assert(!Money.dollar(5).equals(Money.dollar(6))) assert(Money.franc(5).equals(Money.franc(5))) assert(!Money.franc(5).equals(Money.franc(6))) assert(!Money.franc(5).equals(Money.dollar(5))) end def testFrancMultiplication five = Money.franc(5) assert_equal(Money.franc(10), five.times(2)) assert_equal(Money.franc(15), five.times(3)) end end
プロダクトコード
class Money @amount def equals(obj) return @amount == obj.amount && self.class.equal?(obj.class) end def ==(obj) @amount == obj.amount end def self.dollar(amount) return Dollar.new(amount) end def self.franc(amount) return Franc.new(amount) end end class Dollar < Money def initialize(amount) @amount = amount end attr_accessor :amount def times(multiplier) obj = Dollar.new(@amount * multiplier) return obj end end class Franc < Money def initialize(amount) @amount = amount end attr_accessor :amount def times(multiplier) obj = Franc.new(@amount * multiplier) return obj end end
感想とか
- テストやプロダクトコード修正の単位が非常に小さい
- この感覚を身につける
- 写経じゃない場合、この過程を踏めるか疑問
- まずは型としてやる!
- Ruby の知識不足で、本筋以外で引っかかることが多い。
- 写経しながら勉強あるのみ