ドラえもんの世界をオブジェクト指向で

39

Upload: yaju88

Post on 27-Jun-2015

7.149 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: ドラえもんの世界をオブジェクト指向で
Page 2: ドラえもんの世界をオブジェクト指向で

比喩の乱用であるわけですが、そこはネタとして楽しんで下さい。

•オブジェクト指向が分かる方は

教える側として聞いてください

•オブジェクト指向には「プログラミング技術」と「汎用の整理術」の二つの側面がありますが、今回は前者です。

•オブジェクト指向の概念を ドラえもんの世界で説明

Page 3: ドラえもんの世界をオブジェクト指向で

・登場キャラクター

ドラえもん、のび太、ジャイアン

スネ夫、しずかちゃん

ドラミちゃん、ミニドラ

• 自己紹介 やじゅ@静岡の田舎 http://blogs.wankuma.com/yaju/

SL(大井川鉄道)が通っているところに

住んでいます。

ちなみに原作では、2008年にタイムマシン発明とされています。

※ミニドラは身長30cm、

色は赤、緑、黄など。

Page 4: ドラえもんの世界をオブジェクト指向で

• オブジェクト指向は創作物 オブジェクト指向は創作物であり、

ドラえもん同様、あくまで作者(設計者)

が神である。

• 概念をまず理解 a.概念を勉強中は実装について考えない

概念と従来型とが結びつかず意味不明となる

b.実装を考えるのは、概念の理解後で十分

実装を実際の知識に変えるためには、

繰り返し使って、体に覚え込ませる

Page 5: ドラえもんの世界をオブジェクト指向で

• オブジェクトって何?

• オブジェクト指向って必要?

• オブジェクト指向の三大要素

1.クラス(カプセル化)

2.継承

3.ポリモーフィズム(多態性)

Page 6: ドラえもんの世界をオブジェクト指向で

• オブジェクトって何?

「Object」という英単語は「物体, もの, 対象」

極論でコンピュータ的に言うと、オブジェクト

とはメモリ上にある1つの領域でしかない

例えば、マンガを描くとします。

原稿用紙をメモリに見立て、ドラえもんを描いたとして、

ドラえもん自身がオブジェクトである。またマンガには、

キャラクター、背景、ふきだし、セリフ、効果音、効果線

などがありますが、それぞれがオブジェクトとしてとらえ

ることが出来ます。

Page 7: ドラえもんの世界をオブジェクト指向で

• オブジェクト指向って必要? 世界中の識者が過去の経験などから蓄積した

「システム開発の秘伝の書」ならぬ

「システム開発の公開の書」だからです。

従来のコーディングでもコードの再利用は可能

ですが、オブジェクト指向はより再利用しやす

い柔軟な仕組みがあるためです。

オブジェクト指向を使えば生産性が上がるのではなく、

オブジェクト指向を使って生産性を上げるのです。

Page 8: ドラえもんの世界をオブジェクト指向で

• オブジェクト指向の三大要素

1.クラス(カプセル化)

2.継承

3.ポリモーフィズム(多態性)

継承やポリモーフィズムは、必ずしも最初の段階で理解でき

なくてもかまいません

オブジェクト指向の本質は世界のモデル化であり、継承や

ポリモーフイズムはただの道具なのです。

Page 9: ドラえもんの世界をオブジェクト指向で

• クラスって何?

• ドラえもんたちをクラス化

• カプセル化って何?

Page 10: ドラえもんの世界をオブジェクト指向で

• クラスって何?

クラスとは、データと操作の集まりであり、

オブジェクトの設計図となるものです。

データは、プロパティー(属性)やデータメンバ

と呼ばれます。

操作は、メソッドやメンバ関数と呼ばれます。

Page 11: ドラえもんの世界をオブジェクト指向で

• ドラえもんたちをクラス化 クラス ドラえもん

プロパテイ

名前 ドラえもん

身長 129.3cm

体重 129.3Kg

色 青

生年月日 2112年9月3日

四次元ポケット

・・・

メソッド

動く

話す

食べる

ひみつ道具を出す

ひみつ道具を使う

・・・

2122年8月30日、耳をネズミにかじられる、ショックで黄色から青色となる。

2123年4月5日、タイムマシンでのび太のもとへ行く。

Page 12: ドラえもんの世界をオブジェクト指向で

• カプセル化って何?

クラスのデータと操作は必要なものだけ公開し、

必要のないものは非公開にすることです。

カプセル化することにより、クラスの独立性が高くなる。

クラス内の仕様変更があっても、外部に影響しないため

保守性や開発効率が高まり、再利用が容易になるのです。

いろいろ出来てしまうより、型にはめてしまった方が

一貫性がとれて、迷わなくなるのです。コーディング

もする事が決まっていたほうが楽チンなのです。

簡単な例で言うと、AV機器などで再生ボタンを押した後の

実装 (リモコンの中の回路) までは知らなくても良い。

Page 13: ドラえもんの世界をオブジェクト指向で

•アクセス修飾子

例えば、ドラえもんの四次元ポケットは、ドラえもんが欲しいひみつ道具を

頭でイメージしながらポケットへ手を入れると、内部のコンピューターが

自動的にひみつ道具を選び出す仕組みになっています。

なので、ドラえもんが寝ている時に、のび太が四次元ポケットに入れても、

ひみつ道具を出すことが出来ません。

メソッドの「ひみつ道具を出す」は、ドラえもん自身(クラス)のみ

アクセス可能となるため、privateとなります。

• アクセス修飾子として主な3点

• public 全体に公開

• private 自クラスのみ公開

• protected 派生したクラスにのみ公開

• 他にもある。

Page 14: ドラえもんの世界をオブジェクト指向で

• インスタンスって何?

• ドラえもんたちをインスタンス化

クラスやインスタンスといったオブジェクト指向の概念が出てくる

ところでみんな行き詰ってしまうのです。

正確には、みんな“わかった”とは言うのですが、いざプログラムを

書かせると実際に動くものがつくれない。

「インスタンス」の概念が一番わかりにくいようです。

Page 15: ドラえもんの世界をオブジェクト指向で

• インスタンスって何?

クラスはオブジェクトの設計図となるものと説明

しました。しかし設計図だけでは、物を動かすこと

が出来ないのです

マンガを描く場合でも、ドラえもんというキャラ

クターの設計をしたので、実際に原稿用紙に描き

ますね、これにより初めてドラえもんに命が吹き

込まれ、いろいろな姿がみれるようになるのです。

Page 16: ドラえもんの世界をオブジェクト指向で

メモリ上の領域

• ドラえもんたちをインスタンス化 インスタンス化するには、newキーワードを使います。

例 Dim insドラえもん As new ドラえもん()

Dim insのび太 As new のび太()

・・・

インスタンス(実体)

のび太

しずか

スネ夫

ドラえもん

ジャイアン

クラス(設計図)

ドラえもん

- プロパティ

+ メソッド

のび太

- プロパティ

+ メソッド

しずか

- プロパティ

+ メソッド

スネ夫

- プロパティ

+ メソッド

ジャイアン

- プロパティ

+ メソッド

Page 17: ドラえもんの世界をオブジェクト指向で

• マルチプルインスタンスって何?

一つのクラス(設計図)で、複数のインスタンス

(実体)を作成すること

例えば、「ミニドラ」というキャラクターがいます。

ミニドラは名前の通り、小さなドラえもんで違いとしては

身長が30cm、色が赤、緑、黄など複数です。

インスタンス(実体)

緑ミニドラ 黄ミニドラ

赤ミニドラ

クラス(設計図)

ミニドラ

- プロパティ

+ メソッド

※ミニドラクラス

ドラえもんクラス

を継承して作成

します。

Page 18: ドラえもんの世界をオブジェクト指向で

• よく言われる例え・・・ 鯛焼きの鋳型

(クラス)

鯛焼き (インスタンス)

鯛焼きを焼く(New)

プロパティ:具の種類

小倉あん・抹茶あん、栗あん、チョコレート、カスタードクリーム

Page 19: ドラえもんの世界をオブジェクト指向で

• よく言われる例え・・・ つづき

1.食べるには、鯛焼きにする必要がある(インスタンス)

2.複数作ることが可能(でも量産することが重要ではない)

3.同じ形でも具の種類は別物だったりする

4.誰かが一口食べても他の鯛焼きには影響がでない(独立性)

Page 20: ドラえもんの世界をオブジェクト指向で

• メッセージパッシングについて

• オブジェクトの責務について

• 日本語とオブジェクト指向の共通点

Page 21: ドラえもんの世界をオブジェクト指向で

• メッセージパッシングについて メッセージパッシングというと難しく感じるかも知れませんが、

人をオブジェクトとすると、会話がメッセージということになります。

のび太がママに「宿題をしなさい」と言われ(メッセージを送る)、

のび太は、嫌々ながらも宿題するわけです。そうは言っても、

のび太は宿題サボったまま寝てしまうかもしれませんが・・・

オブジェクト指向の世界では、メッセージを受けると必ず実行します。

反対に、メッセージを受けるまでは、何もしません。

プログラム上では、依頼するオブジェクトのメソッドを呼ぶことを

メッセージといっています。

Page 22: ドラえもんの世界をオブジェクト指向で

• オブジェクトの責務について オブジェクト指向の世界では、各オブジェクトが自分自身の責務

あるいは役割を持つように設計するのが大切です。

のび太が、ドラえもんに宿題をやってとわがままを言いますが、

ドラえもんは、宿題はのび太くんがやる作業だよと断ります。

宿題は、のび太が責任(責務)でやるわけです。

従来のプログラムでは、責任の所在があやふやでしたが、

オブジェクト指向では、各オブジェクトが責任を持ちます。

Page 23: ドラえもんの世界をオブジェクト指向で

• 日本語とオブジェクト指向の共通点

UNIXやメインフレームで使用されているコマンドによる操作は、

「どうする」-「何を」となっています。

例えばファイルを削除する場合、”DEL 対象ファイル名”

つまり、動詞-名詞の順ですね。

「I have a Pen」 英語的思考

オブジェクト指向では、「何を」-「どうする」と対象物が先です。

先程のファイルを削除する場合、”対象ファイル.DELETE”

となり、名詞ー動詞の順となります。

「ペンを持っている」 日本語的思考

Page 24: ドラえもんの世界をオブジェクト指向で

•継承(インヘリタンス)って何?

• ミニドラクラスを作る

• クラスの階層構造を深くしてみる

Page 25: ドラえもんの世界をオブジェクト指向で

•継承(インヘリタンス)って何?

継承(インヘリタンス)とは、既に定義されているクラスをもとに

拡張や変更を加えた新しいクラスを定義するとあります。

例えば、「ミニドラ」というキャラクターがいます。

ミニドラは名前の通り、小さなドラえもんで違いとしては

身長が30cm、色が赤、緑、黄など複数、「ドララ」としか

話せない。ひみつ道具も全てミニチュアサイズです。

このミニドラクラスを作る場合、ドラえもんクラスを基に

作れば楽になります。(プロパティやメソッドを受け継ぐ)

Page 26: ドラえもんの世界をオブジェクト指向で

• ミニドラクラスを作る クラス ミニドラ :継承 ドラえもん

プロパテイ

名前 ミニドラ

身長 30cm

体重 30Kg?

色 赤

生年月日 2125年12月25日

四次元ポケット

・・・

メソッド(オーバーライド)

動く

話す

食べる

ひみつ道具を出す

ひみつ道具を使う

・・・

※継承元となるドラえもんクラスに変更する点があります。

各メソッドは再定義できるようにオーバーライド・メソッドに変更

アクセス修飾子を「protected:派生したクラスにのみ公開」とします

privateのままにしておくと、ミニドラでひみつ道具を出せないため

プロパテイやメソッドは継承元を引継ぐ

Page 27: ドラえもんの世界をオブジェクト指向で

• クラスの階層構造を深くしてみる 継承について、もう少し範囲を広げてみます。

登場キャラクターを増やし、種類分けしてみます。

ロボットクラス

ドラえもん、ドラミちゃん

人間クラス

のび太、しずか、ジャイアン、スネ夫

猫クラス

ミィーちゃん(ドラえもんの恋猫)

動物クラス ?

元になるクラスをスーパークラスと呼び、

それを継承する新しいクラスをサブクラス(継承クラス)と呼びます。

Page 28: ドラえもんの世界をオブジェクト指向で

• 最上位のスーパークラスの名は?

サイボーグクラス

(ロボットと動物の融合)

Page 29: ドラえもんの世界をオブジェクト指向で

• 汎化(子→親)、特化(親→子)

ロボットクラス

ドラえもん、ドラミちゃん 人間クラス

のび太、しずか、ジャイアン、スネ夫

猫クラス

ミィーちゃん(ドラえもんの恋猫)

動物クラス サイボーグクラス

動物は猫を汎化(子→親)したものである。

猫は動物を特化(親→子)したものである。

共通するプロパティやメソッドは

上位のスーパークラスにまとめる

などするといいでしょう。

Page 30: ドラえもんの世界をオブジェクト指向で

• ポリモーフィズムって何?

• オーバーライドについて

• インターフェイスについて

• ポリモーフィズムとサブルーチンの違い

Page 31: ドラえもんの世界をオブジェクト指向で

• ポリモーフィズムって何? 利用したい側は同じ操作で利用したいが、

操作の機能は違うものを扱う仕組みです。

ドラえもんがみんなに「特技」をやってみせてと言うと

insのび太.特技 { return あやとり }

insしずか.特技 { return お風呂に入浴 }

insジャイアン.特技 { return 歌を歌う }

insスネ夫.特技 { return ラジコン }

同一名称メソッド(特技)であるが、振る舞いは異なることを行う

のび太の特技が、あやとりから射撃に変わっても、指示者である

ドラえもんの指示(特技をして)は全く変更しなくてよい

Page 32: ドラえもんの世界をオブジェクト指向で

共通サブルーチン 呼び出す側A 呼び出す側B 呼び出す側C

呼び出される側

呼び出す側が増えても

呼び出される側を修正

する必要がない

ポリモーフィズム

呼び出される側が増え

ても、呼び出す側を

修正する必要がない

呼び出される側X 呼び出される側Y 呼び出される側Z

呼び出す側

オーバーライド(再定義)により中身を書換え、違う動作が可能となる。

• ポリモーフィズムとサブルーチンの違い

Page 33: ドラえもんの世界をオブジェクト指向で

• オーバーライド(再定義)について

先程のポリモーフィズムを実現させるのが

オーバーライド(再定義)という機能になります。

オーバーライドは、スーパークラスにすでに存在する

メソッドをサブクラスで再定義することです。

オーバーライドするためには.メソッド名、戻り値の型

引数の型と個数を同じにする必要があります。

先程の特技の例では、継承元のスーパークラスである

サイボーグクラスのメソッドに「特技」を定義済み・・・

Page 34: ドラえもんの世界をオブジェクト指向で

• インターフェイスについて 通常の継承が「実装の継承」であるのに対して、

インタフェースは「型の継承」となります。

1つのクラスに複数のインターフェィスをつけることが可能です。

ある意味、空っぽのクラスといったところでしょうか

実装する外側の表面(規約)だけを定義したようなもの。

インタフェース経由でオブジェクトを使う限り、複数ある実装

の違いを意識せずに使うことができます。

USBインタフェースがイメージに近いかも

Page 35: ドラえもんの世界をオブジェクト指向で

• 抽象化って何?

• クラス作りは思いやりが大切

• おまけ

特別ゲストとして、アンパンマンが登場

Page 36: ドラえもんの世界をオブジェクト指向で

• 抽象化って何?

関係(制度)を抽出し、システム化したもの

グー

チョキ パー

ジャンケン 業界

政界 官界

政官業の権力

3すくみ

関係を抽象化

Page 37: ドラえもんの世界をオブジェクト指向で

• クラス作りは思いやりが大切

複数のプログラマが1つのシステムを構築する場合には

「私はクラスを作る人、貴方はクラスを使う人」という

役割分担ができます。

クラスを作る人は、クラスを使う人に楽をさせるための

工夫をしましょう。

それが、オブジェクト指向プログラミングを効果的に

実践するための秘訣です。

「思いやり」が大事なのです。

Page 38: ドラえもんの世界をオブジェクト指向で

• おまけ アンパンマンの頭はとりかえることができます。

では、とりかえた頭はどうなってしまうので

しょうか?

アンパンマンの頭をインスタンスとした場合

とりかえた頭はメモリ上は不要なものとなり

ます。誰が回収しているのか?

もしかして、「ガベージコレクタ」っておち・・・

Page 39: ドラえもんの世界をオブジェクト指向で

ご清聴ありがとうございました。

ドラえもんは、マツシバロボット工場にて大量生産型の子守用

ネコ型ロボットなので、本来はインスタンスとなるわけですが

説明上分かりやすくするために、クラスとして扱いました。

サイボーグ化については、汎化よりインターフェイスの方が

適切ではとの意見を頂きましたwww