目の前に僕らの道がある

勉強会とか、技術的にはまったことのメモ

テスト駆動開発入門をPythonで写経してみた。 4

こうですか?よく分かりません。

目的

amountのプライベート化

原書と違うところ

11行目、12行目

原書ではassertEquals()にオブジェクトを渡しています。PythonのassertEqual()で同じことするとそれは違うオブジェクトを比較していると怒られます。比較したいのはamountなのでDollar.get_amount()を渡しています。

Javaの場合でも違うオブジェクトを渡しているのに何でそれらが等値と判断されるのかがよく分かりません。ちょっと直感的じゃないです。

29行目

オブジェクトの返り値を変更する方法がよく分からなかったのでamountを返すメソッドを定義しています。

まあ、この章の趣旨はDollar.amountをプライベート化しようということなのでいいかな?でも、Pythonだと厳密な意味でプライベート化できないみたいです。

#coding : utf-8
"""
テスト駆動開発入門
4章 プライベート化
"""
import unittest

class TestMoney(unittest.TestCase):
    def testMultiplication(self):
        five = Dollar(5)
        self.assertEqual(Dollar(10).get_amount(), five.times(2).get_amount() )
        self.assertEqual(Dollar(15).get_amount(), five.times(3).get_amount() )
        
    def testEuality(self):
        self.assert_(Dollar(5).equals(Dollar(5) ) )
        self.assert_(not Dollar(5).equals(Dollar(6) ) )

class Dollar(object):
    __amount = 0
    def __init__(self, amount):
        self.__amount = amount
    
    def times(self, multiplier):
        return Dollar(self.__amount * multiplier)
    
    def equals(self, dollar):
        return self.__amount == dollar.get_amount()
    
    def get_amount(self):
        return self.__amount

if __name__ == "__main__":
    unittest.main()