読者です 読者をやめる 読者になる 読者になる

『テスト駆動開発入門』を 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 の知識不足で、本筋以外で引っかかることが多い。
    • 写経しながら勉強あるのみ