FizzBuzzとの3か月(1)
お世話になっております。
@ITにて、以下のような記事を見つけました。
小飼弾「転職活動する暇があったらブログを書け」
(http://jibun.atmarkit.co.jp/ljibun01/cs/200909/02/01.html)
この記事では、ITエンジニアを目指すならブログを活用するように勧めています。
記事の最後には、「弾言します。3カ月間ブログをきちんと書き続けられるITエンジニアが、職にあぶれることはない、と。」とあります。
私も職にあぶれるのは嫌なので、3ヶ月間ブログをきちんと更新してみることにしました。
その際の「ネタ」も上記の記事から拝借することにしました。それが「FizzBuzz」です。
「SE4年目でFizzBuzzってどうなのよ」というご意見もあるかと思いますが、退屈しないよう、色々工夫したいと考えています。
さて、第一回目は私の遊び相手である、Pythonで実装してみたいと思います。
ただPythonで実装しても面白くありませんので、unittestモジュールを使用したテストファーストで実装してみました。
こういう便利なモジュールが標準で付属しているのもPythonの魅力の一つです。
では、コードをご覧ください。
# -*- coding: sjis -*- import unittest import random import sys class FizzBuzzTestCase(unittest.TestCase): def setUp(self): self._target = FizzBuzz() self._seq = range(1, 100) def testgetAnswer(self): for i in range(50): num = random.choice(self._seq) answer = self._target.getAnswer(num) if num % 3 == 0 and num % 5 == 0: # 3と5両方の倍数の場合には「FizzBuzz」とプリントすること。 self.assertEqual("FizzBuzz", answer) elif num % 3 == 0: # ただし3の倍数のときは数の代わりに「Fizz」と、 self.assertEqual("Fizz", answer) elif num % 5 == 0: # 5の倍数のときは「Buzz」とプリントし、 self.assertEqual("Buzz", answer) else: # 1から100までの数をプリントする self.assertEqual(str(num), answer) class FizzBuzz(object): def getAnswer(self, num): if num % 3 == 0 and num % 5 == 0: return "FizzBuzz" elif num % 3 == 0: return "Fizz" elif num % 5 == 0: return "Buzz" else: return str(num) def execute(self): for i in range(1, 101): print(self.getAnswer(i)) if __name__ == '__main__': unittest.main()
上記のコードの気になる点を記載します。
- 単体テストと実際のコードがほぼ同じ。単体テストとしては難しいのではないか。
- コメントが少ない。Pythonのドキュメンテーションを活用する。
- range(start, stop)は個人的に分かりにくい。
明日以降修正していこうと思います。
以上
追記
同じ日に同じネタで書いていらっしゃる記事(http://d.hatena.ne.jp/ys0000/20090927/1254021762)を発見。これも何かの縁でしょうか。