見出し画像

キッチンでプログラミング(10)

ここからはオブジェクト指向プログラミングについてみていきたいと思います。まずはオブジェクト指向プログラミングの概要とカプセル化についてです。

【オブジェクト指向を始めよう】

ビットさんが言いました。「これから料理ロボットの世界をオブジェクト指向プログラミングで表現する方法について紹介するわね。オブジェクト指向プログラミングはプログラム開発における部品化の考え方で、大規模化するプログラムを人間が管理しきれなくなったために生まれたのよ。ここでレストランの仕事を考えてみましょう。従来のプログラミング手法では、チーフはお客さんが来たら従業員にいちいち命令しなければならなかったの。」

ホール係さん、お客さんに水を出して注文を取ってきて。もし、注文がサラダだったら、料理人1さんサラダを作って。もし、注文がスープだったら、料理人1さんスープを温めて。もし、注文がパスタだったら、料理人2さんパスタを作って。料理ができあがったら、ホール係さんはお客さんに料理を出して。

「でも、オブジェクト指向なら」

ホール係さんの仕事は、お客さんが来たら水を出して注文を取る。そして、料理ができたらお客さんのところに運ぶ。料理人1さんの仕事は、サラダを作ることとスープを温めること。料理人2さんの仕事は、パスタを作ること。

「と決まっていたら、チーフはお店が開店したら『みんな頑張ってね。』と言えば、それぞれの係の人が仕事をしてくれるのよ。」

はじめ君が言いました。「普通じゃん。」

「そうなのよ。人間が普通にしていることをプログラミングの世界に取り入れたのがオブジェクト指向なのよ。」「さっき部品化って言ったけど、この部品をいかに上手に作るかが大切になってくるの。さっきのレストランの例だと、『ホール係』『料理人1』『料理人2』という部品があって、それぞれ実際の人間世界をもとにした仕事が割り当てられているからわかりやすいわよね。」

「もしこれが次のように部品化されていたらどうかしら。」

ホール係さんの仕事は、お客さんに水を出して注文をとることと、スープを温めること。料理人1さんの仕事は、サラダを作ることと、料理をお客さんに運ぶこと。料理人2さんの仕事は、パスタを作ることと、食器を洗うこと。

「もし、こんな風だったらレストランの仕事はしっちゃかめっちゃかになっちゃうわよね。」「ただプログラムが大きくなったからっていう理由で部品化を行うとおかしな部品化をしてしまうことが多いから気を付けないといけないの。」「ソフトウェア開発を何のためにするかというと、人間がやっていた仕事を機械にやらせて楽するためだから、人間世界をよーく観察して上手な部品化をしましょう。」「今は、飲み物とかお菓子なんかの自動販売機がある程度だけど、料理ロボットができたら、全自動レストランなんていうのができるかもね。」ビットさんはいたずらっぽく笑いました。

「オブジェクト指向プログラミングではクラスというものを定義するの。クラスには『名前』『属性』『操作』があって、属性は情報を覚えておく箱、操作は行動や動作の手順なのよ。個々の操作は関数になっていて、これをメソッドと呼ぶの。」「例えば、『野菜のころころサラダを作るロボット』というクラスは次のように定義できるわ。」

~クラス~

<名前>

野菜のころころサラダを作るロボット

<属性>

野菜1 ← レタス

野菜2 ← だいこん

野菜3 ← きゅうり

ドレッシング ← 青じそドレッシング

※属性は初期化することもできるので、ここでは「←」の右側のデータで初期化しました。

<操作>

切る(){

this.野菜1を1cm角に切る。

this.野菜2を1cm角に切る。

this.野菜3を1cm角に切る。

}

入れる(){

お皿にthis.野菜1を入れる。

お皿にthis.野菜2を入れる。

お皿にthis.野菜3を入れる。

}

味付けする(ドレッシング){

お皿の野菜の上にドレッシング大さじ1をかける。

まぜる。

}

セット野菜1(野菜){

野菜でなかったらエラーメッセージを出して終了する。

this.野菜1に野菜をセットする。

}

セット野菜2(野菜){

野菜でなかったらエラーメッセージを出して終了する。

this.野菜2に野菜をセットする。

}

セット野菜3(野菜){

野菜でなかったらエラーメッセージを出して終了する。

this.野菜3に野菜をセットする。

}

~~~~~~~~~~

ビットさんが言いました。「『this.』と書いてあるのは『このクラスの』という意味よ。」「メソッドは

名前(引数の並び){

処理

}

のように書いてあるわ。引数がないときは()のようになるの。」

「『野菜のころころサラダを作るロボット』っていうクラスを作ったけど、クラスはこのままでは使えないの。」

「えーっ、なんで、せっかく作ったのに。」はじめ君が言いました。

「クラスは設計図みたいなもので、実際に働くのはそれをもとにして生み出されたロボットたちなの。このロボットたちのことをインスタンスと呼ぶのよ。」ビットさんが言いました。

~作り方~

1.料理ロボA ← 『野菜のころころサラダを作るロボット』インスタンスを新しく生み出す。

2.料理ロボA.セット野菜1(だいこん)

3.料理ロボA.セット野菜2(にんじん)

4.料理ロボA.セット野菜3(きゅうり)

5.料理ロボA.切る()

6.料理ロボA.入れる()

7.料理ロボA.味付けする(ごまドレッシング)

「『料理ロボA』っていうのは名前で、インスタンスをいくつも生み出したときに、それらを区別できるようにするものだと覚えておいて。」

ビットさんが言いました。「料理ロボA.操作(引数)と書いてあるのは『野菜のころころサラダを作るロボット』である『料理ロボA』が『操作(引数)』を行うという風に理解してね。」

「料理ロボAの他に、料理ロボB、料理ロボC、、、とインスタンスをたくさん作ることができるの。そして、『料理ロボB.セット野菜1(キャベツ)のように書けば、料理ロボBの属性『野菜1』にキャベツを入れられるのよ。」

かなたちゃんが言いました。「なぜ『料理ロボA.←だいこん』ってしないで、わざわざ『料理ロボA.セット野菜1(だいこん)』なんてしてあるの。」

ビットさんが言いました。「例えば、『料理ロボA.セット野菜1(カステラ)』とか、『料理ロボA.セット野菜1(こんにゃく)』とか書くと、料理ロボは野菜じゃないものをセットしようとしたのでエラー処理をしてくれるの。」

「通常、クラス内の『属性』は外から直接さわれないようにしておいて、『操作』を通してのみ値を変更したりできるようにするの。こうすることによって、安全性の高いプログラムを作ることができるのよ。これをカプセル化と言って、オブジェクト指向の3大特徴の1つなの。もし、『属性』に外からさわれたら、カステラやこんにゃくの入ったサラダもできてしまうわよね。」

【解説】

オブジェクト指向プログラミングについてはJavaを参考に話を進めていきたいと思います。他の言語では違うところがあると思いますのでご了承ください。手続き型プログラミングが機械よりの考え方をするのに対して、オブジェクト指向プログラミングは人間世界を模した考え方ができるため、大規模な開発も比較的楽に行うことができると言われています。


この記事が気に入ったらサポートをしてみませんか?