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は、使ってみたかっただけです。すみません。

以上