コンテンツにスキップ

RAT Java勉強会2004 第01回 オブジェクト指向とJava

オブジェクト指向といえば、大抵の本はカプセル化や継承を第一に挙げると思います。
これらはプログラムに慣れていない人にとっては、難解であまり意味がありません。
今回は、オブジェクト指向の”オブジェクト”に焦点をあてて、プログラミングする方法を紹介します。

  • 覚えることが多い
  • 思ったとおりに動かない
  • ぐちゃぐちゃになってしまう
  • 良さが分からない
  • プログラムを書く量が多くて面倒

オブジェクト指向プログラミングの実際

Section titled “オブジェクト指向プログラミングの実際”
  • 覚えることは意外と少ない
    • 一通りルールを理解すれば、あとは辞書だけでOK
  • 直感どおりに書ける
    • 現実世界の現象をそのままプログラムに
  • きれいに書ける
    • 上図に設計すれば、英語のような文章になる
  • 少ないコードでいろいろできる
    • 再利用が楽なので、自分が書くべきコードはちょっと

オブジェクト指向によるプログラミング

Section titled “オブジェクト指向によるプログラミング”

“Tanakaは喫茶店でコーヒーを注文し、コーヒーを飲んだ”

これをJavaで表現してみてください

オブジェクト(物体)になりうるもの

Section titled “オブジェクト(物体)になりうるもの”
  • o Tanaka
  • o 喫茶店
  • o コーヒー
  • x 注文する → 振る舞い
  • x 飲む → 振る舞い
  • Tanaka

    • 文中の”Tanaka”を表す
  • CafeShop

    • 文中の”喫茶店”を表す
  • Coffee

    • 文中の “コーヒー” を表す
  • 各物体には次のような機能が考えられる
    • Tanakaは

      • 注文する
      • 飲む
    • 喫茶店は

      • 注文される
    • コーヒーは

      • 飲まれる
  • Tanakaは喫茶店でコーヒーを注文し…

    • → Tanakaは喫茶店でコーヒーを注文する
    • → 喫茶店はコーヒーを注文される
  • 結果的にコーヒーを手に入れたいが、どちらがいいか?

  • Tanakaは喫茶店でコーヒーを注文する

    • tanaka.getCoffeeAt(cafeShop)
    • 「Tanakaはコーヒーをコーヒーショップで手に入れる」
    • Tanakaの振る舞いとして考える
  • 喫茶店はコーヒーを注文される

    • cafeShop.getCoffee()
    • 「コーヒーショップでコーヒーをもらう」
    • 喫茶店の振る舞いとして考える
  • 直感的だと思うほうを使えばよい(とりあえず後者)

  • …(Tanakaは)コーヒーを飲んだ

    • → Tanakaはコーヒーを飲む
    • → コーヒーはTanakaに飲まれた
  • 結果的にTanakaがコーヒーを飲めばよい

  • Tanakaはコーヒーを飲む

    • tanaka.drink(coffee)
    • 「Tanakaはコーヒーを飲む」
    • Tanakaの振る舞いとして考える
  • コーヒーはTanakaに飲まれる

    • coffee.drunkBy(tanaka)
    • 「コーヒーはTanakaに飲まれる」
    • コーヒーの振る舞いとして考える
  • 直感的だと思うほうを使えばよい(とりあえず前者)

  • class Tanaka

    • void drink(Coffee coffee)
  • この世界ではTanakaはこれ以外の振る舞いを持たなくて良い

  • class CafeShop

    • Coffee getCoffee()
  • この世界では喫茶店はこれ以外の振る舞いを持たなくて良い

  • class Coffee

  • この世界ではCoffeeは特に振る舞いを持たない

class Tanaka {
public void drink(Coffee coffee) {
System.out.println("コーヒーを飲んだ");
}
}
class CafeShop {
public Coffee getCoffee() {
System.out.println("コーヒーが注文された");
// コーヒーを作成して返す
return new Coffee();
}
}
class Coffee {
}
  • 世界に必要な物体を定義した(クラスを作成した)

    • Tanaka (Tanaka)
    • 喫茶店 (CafeShop)
    • コーヒー (Coffee)
  • それぞれの物体の振る舞いを定義した(メソッドを作成した)

    • Tanaka#drink(Coffee)
    • CafeShop#getCoffee()
  • 必要な単語(物体と機能)は揃ったので、これらを連結させてプログラムにする ++ 喫茶店でコーヒーを注文
    ++ Tanakaは(その)コーヒーを飲んだ
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))
  • オブジェクト指向プログラミングは、「オブジェクトを中心に」プログラムを組めばよい
  • 文章を直感のままプログラムに変換できる
  • 次の文章を今回の手順でプログラムに変換しなさい

Suzukiは自動販売機でジュースを買って飲んだ。

課題 2 - 喫茶店という世界の拡張

Section titled “課題 2 - 喫茶店という世界の拡張”
  • 以下の文章をプログラムにしなさい

“Tanakaは喫茶店でコーヒーを注文し、コーヒーを飲んだ。喫茶店ではコーヒーを注文された際に、コーヒーメーカーを使用してコーヒーを淹れる。”

  • 今回例題で使用したプログラムと比較しなさい