スッキリわかるJava入門 第7章 オブジェクト指向をはじめよう②
第7章 オブジェクト指向をはじめよう②
サッカーで考えるオブジェクト指向
- 監督(プログラマ)である自分は、コンピュータに的確に指示を出し、目的どおりに動かさなければならない。
- 手続き型で選手に指示を出す場合、選手に逐一、指示を出さなければならない。
- オブジェクト指向型で選手に指示を出す場合、選手の役割と責任を事前に割り当てれば、後は選手自身が自分の役割を果たすために行動する。
- 監督(プログラマ)である自分は、一人一人の選手を部品と考え、それぞれの責務(役割・責任)を事前に割付けたクラスとして作る。
- 試合が始まったら、監督(プログラマ)のすることは、ほとんどない。
- 仮想世界には、それぞれの選手オブジェクトが生みだされ、後は選手オブジェクト自身が自分の役割を果たしながら他のオブジェクトと連携して動いてくれる。
- 監督(プログラマ)である自分は、それぞれの選手(=クラス・オブジェクト)に、「この状況下で、どう行動すべきか」という責務をあらかじめプログラミングしているため、試合中にそれぞれの選手の一挙手一投足まで指示する必要はなくなる。
- 責務の割り付け:オブジェクト指向プログラミングでは、プログラマはそれぞれの部品に「責務」をプログラムとして書き込む。
オブジェクトの姿
- 「サッカー選手」「口座」「受付」など、仮想世界で動くそれぞれのオブジェクトは、すべて何らかの責務を仮想世界の神様たるプログラマから与えられる。
- 「サッカー選手」オブジェクトは「ボールを受けたら前に走る」「シュートする」など、あらかじめ設定された役割を果たす行動責任を負っている。
- ATMの「受付」オブジェクトは、振り込み依頼を受け付けたら「口座」オブジェクトが管理する2つの口座間でお金を移動し、その結果を「印刷係」オブジェクトに渡してATM利用控えの印刷を依頼するという流れが受付の行動責任。
- 「口座」オブジェクトは行動責任を負っていないが、「残高をしっかり覚えておく」という情報保持責任を負っている。
- このような「情報保持」と「行動」の責任を果たすために、それぞれのオブジェクトは「属性」と「操作」を持っている。
- 【属性】その登場人物に関する情報を覚えておく箱
- 【操作】その登場人物が行う行動や動作の手順
- 勇者オブジェクトは、自分の名前やHPを覚えておかなければならない(=情報保持責任)。
- もし「戦え」と命令されれば勇敢に目の前の敵と戦い、「眠れ」と命令されれば眠って自分のHPを回復させる責任(=行動責任)がある。
【属性】 ・名前=ミナト ←勇者の名前。 ・HP =100 ←ヒットポイント(生命力)。これが0になったらGAMEOVER。 【操作】 ・戦う ←目の前の敵を殴る。 ・逃げる ←戦闘を終了する。 ・眠る ←HPが100に回復する。 ・座る ←指定した秒数だけ座る。座った秒数だけHPが回復する。
- そのオブジェクトがどんな属性や操作を持つかは、プログラマが部品を作成する際に決定する。
- そのため現実世界の登場人物をよく観察し、どのような属性を持ち、どのような操作ができるかを忠実に再現する。
- お化けキノコは重要でないモンスターなので名前は不要と考え、「名前」属性は持っていない。
- このモンスターは「催眠ガス」という技が使えるという設定なので、その操作を持っている。
【属性】 ・HP =35 ←ヒットポイント(生命力)。これが0になったらGAMEOVER。 ・レベル=10 ←倒したら得られるレベル。 【操作】 ・戦う ←目の前の敵を殴る。 ・逃げる ←戦闘を終了する。 ・催眠ガス ←相手を眠らせる。
オブジェクトの振るまいと相互作用
- 勇者やお化けキノコは複数の操作を持っている。
- プログラムのmainメソッドやほかのオブジェクトから、それらオブジェクトの操作を呼び出す(=行動指示を送る)ことができる。
- mainメソッドから勇者に「座れ」と指示を送れば、勇者は仮想世界内で座って自分のHP属性を回復させる動きをする。なぜなら勇者には、その行動責任があるから。
- お化けキノコに対して「逃げろ」と指示を送れば、仮想世界内のお化けキノコは逃げだして戦闘が終わる。
- あるオブジェクトから別のオブジェクトへの操作の指示を送ることも可能。たとえば、mainメソッドからお化けキノコに「催眠ガス」という指示を送ると、お化けキノコは勇者が持っている操作の中から「眠る」を呼び出す。すると勇者は眠ってしまう。
- オブジェクトは別のオブジェクトが持つ操作を呼び出すだけではなく、他のオブジェクトの属性を取得したり書き換えたりもできる。たとえば、mainメソッドから勇者「戦う」という指示を送ると勇者は戦い、結果としてお化けキノコのHP属性を書き換えて減らす動作をする。
オブジェクト指向の3大機能
- Javaのようなオブジェクト指向言語(Object Oriented Programming Language=オブジェクト指向の考え方に沿ってプログラムが作りやすい配慮がなされているプログラミング言語)には、開発者が「より便利に」「より安全に」現実世界を模倣できるよう、文法などに専用の機能が準備されている。
- それがオブジェクト指向の3大機能。
- カプセル化:属性や操作を、一部の相手からは利用禁止にする機能。
- たとえば、現実世界では、剣が勇者に「眠れ」という指示を出すことは、まずあり得ない。
- 「眠る」操作は、剣オブジェクトから呼べないようにしておいた方が安全。
- 継承:過去に作った部品を流用し、新しい部品を簡単に作れる機能。
- すでに「勇者」という部品があれば、空を飛べる「スーパー勇者」は簡単に開発できる。
- 多態性:似ている2つの部品を「同じようなもの」と見なし、「いい加減」に利用できる機能。
- 「お化けキノコ」と「オオコウモリ」では厳密には斬りつけ方が微妙に異なるはず。
- 違いを気にせず、どちらも「同じようなもの」と見なし、「戦う」操作で攻撃できる。