とりあえず試しに書いたコードは、
from weakref import WeakValueDictionary class NicoChannel: _InstancePool = WeakValueDictionary() def __new__(cls, channelid): try: channelid = int(channelid) except ValueError: return None if channelid < 1: return None obj = NicoChannel._InstancePool.get(channelid, None) if not obj: obj = object.__new__(cls) NicoChannel._InstancePool[channelid] = obj return obj def __init__(self, channelid): self.channelid = int(channelid) def __str__(self): return str(self.channelid)で、テストの方はこんな感じに。
#!/usr/bin/env python3.1 import unittest from nicochannel import NicoChannel class TestNicoChannel(unittest.TestCase): def setUp(self): pass def tearDown(self): pass def testNewClass(self): self.assertNotEqual(NicoChannel(1), None) channel1 = NicoChannel(1) self.assertEqual(str(channel1), '1') channel2 = NicoChannel(2) self.assertEqual(str(channel2), '2') # Test for Flyweight pattern. channel1_clone = NicoChannel(1) self.assertEqual(channel1, channel1_clone) self.assertNotEqual(channel1, channel2) # If channelid isn't a number, NicoChannel(channelid) is None self.assertEqual(NicoChannel('A'), None) # If channelid is a negative number, NicoChannel(channelid) is None self.assertEqual(NicoChannel(-1), None) # If channelid is a zero, NicoChannel(channelid) is None self.assertEqual(NicoChannel(0), None) # If channelid is a number string, NicoChannel(channelid) isn't None channelzerotwo = NicoChannel("02") self.assertNotEqual(channelzerotwo, None) # Testing normalization of channelid. self.assertEqual(str(channelzerotwo), '2') # Test NicoChannel("02") == NicoChannel(2) self.assertEqual(channelzerotwo, channel2) class TestRandom(unittest.TestCase): pass if __name__ == '__main__': unittest.main()現時点でよく分からなかったのは、
- レッドからグリーンになったらcommitするのが一般的なパターンのようだけど、テストを追加してレッドになった時点ではcommitしない方がいい?(使ってるSCMはMercurial)
- 前回のサイクルで追加したコードのせいで、これから追加しても即グリーンになるのが分かってるようなテストは追加しない方がいい?
- Flyweightパターンにする時に一気に10行ぐらい追加するのってマズい?
この辺りは初歩的な疑問のはずなので、ちゃんとした書籍を一冊買えば即解消しそうな予感。
0 件のコメント:
コメントを投稿