20120609 java oo道場(ネタのメモ)

Post on 28-May-2015

487 views 0 download

Transcript of 20120609 java oo道場(ネタのメモ)

Java&OO道場(StartUp編その2)(全2回)のメモ

2012-06-09(土) by munch

この勉強会の目的は・・・

 ・オブジェクト・クラス・インスタンス、について  説明ができない。  ・継承とインタフェースの使い分けができない。 ・そもそもインタフェースって何?何が嬉しいの? ・デザインパターンの良さがわからない。

⇒ の、様な疑問に対して「自分なりの解答(もしくはヒント)を   持ち帰ってもらう、でしたが、どうでしょう?

本日のキーワード

「「「「おおおお笑笑笑笑いいいい」」」」

ではなく、、、

今回も、

「「「「シンプルシンプルシンプルシンプル」」」」Surtout faites simple

(出来る限り単純に作りなさい)

エスコフィエの料理の哲学より

軽く復習も兼ねて

「オブジェクト指向」でよく出てくる考え方

1.OOA、OOD、OOP

2.オブジェクト(データと操作)3.メッセージパッシング4.カプセル化(情報隠蔽、部品化、再利用)5.クラス・インスタンス6.階層構造7.継承8.ポリモーフィズム(多相性、多様性、多態性)

前回やったので、詳細は省略

今回のキモ

長くなるので、詳細省略

その前に軽くJavaの文法の復習を(その1)

基本基本基本基本データデータデータデータ型型型型((((プリミティブプリミティブプリミティブプリミティブ型型型型))))

参照型参照型参照型参照型((((リファレンスリファレンスリファレンスリファレンス型型型型))))

配列型配列型配列型配列型

Java 言語において「データ型」と呼ばれるものは3種類存在する

・・・boolean, char, byte, short, int, long, float, double の   8種類

・・・若干特殊な参照型

・・・String、Date等のJavaのライブラリに含まれたものや   それぞれの開発者が作成したクラス

これには次のシートの3種類が存在する

その前に軽くJavaの文法の復習を(その2)

Interface((((インタフェースインタフェースインタフェースインタフェース))))高   抽象度

   低

(※)「抽象メソッド」・・・「実装を持持持持たないたないたないたない(≠実装が空)メソッド」

AbstractClass((((抽象抽象抽象抽象クラスクラスクラスクラス))))

Class((((クラスクラスクラスクラス or 具象具象具象具象クラスクラスクラスクラス))))

Java 言語において「クラス」と呼ばれるものは3種類存在する

・・・定数と抽象メソッドのみを持つ

・・・定数と変数、具象メソッドのみを持つ

・・・定数と変数、抽象メソッド・具象メソッドを持つ

インスタンス生成不可能     可能

さっきの内容を表にすると・・・

Interface

((((インタフェースインタフェースインタフェースインタフェース))))

AbstractClass

((((抽象抽象抽象抽象クラスクラスクラスクラス))))

Class

((((クラスクラスクラスクラス or 具象具象具象具象クラスクラスクラスクラス))))

メソッドフィールド

変数定数 抽象メソッド 具象メソッド

○ ○

× ×

×

ここらで、一発軽いコーディングを

そうです、継承についてです

「継承」についてのコーディング(その1)

継承させる

●3つのクラス「Oya」「Ko」「KeisyoMain」があります。  ⇒ 「http://bit.ly/L5Zs3y」にコードがあります。

問1.「KeisyoMain」クラスの1つ目のコメントアウトを解除して下さい   ⇒ 「Ko」クラスが「Oya」クラスを継承するように修正して下さい

main()

KeisyoMain

printKo()

printZaisan()

Kouses

printOya()

printZaisan()

Oya

「継承」についてのコーディング(その2)

実行結果の確認

問2.「KeisyoMain」クラスの2つ目のコメントアウトを解除して

   実行結果を確認してみて下さい。   また、「Ko」でオーバーライドされた「printZaisan()」の結果と、   「Oya」の「printZaisan()」の結果を確認してみて下さい

main()

KeisyoMain

printKo()

printZaisan()

Kouses

printOya()

printZaisan()

Oya

super.printZaisa

n() というコード

を追加してみましょう

「継承」についてのコーディング(その3)

実行結果の確認

問3.「Oya」クラスを型として、「Ko」のインスタンスを作成した場合の

   実行結果を確認してみて下さい   ⇒「Ko」クラス内に存在する「printKo()」は使用できたでしょうか?

main()

KeisyoMain

printKo()

printZaisan()

Kouses

printOya()

printZaisan()

Oya

「継承」についてのコーディング(その4)

実行結果の確認

問4.「Oya」クラスを型として、「Ko」のインスタンスを作成した物を、   「Ko」クラスの型へ「ダウンキャスト」した時の実行結果を

   確認してみて下さい   ⇒「Ko」クラス内に存在する「printKo()」は使用できたでしょうか?

main()

KeisyoMain

printKo()

printZaisan()

Kouses

printOya()

printZaisan()

Oya

「継承」についてのコーディング(番外編)

●「Ko」に対して、2つ以上の親クラスを継承させようとするとどうなるでしょう?

printKo()

printZaisan()

Ko

printOya()

printZaisan()

Oya1

printOya()

printZaisan()

Oya2

●「Oya1」が「Oya2」を継承し、「Oya2」が「Oya3」を継承するような関係の  場合、「Oya1」を継承した「Ko」の動きはどうなるでしょう?

printKo()

printZaisan()

Ko

printOya()

printZaisan()

Oya1

printOya2()

printZaisan()

Oya2

printOya3()

printZaisan()

Oya3

後は、各メソッドのアクセス修飾子を変えてみたりしても面白いかも

「継承」のポイント

●「Oya」(親クラス=スーパークラス)と「Ko」(子クラス=サブクラス)の

  関係は理解できましたか?

●継承されたときの子クラス(サブクラス)の利用法についてはどうでしょう?  ⇒ 親クラスのメソッドが使えます(アクセス修飾子については要注意)  ⇒ 親クラスのメソッドが子クラスでオーバーライドされる場合があります。

●Javaでは「単一継承」しかできません

●アップキャスト、ダウンキャストした時の動きについてはどうでしょう?

⇒ 以上を踏まえて、「継承継承継承継承にはにはにはには弱点弱点弱点弱点があるがあるがあるがある」という話を少々。   (「継承」を考える前に、「委譲」の可能性を検討する)

「継承」のおまけ(単一継承と多重継承)

単一継承(Java とか)

printKo()

printZaisan()

Ko

printOya()

printZaisan()

Oya1

printOya()

printZaisan()

Oya2printKo()

printZaisan()

Ko1

printOya()

printZaisan()

Oya

printKo()

printZaisan()

Ko2

printKo()

printZaisan()

Ko4

printKo()

printZaisan()

Ko3

多重継承(C++とか)

printOya()

printZaisan()

Oya1

ダイヤモンド継承問題

(※)「親」「子」というのはそれぞれの相対的な関係において定義されます。

ここらで、もう一発軽いコーディングを

「インタフェース」についてのコーディング(その1)

実装させる

●5つのクラス(及びインタフェース)「Drivable」「Racable」  「Cycle」 「Train」「TestIFMain」があります。  ⇒ 「http://bit.ly/KCuFPj」にコードがあります。

問1.「TestIFMain」クラスの1つ目のコメントアウトを解除して下さい   ⇒ 「Cycle」クラスが「Drivable」インタフェースを実装するように

     修正して下さい

main()

TestIFMain

start()

turn()

Cycleuses

start()

<Drivable>

start()

stop()

Train

start()

<Racable>

「インタフェース」についてのコーディング(その2)

実装させる

問2.「Cycle」クラスについて、「Racable」インタフェースも

    実装するように修正して下さい

main()

TestIFMain

start()

turn()

Cycleuses

start()

<Drivable>

start()

stop()

Train

start()

<Racable>

「インタフェース」についてのコーディング(その3)

問3.「Cycle」クラスと「Train」クラスについて、実行結果を確認して下さい

main()

TestIFMain

start()

turn()

Cycleuses

start()

<Drivable>

start()

stop()

Train

以上を踏まえて、いよいよ今回の一番のメインディッシュを

白板で説明したネタのメモです

main()

Hall

performance()

write()

produce()

Mr.M

uses

performance()

<Comedian>

write()

<Writer>

performance()

99

write()

Mr.K

main()

Publisher

uses

白板で説明したネタのメモです

インタフェースインタフェースインタフェースインタフェース利用時利用時利用時利用時 インタフェースインタフェースインタフェースインタフェース非非非非利用時利用時利用時利用時

「インタフェース」のポイント

●インタフェースについては理解できましたか?

●ココでも「シンプル」「疎結合」という単語が出てきました

●継承と比較してどういう違いがあるでしょうか?

●「暗黙の期待」についてはどうでしょうか?

⇒ 以上を踏まえて、「デザインパターンデザインパターンデザインパターンデザインパターン」に進みたいんですが、   その前に「例外」についてのお話を少々。

  一つだけ。「抽象クラス」は、まだ登場していませんがそれを利用すれば  何が嬉しいのでしょうか?(彼はどんな場面で活躍できるのでしょうか?)

例外について(階層構造)

(参考)「Java言語プログラミングレッスン下巻」(結城浩著)

Object

Throwable

Error

Exception

RuntimeException

そのそのそのその他他他他ののののExceptionチェック例外チェック例外

非チェック例外

例外について(処理方法)

(参考)「Java言語プログラミングレッスン下巻」

     「達人プログラマー」「Javaの格言」

●「try~catch」して処理する

●「throws」で呼び出し元に処理を任せる

⇒ いずれにせよ「例外例外例外例外はははは例外発生時例外発生時例外発生時例外発生時のみののみののみののみの処理処理処理処理とするとするとするとする」のが重要!   ∵例外発生時以外の処理を含めると、「ホントに例外か?」という状況に。。。

    (そもそも「例外」なんて無いに越したことは無い)

    「例外による脱出口が沢山ある」=「メソッドからの返り値が複数ある」    という事に繋がりかねず、設計が複雑になってしまう(シンプルさ、重要!)

   (個人的経験としては「例外」についてのポリシーがイケてないシステムは、    大概その他もイケてないので要注意!)

白板で説明したネタのメモです「「「「はがきはがきはがきはがき」」」」をををを書書書書くためのくためのくためのくためのクラスクラスクラスクラスをををを作作作作ってみるってみるってみるってみる

抽象化する