Processingで学ぶ 実践的プログラミング専門課程

第28回 リファクタリング(2)ビンゴマシンを作ろう

この記事を読むのに必要な時間:およそ 5 分

導入

忘年会のシーズンが始まります。忘年会といえばビンゴ。賞品が当たるかどうかは別として,ビンゴは楽しいゲームです。最近は,デジタル表示でBGMが流れるなど,凝ったビンゴマシンがおもちゃ屋さんに置かれています。しかしこれ,なんだか自分で作れそうと思いませんか?

今回はビンゴマシンを作ることを通して,リファクタリングを学びます。

展開

ビンゴマシンを作ろう

ビンゴゲームとは

おそらく知らない人は少ないと思いますが,ビンゴゲームの概略は次のとおりです。詳しくはWikiPediaなどを参照してください。

ビンゴゲームとは

  • 5行5列の正方形マス目にランダムな番号の書かれたカードを用います。
  • 参加者はこのカードを一人一枚持ち,司会の読み上げる数字が自分のカードにあれば,カード上の数字にチェックを入れます。
  • カード上のチェックが縦・横・斜めいずれかの方向で5つ連続すればあがりです。その際「ビンゴ!」とコールします。
  • チェックが4つ並んだ時点で「リーチ!」とコールする必要があります。

このビンゴゲームで,司会が読み上げるのは1から75までの数です。それぞれの数は一度しか読み上げられません。これは1から75までの数をランダムに一つずつ取り出す順列です。この順列を以後「ビンゴ数列(Bingo progression)」と呼ぶことにします。ビンゴ数列を作成するために,福引き抽選器が使われることがあります。このような,ビンゴ数列を作成する機械・装置を「ビンゴマシン」というわけです。

Processingでビンゴマシンを作り終えたました

このビンゴマシンをProcessingで開発しました。シンプルながら,最低限の機能を持ったビンゴマシンを「急いで」作成し終わったという状況を想定しています。とりあえず今回の忘年会で使えればいいや程度の意識ですから,かなり「臭い」コードです。

このsketchを実行すると,次のようなディスプレイウインドウが表示されます。ディスプレイウインドウをマウスポインタでクリックするたびに,次の数が表示されます。75番目の数字が表示された後は,クリックしても変更されません。sketchを実行するたびに,異なるビンゴ数列を発生します。

かなり臭いBingoMachine.pdeの実行結果

画像

このコードをリファクタリングしていきましょう。意図的に臭いを発生させていますので,かなり読みづらいと思います。そこを我慢して,一通り目を通しておいてください。

テストを作成する

このコードは正しい実行結果を残しますから,リファクタリングの前後で動作が異なっては困ります。そこで,まずはテストコードを用意します。テストの要件は次のとおりとします。

  • ビンゴ数列は,1から75までの数がランダムに,一つずつもれなくだぶりなく並んだ数列であること。
  • これを順に取り出せること。

現在のビンゴマシンの機能はこれだけですから,これをテストします。現在のsketchで言えば,ArrayListのオブジェクトbingosuuretsuの要素が適切かをチェックするコードが必要です。

現在のsketchは,仕事ごとにモジュール化されておらず,テストコードを適用するには不適切です。そこで,まずはテストが適用できるように最低限のモジュール化を施します。具体的には,ビンゴ数列を発生するコードを関数にまとめます。

この作業は,メソッドの抽出と呼ばれる中規模のリファクタリングです。

メソッドの抽出(Extract Method)

長すぎて読みにくいコードから,処理のかたまりを切り分けてメソッドにする。

Extract MethodMartin Fowler Refactoring Catalog

本来は上述の定義のように,長すぎて読みにくいコードを読みやすくする意図のリファクタリングです。今回のように,テストを適用できるようにするための変更とは,厳密には意味が異なります。しかし,だらだらとして,他の仕事のコードと連続していると可読性が低いです。また変数やオブジェクトの利用で不必要に重複していると,変更修正に弱い状態です。テストのためのコードの変更ですが,結果として以上のような不健全な状態を改善します。

このような流れで変更し,テストコードを追加したのが次のsketchです。

テストモードと実行モードを切り替えるフラグTEST_MODEを定義し,これが真なら各テストを実行します。偽ならビンゴマシンとして動作します。

ビンゴ数列を発生するメソッドはcreateBingoPermutationで,ArrayListのオブジェクトへの参照を受け取り,これにビンゴ数列をセットします。

ビンゴ数列をチェックするテストメソッドがtestBingoPermutationです。ArrayListのオブジェクトへの参照を受け取り,これにビンゴ数列が正しくセットされていれば真を返します。

テストは問題があればコンソールにメッセージを表示します。 本来はその他のメッセージをコンソールに表示しないところですが,各メソッドの実行状況を表示させています。後々コードの流れが把握できたら,各メソッドの開始・終了時,その他細かなコンソール出力を削除しましょう。

著者プロフィール

平田敦(ひらたあつし)

地方都市の公立工業高等学校教諭。趣味はプログラミングと日本の端っこ踏破旅行。やがては結城浩氏のような仕事をしたいと妄想している。

Twitter : @hirata_atsushi

コメント

コメントの記入