音や画面のエフェクトが全くありませんから,つまらないと思うかもしれません。その場合には,「⁠つまらない」は必要の表れだと考えてください。使う必要があるのに,つまらないので使う気が起こらない。あれば使いたくなるのか。そこを工夫すれば,あなたの必要に応え,使いたくなるアプリケーションになります。そんな使って便利で楽しいアプリに発展させるために,さらにコードを取り扱いやすくしましょう。前回に引き続いて,別の視点からビンゴマシンのリファクタリングに取り組みます。著)でも紹介されている小規模なリファクタリングに「制御フラグの削除」があります。Flag)論理型の制御フラグでコードの流れを制御すると,読みにくいコードになりやすい。その場合は制御構造の構文(break,return)を使って制御フラグを削除する。Catalog)今回作成したビンゴマシンのコードでは,テストモードと実行モードの切り替えにTEST_MODEというフラグを使用しています。リファクタリングの意図は,,このフラグを削除して改善することです。今回は,次の手順で作業しましょう。問題の制御フラグが使用されている箇所をすべて見つける。この制御フラグが使用されている箇所のうち一ヵ所を,breakで置き換える。テストを実行し,この置き換えで問題が発生しないか確認する。問題がなければ2.に戻る。すべての箇所を置き換える。制御フラグを削除する。練習として次のコードで考えてみます。このような小さなコードの場合には制御フラグによる分岐や条件判断も「読みにくさ」を発生させませんが,もっと長いコードで同じ構造を使ってしまうと大変読みにくいコードになります(そもそもfor文を使うべきかもしれませんが,そこはサンプルとして目をつぶってください⁠)⁠。}}このコードに対して作業すると次のようになります。}}println("done!");注意したいことは,制御フラグそのものが完全に悪者ではないということです。コードを読みにくく,わざわざ複雑にしているような場合に削除しましょう。BingoMachine.pdeから制御フラグを削除するべきでしょうか。コードの一部を見てみましょう。}}制御フラグを用いて,テストモードとアプリモードを切り替えています。mousePressedといったシステムから呼ばれるメソッドにも同様の構造があります。finalで宣言された定数で,実行中に変更されません。実行中に状況に応じて値が変更される制御フラグとは意味が異なります。TEST_MODEを削除し,breakやcontinue,returnといった制御構造命令で置き換えることでコードはシンプルになりません。Processingには今のところJUnitのようなテストフレームワークがありません。テストコードとアプリケーションとしてのコードの切り替えを手軽に行おうと思えば,このような形を取らざるをえません。残念ながら,このリファクタリングは適用できません。ここで一つの教訓として覚えてもらいたいのは,「⁠リファクタリングのためにコードがあるのではない」ということです。無理をしてリファクタリングにある項目を適用し,かえってわかりにくいコードができあがったのでは元も子もありません。必要なところに,必要な技術を使いましょう。クラスの抽出ビンゴ数列を発生して,これを一つずつ取り出す仕事は,一つのクラスにまとめるべきでしょう。いうのも,アプリケーションとして機能を追加し発展させていく際に,部品化したほうがコードが読みやすいからです。部品化すると,注目したい機能の部分のみに集中してコードを読めます。ファウラーはこのリファクタリングを「2つのクラスでなされるべき作業を一つのクラスで行っている。」(⁠P.149)という悪臭と表現しています。結城さんは同じことを「1つのクラスがたくさんの責任を持ちすぎている」(⁠P.121)という言葉で表しています。Class)一つのクラスが責任を多く負いすぎている場合,まとまりのあるフィールドやメソッドを切り出して別のクラスにする。Catalog)現状のビンゴマシンで機能が足りて,今後改変の必要を感じないのなら,このリファクタリングを適用する必要はありません。今後末長く愛されるアプリケーションにしたければ,今の時点で香りの良いコードにしておきましょう。そのために,このリファクタリングは有効です。そこで,生成時にビンゴ数列を発生し,オブジェクト内に保管して,取得メソッドを呼ぶと数列の要素を次々と返すようなクラスをBingoProgressionとして切り出しましょう。この程度の定義で考えてみます。「⁠次々と値を取得する」という機能が必要なので,これはIteratorパターンの出番であることが想像できます。そこで,Java言語に付属のIteratorインターフェイスを実装しましょう。hasNextを実装し,removeは実装しないでおきましょう。removeが呼ばれたら,Java言語のリファレンスに書かれている通り,例外UnsupportedOperationExceptionを返すようにします。今回のリファクタリングは「クラスの抽出」の一件だけです。新しいクラスを作成するにあたって「適切な名称を選ぶ」という大切な作業が含まれます。名称がしっくりこなければ,随時「名称の変更」を実施してください。テストの作成リファクタリングのはじめに,忘れずにテストコードを用意します。今回は既存のテストコードへ,次のようにtestBingoProgressionClassメソッドの行を追加します。finished.");}そして,testBingoProgressionClassメソッドを次のように実装します。true;}テストに合格したら,アプリケーションとして使用可能と判断し,アプリケーションモードのコード部分の置き換えに入りましょう。testBingoProgressionメソッドのコードと重複部分が多いので,メソッドにまとめるリファクタリングの候補として覚えておきましょう。演習1(難易度:middle)BingoMachine.pdeにリファクタリング「クラスの抽出」を適用し,ビンゴ数列を作成し,取得するBingoProgressionクラスを抽出しましょう。リファクタリングの前後でアプリケーションの振る舞いに違いを生じさせないでください。まとめリファクタリング「制御フラグの削除」と「クラスの抽出」を学習しました。学習の確認それぞれの項目で,Aを選択できなければ,本文や演習にもう一度取り組みましょう。「制御フラグの削除」の意図と効果が理解できましたか?理解できた。意図は理解できたが,効果を感じない。「クラスの抽出」の意図と効果が理解できましたか?理解できた。意図は理解できたが,効果を感じない。著,オーム社⁠)⁠かつてピアソン・エデュケーション社から出版されていたものの新装版です。リファクタリングのバイブルですから,必携です。本文中に示した引用のページ位置はピアソン・エデュケーション社版のものです。著,ソフトバンククリエイティブ⁠)⁠ファウラーのバイブルと併せて読むことをお勧め。著者の解説は一級です。演習解答リファクタリングを施したコードを次に示します。クラスの抽出を行ったBingoMachine.pde抽出されたクラスBingoProgression.pde実装を簡略化するために,定数BINGO_MAX_NUMBERを共有せず,それぞれのコードで定義しました。先々,さらに大きな数や小さな数のビンゴに対応するためには,主となるコード側でのみこの定数を定義し,BingoProgressionクラス側へはコンストラクタの引数で渡すようにすればさらにコード変更に対応しやすくなります。各クラスで共通して利用する定数をstaticなフィールドとして持つクラスを用意しても良いでしょう。ビンゴ数列のテストコードは,せっかくIteratorインターフェイスを持つBingoProgressionクラスを使っているのに,従前のfor文のままのコードです。ここは拡張for文を使えばコードがシンプルにならないでしょうか。ロジックを少々変更する必要がありますが,取り組む価値がありそうです。主となるsketchのmousePressedメソッド内のビンゴ数列要素取得コード部分はいかがでしょうか。ここもIteratorインタフェイスのメソッドを呼んでいます。応用課題として検討してみましょう。プログラミングと日本の端っこ踏破旅行。結城浩氏のような仕事をしたいと妄想している。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。