FizzBuzzとの3か月(11)
お世話になっております。
今日はPythonに戻り、より汎用的に使えるクラスを目指しました。
テストコードは大半を流用しましたが、本番のコードはかなり変わりました。
以下、コードです。
# -*- coding: utf-8 -*- import unittest class FizzBuzzFactoryTestCase(unittest.TestCase): def testgetAnswer(self): """1から100までの数をプリントするプログラムを書け。 ただし3の倍数のときは数の代わりに「Fizz」と、7の倍数のときは「Buzz」とプリントし、 3と7両方の倍数の場合には「FizzBuzz」とプリントすること。 """ for i in range(100): param = i + 1 answer = fizzbuzz(param) if 'Fizz' == answer: self.assertEqual(0, param % 3) elif 'Buzz' == answer: self.assertEqual(0, param % 7) elif 'FizzBuzz' == answer: self.assertEqual(0, param % 3) self.assertEqual(0, param % 7) else: self.assertEqual(False, param % 3 == 0) self.assertEqual(False, param % 7 == 0) class FizzBuzz(object): def __init__(self, text, *args): self._text = text self._measures = [x for x in args] def getAnswer(self, param): for measure in self._measures: if not 0 == param % measure: return None return self._text config = [ FizzBuzz('FizzBuzz', *[3, 7]), FizzBuzz('Fizz', *[3]), FizzBuzz('Buzz', *[7]) ] def fizzbuzz(param): answer = None for obj in config: answer = obj.getAnswer(param) if answer: return answer return str(param) if __name__ == '__main__': unittest.main()
割り切れるべき数の配列と、その時に表示する文字列を渡すことで、FizzBuzzクラスを汎用的に使用できるようにしました。
config以外からリテラルを排除できたので、あとはconfigを設定ファイルから読み込むようにすれば、一段落です。
FizzBuzzクラスは、汎用的に使えるようになった分、以前に比べて何をしているかが分かりにくくなってしまいました。
実際のプロジェクトでは、コメントで補うなどの対策が必要だと思います。
*argsは、使ってみたかっただけです。すみません。
以上