分12導入ビンゴゲームも盛り上がってきた頃,自分のカードのチェックがきちんとできていないぞという騒ぎが起ったとします。今回作成しているビンゴマシンにはリプレイ機能がありません。そのため,リプレイ機能がほしくなります。いうわけで,今回はまず,機能拡張から話を始めます。機能拡張はリファクタリングではありません。無事,機能拡張がうまくいったら,その時がリファクタリングの出番です。近い将来また別の機能がほしくなった時に,このコードを楽しくメンテナンスできるように,お行儀の良い,かぐわしい香りのするコードにしておきましょう。展開BingoProgressionクラスを継承するBingoProgressionクラスは一方通行にビンゴ数列の要素を吐き出します。吐き出したあとは,もう後戻りできません。BingoMachineアプリケーションを再起動すると,新しいビンゴ数列を生成します。なると,「⁠もう一度最初から数列を読み上げてくれ!」という要望に応えられません。そこで,もう一度最初からビンゴ数列の要素を取り出せるようにしましょう。アプリケーションとしては,Rボタンを押したら数列の最初に戻るようにします。現在何番目の要素を表示しているのか,ディスプレイウインドウに表示されていると親切ですね。リプレイ機能付で親切なビンゴマシン例えばこのスクリーンショットは,「⁠75個あるビンゴ数列の要素のうち,4番目の要素を表示中で,それは6である」という意味です。このような外見で,Rキーを押すと先ほどと同じビンゴ数列を最初から表示してくれる,リプレイ機能付きの便利で親切なアプリケーションに変更してみます。作業については条件があります。BingoProgressionクラスを継承すること。BingoProgressionクラスを継承したRewindableBingoProgressionクラスを作成してください。このクラスに,数列の最初の要素から再度数列を取得するためのgoHeadメソッドを持たせてください。BingoProgressionクラスのソースコードには一切手を加えないこと。理不尽ですが,作業の課題ですからそのようにしてください。現実的な状況を想定するならば,BingoProgressionクラスのソースが公開されていない場合や契約上コードの変更が許されない場合だとしてください。リプレイ機能付で親切なビンゴマシンを作成してください。作業の最初にテストコードを記述することを忘れないでください。集合の要素の最初に戻る機能付きのIteratorインタフェイスを連載第24回で作ったようにRewindableBingoProgressionクラスに実装しても良いのですが,不要な機能が多く含まれますから今回は見送ります。「⁠今必要ない機能は実装しない」というポリシーです。it)というポリシーです。リプレイ機能付きで親切なビンゴマシンのコード作業により,目的のコードが完成しました。rかRがキー入力されると,ビンゴ数列の取得を最初の要素から再開するようになりました。リプレイ機能付で親切になったBingoMachine.pdeBingoProgression.pdeRewindableBingoProgression.pdeBingoProgressionクラスを継承しましたから,ビンゴ数列の作成はスーパークラスであるBingoProgressionクラス側で行われます。サブクラスであるRewindableBingoProgressionクラスにはビンゴ数列生成のコードはありません。これは継承を利用する際のありがたさです。サブクラス側にcreateBingoProgressionというコードが全くなくても,スーパークラス側のその機能が利用できるからです。継承の弊害さて,便利な機能である継承ですが,弊害があります。今後,さらに継承によってクラスを拡張していく場合,多段階に渡るスーパークラスとサブクラスの関係が発生します。これはコードの見通しを悪くし,大変読みにくく理解しにくくなります。継承の利点である「スーパークラスで実装されているメソッドやフィールドは,サブクラスで再度宣言しなくても利用できる」ことが,「⁠サブクラスのコードを見ただけでは,スーパークラスに実装されているメソッドやフィールドがはっきりしない」という欠点に転じるのです。今回のRewindableBingoProgressionクラスは,内部でIteratorインタフェイスのメソッドを利用しています。その際,自分が実装したメソッドを利用しているのか,スーパークラスのメソッドを利用しているのか明示して区別しなければなりません。これはコードを読み書きする上での複雑さを増しています。絶対に継承を利用したほうがわかりやすい,便利だ,と言えない場合には,極力継承は利用しないほうが無難です。肝心なのは,技術の適材適所です。継承を使わずに,今回と同じ働きを持つコードを書くにはどうすればよいでしょうか。そこでリファクタリング「委譲による継承の置き換え」の採用を検討します。プログラミングと日本の端っこ踏破旅行。結城浩氏のような仕事をしたいと妄想している。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。