RAT Java勉強会2004 第01回 オブジェクト指向とJava
オブジェクト指向といえば、大抵の本はカプセル化や継承を第一に挙げると思います。
これらはプログラムに慣れていない人にとっては、難解であまり意味がありません。
今回は、オブジェクト指向の”オブジェクト”に焦点をあてて、プログラミングする方法を紹介します。
プログラミングのイメージ
Section titled “プログラミングのイメージ”- 覚えることが多い
- 思ったとおりに動かない
- ぐちゃぐちゃになってしまう
オブジェクト指向のイメージ
Section titled “オブジェクト指向のイメージ”- 良さが分からない
- プログラムを書く量が多くて面倒
オブジェクト指向プログラミングの実際
Section titled “オブジェクト指向プログラミングの実際”- 覚えることは意外と少ない
- 一通りルールを理解すれば、あとは辞書だけでOK
- 直感どおりに書ける
- 現実世界の現象をそのままプログラムに
- きれいに書ける
- 上図に設計すれば、英語のような文章になる
- 少ないコードでいろいろできる
- 再利用が楽なので、自分が書くべきコードはちょっと
オブジェクト指向によるプログラミング
Section titled “オブジェクト指向によるプログラミング”“Tanakaは喫茶店でコーヒーを注文し、コーヒーを飲んだ”
これをJavaで表現してみてください
オブジェクト(物体)になりうるもの
Section titled “オブジェクト(物体)になりうるもの”- o Tanaka
- o 喫茶店
- o コーヒー
- x 注文する → 振る舞い
- x 飲む → 振る舞い
クラスの作成
Section titled “クラスの作成”-
Tanaka
- 文中の”Tanaka”を表す
-
CafeShop
- 文中の”喫茶店”を表す
-
Coffee
- 文中の “コーヒー” を表す
オブジェクトの振る舞い(機能)
Section titled “オブジェクトの振る舞い(機能)”- 各物体には次のような機能が考えられる
-
Tanakaは
- 注文する
- 飲む
-
喫茶店は
- 注文される
-
コーヒーは
- 飲まれる
-
振る舞いの選択 (1.1)
Section titled “振る舞いの選択 (1.1)”-
Tanakaは喫茶店でコーヒーを注文し…
- → Tanakaは喫茶店でコーヒーを注文する
- → 喫茶店はコーヒーを注文される
-
結果的にコーヒーを手に入れたいが、どちらがいいか?
振る舞いの選択 (1.2)
Section titled “振る舞いの選択 (1.2)”-
Tanakaは喫茶店でコーヒーを注文する
- tanaka.getCoffeeAt(cafeShop)
- 「Tanakaはコーヒーをコーヒーショップで手に入れる」
- Tanakaの振る舞いとして考える
-
喫茶店はコーヒーを注文される
- cafeShop.getCoffee()
- 「コーヒーショップでコーヒーをもらう」
- 喫茶店の振る舞いとして考える
-
直感的だと思うほうを使えばよい(とりあえず後者)
振る舞いの選択 (2.1)
Section titled “振る舞いの選択 (2.1)”-
…(Tanakaは)コーヒーを飲んだ
- → Tanakaはコーヒーを飲む
- → コーヒーはTanakaに飲まれた
-
結果的にTanakaがコーヒーを飲めばよい
振る舞いの選択 (2.2)
Section titled “振る舞いの選択 (2.2)”-
Tanakaはコーヒーを飲む
- tanaka.drink(coffee)
- 「Tanakaはコーヒーを飲む」
- Tanakaの振る舞いとして考える
-
コーヒーはTanakaに飲まれる
- coffee.drunkBy(tanaka)
- 「コーヒーはTanakaに飲まれる」
- コーヒーの振る舞いとして考える
-
直感的だと思うほうを使えばよい(とりあえず前者)
クラスの記述 (Tanaka)
Section titled “クラスの記述 (Tanaka)”-
class Tanaka
- void drink(Coffee coffee)
-
この世界ではTanakaはこれ以外の振る舞いを持たなくて良い
クラスの記述 (CafeShop)
Section titled “クラスの記述 (CafeShop)”-
class CafeShop
- Coffee getCoffee()
-
この世界では喫茶店はこれ以外の振る舞いを持たなくて良い
クラスの記述 (Coffee)
Section titled “クラスの記述 (Coffee)”-
class Coffee
-
この世界ではCoffeeは特に振る舞いを持たない
クラスの実装 (Tanaka)
Section titled “クラスの実装 (Tanaka)”class Tanaka { public void drink(Coffee coffee) { System.out.println("コーヒーを飲んだ"); }}クラスの実装 (CafeShop)
Section titled “クラスの実装 (CafeShop)”class CafeShop { public Coffee getCoffee() { System.out.println("コーヒーが注文された"); // コーヒーを作成して返す return new Coffee(); }}クラスの実装 (Coffee)
Section titled “クラスの実装 (Coffee)”class Coffee {}ここまでの流れ
Section titled “ここまでの流れ”-
世界に必要な物体を定義した(クラスを作成した)
- Tanaka (Tanaka)
- 喫茶店 (CafeShop)
- コーヒー (Coffee)
-
それぞれの物体の振る舞いを定義した(メソッドを作成した)
- Tanaka#drink(Coffee)
- CafeShop#getCoffee()
これからの流れ
Section titled “これからの流れ”- 必要な単語(物体と機能)は揃ったので、これらを連結させてプログラムにする
++ 喫茶店でコーヒーを注文
++ Tanakaは(その)コーヒーを飲んだ
プログラムの世界を記述 (Main)
Section titled “プログラムの世界を記述 (Main)”class Main { public static void main(String[] args) { // 世界に存在する物体を創造 Tanaka tanaka = new Tanaka(); CafeShop cafeShop = new CafeShop();
// 喫茶店でコーヒーを注文し、… Coffee coffee = cafeShop.getCoffee();
// …Tanakaはコーヒーを飲む tanaka.drink(coffee); }}- 次の手順で文章をプログラムに変換できた
++ 文章からオブジェクト(物体)になるものを探す
- Tanaka, 喫茶店, コーヒー ++ 文章から振る舞い(機能)になるものを探す
- 注文する, 飲む ++ オブジェクトと振る舞いを結びつける (物体の機能を考える)
- Tanaka#drink(Coffee), CafeShop#getCoffee()
++ 文章の流れをそのままプログラムにする
+++ 喫茶店でコーヒーを注文 (cafeShop.getCoffee())
+++ Tanakaは(その)コーヒーを飲んだ (tanaka.drink(coffee))
- オブジェクト指向プログラミングは、「オブジェクトを中心に」プログラムを組めばよい
- 文章を直感のままプログラムに変換できる
課題 1 - プログラムの変換
Section titled “課題 1 - プログラムの変換”- 次の文章を今回の手順でプログラムに変換しなさい
Suzukiは自動販売機でジュースを買って飲んだ。
課題 2 - 喫茶店という世界の拡張
Section titled “課題 2 - 喫茶店という世界の拡張”- 以下の文章をプログラムにしなさい
“Tanakaは喫茶店でコーヒーを注文し、コーヒーを飲んだ。喫茶店ではコーヒーを注文された際に、コーヒーメーカーを使用してコーヒーを淹れる。”
- 今回例題で使用したプログラムと比較しなさい