久保清隆のブログ

ライフハック、健康、旅行など、役立つ情報を書きます。

オブジェクト指向とは プログラミング初心者のためのオブジェクト指向入門

新人研修で、プログラミングを教えることになったので、オブジェクト指向を説明する必要があるためまとめた。
『なぜ、あなたはJavaでオブジェクト指向開発ができないのか』
を参考にした。

なぜ、あなたはJavaでオブジェクト指向開発ができないのか―Javaの壁を克服する実践トレーニング

なぜ、あなたはJavaでオブジェクト指向開発ができないのか―Javaの壁を克服する実践トレーニング

本書にはオブジェクト指向の本質的なことが書いてあったので、非常に勉強になった。

プログラムを書く流れ

オブジェクト指向を理解するために、まずプログラミングの流れを押さえておく。
プログラムを書く流れは、以下の3ステップからなる。


1.コンピュータに行わせたいことを理解する(要件定義)
2.理解したことを説明できるレベルまで整理する(設計)
3.コンピュータにわかる言葉へ翻訳する(コーディング)

  • 実現したいことを考え、そのプログラミングの対象をオブジェクト指向で捉えること(モデリングという)を学ぶことで、2までが達成される。
  • プログラミング言語を覚えることで3が達成される。
  • これでめでたくプログラムが完成。

オブジェクト指向

ここでオブジェクト指向が出てきたが、オブジェクト指向を理解するためには、まずオブジェクトについて理解する必要がある。

オブジェクトとは

一般的には、オブジェクトとは「モノ、対象」という意味。
オブジェクト指向プログラミングにおいては、
オブジェクトとは 【 object 】 - 意味/解説/説明/定義 : IT用語辞典によると、

オブジェクトとは、ソフトウェアが扱おうとしている現実世界に存在する物理的
あるいは抽象的な実体を、属性(データ)と操作(メソッド)の集合としてモデル化し、
コンピュータ上に再現したもの。

ちょっと難しく感じる。
もっと簡潔に言うと、

オブジェクトとは、物体を、属性(データ)と操作(メソッド)の集合として定義し、
コンピュータで扱えるようにしたもの。

オブジェクト指向は難しいというイメージがあるが、実際は難しくない。
C言語などの非オブジェクト指向言語を学んでいる人にとっては、考え方が180度異なる概念なので難しく感じてしまう。
でも、初めてプログラミングをする人には、そのようなものだと素直に受け入れられる。

クラスとは

ついでに、クラスという概念も説明しておく。

オブジェクトを定義するモデルはクラスと呼ばれる。
クラスに基づいて実際にコンピュータのメモリ上に展開されたオブジェクトのことを
インスタンス(実体)と言うが、このインスタンスの意味でオブジェクトと呼ぶ場合も多い。

これもよく分からないかもしれない。
いまさらながらだけど、オブジェクトとクラスの関係を究めてみようよ - 檜山正幸のキマイラ飼育記の冒頭に、

オブジェクトとクラスは全体としてツリー構造をしていて、ツリーの末端をオブジェクト、
末端以外のノードをクラスという。
末端であるオブジェクトは、その親ノードであるクラスのインスタンスと呼び、
クラスどおしの親子関係を継承関係と呼ぶ。

という記述がある。
記事の中で、これは簡略化しすぎと言われているが、最初にイメージをつかむ言い方としては十分だと思う。

  • 例えば、
    • 人類クラスを定義すると、個々の人はインスタンス
    • スポーツクラスを定義すると、サッカーはインスタンス、野球もインスタンス
  • ドラゴンボールネタで言うと、
    • サイヤ人クラスを定義すると、べジータはインスタンス、ナッパもインスタンス、ラディッツもインスタンス
    • ナメック星人クラスを定義すると、ピッコロはインスタンス、デンデはインスタンス

クラスもインスタンスもオブジェクトである。
つまり、オブジェクトにはクラスとインスタンスがあって、クラスの下にインスタンスがぶら下がっているイメージ。

メソッドとは

メソッドとは、オブジェクトの振る舞いのこと。
またまたドラゴンボールネタで言うと、

  • 亀仙人一派というクラスを定義したとき、そのクラスに属するインスタンスは「かめはめ波」メソッドを持っている。
    • だから、悟空というインスタンスは「かめはめ波」を使える。
    • 天津飯は「かめはめ波」を使えない。なぜなら亀仙人一派のクラスではないから。
  • 鶴仙人一派というクラスを定義したときは、そのクラスに属するインスタンスは「どどんぱ」メソッドを持っている。
    • だから、天津飯は「どどんぱ」を使える。
    • 悟空は「どどんぱ」を使えない。なぜなら鶴仙人一派のクラスではないから。
継承とは

ついでに継承も説明。ついでなので、読み飛ばしてもOK。
継承とは、あるクラスを真似して、新たなクラスを作ること。継承元となるクラスは「スーパークラス」と呼ばれ、継承して作られたクラスの方は「派生クラス」と呼ばれる。

  • 例えば、亀仙人一派クラスが神様クラスに弟子入り(神様クラスを継承)したとする。
    • 神様クラスは「気を消す」メソッドを持っている。
    • 神様クラスを継承した亀仙人一派の悟空は、「気を消す」ことができるようになる。
    • この場合、神様クラスがスーパークラス、亀仙人一派は派生クラスになる。
オブジェクト指向とは

オブジェクト指向とは、オブジェクト同士の相互作用としてシステムの振る舞いをとらえる考え方。
ソフトウェアを効率的に開発する(プログラムの開発や拡張、保守を楽にする)ために考え出された技術である。

オブジェクト指向を使わずにプログラミングすると、以下のような問題が生じる。

  • ソフトウェアの変更や機能追加が大変
  • 大量生産することが出来ない
    • ソフトウェアはオーダーメイドの場合が多いので、微妙に機能が異なるものを大量生産する必要がある
  • 人間の理解をプログラミング言語を用いてコンピュータに伝えることは難しい
    • 自転車の運転の仕方を言葉で説明するのは難しい、など


オブジェクト指向は、これらの問題を解決するために作られた。

どのようにして解決したかというと、
役割分担を明確に定義する
ことで解決した。

じゃんけんを例にとってオブジェクト指向を理解

例えば、じゃんけんをするとき、A君とB君の1対1で3回勝負、C君が審判の場合、
オブジェクト指向では無い場合、細かくプロセスを書いていかなくてはならない。

大雑把にプロセスを書くと、

    1. C君がじゃんけん開始を宣言
    2. A君の出す手を決める
    3. B君の出す手を決める
    4. A君が勝ったらA君の勝ちを表示
    5. B君が勝ったらB君の勝ちを表示
    6. A君、あるいはB君が勝った回数を加算
    7. 勝負した回数を加算
    8. 3回やるまで繰り返す
    9. A君とB君の勝ち数を比較
    10. A君の勝ちが多い場合、A君の勝ちを表示
    11. B君の勝ちが多い場合、B君の勝ちを表示
    12. 終了

となる。


これを役割分担して考える(オブジェクト指向で考える)と、
大きく審判(C君)とプレーヤー(A君、B君)にわけられる。

  • 審判
    • じゃんけんの開始を宣言
    • プレイヤーの手から勝敗を判定
    • 勝った回数を聞く
    • 最終的な勝者を判定
  • プレイヤー
    • じゃんけんの手を出す
    • 審判から勝敗を聞く
    • 自分の勝った回数を答える。

審判とプレーヤーは、開始を宣言したり勝った回数を聞いたり答えたりという
メッセージのやり取りによって動作を順番に行う。


このように単純になる。


このとき、
役割(審判、プレーヤー)をクラスと呼び、
実体(A君、B君、C君)をインスタンスと呼ぶ。
また、インスタンスは、より広い意味でオブジェクトと呼ばれる。
オブジェクト指向のオブジェクトはこれに由来している。


オブジェクトとインスタンスはほぼ同義で使われるが、前述したように
厳密には、インスタンスは「クラスという役割の定義に対して、具現化したもの」
という意味で、
クラスの種類に関係なくインスタンス全般を指してオブジェクトと呼ぶ。


また、役割(クラス)には「属性」「操作」がある。

  • 属性とは

クラスに対して定義される、「オブジェクト固有の性質のこと」で、
例えばプレーヤークラスの属性は、名前や勝った回数など。
属性があることによって、自分の情報(名前や勝ち数)は自分で管理できるようになる。

  • 操作(メソッド)とは

「メッセージをきっかけとした、オブジェクトの振る舞いのこと」で、
例えば、勝った回数を聞かれたら(メッセージ)、
自分の勝った回数を答える(振る舞い)ということ。
一般的な意味として想像するような、
「オブジェクトに対して何らかの影響を与えるようなもの」ではない。


話を、「非オブジェクト指向で生じる問題点の解決」に戻すと、

オブジェクト指向ではない場合、
じゃんけんの参加者を新たに増やしたりじゃんけんの回数を増やそうとすると、
プロセスがかなり増えてしまう。

しかし、オブジェクト指向ではプレーヤーを一人追加したり、じゃんけんの回数を増やすのは
比較的容易になる。

また、この日記では触れていないが、インターフェースを実装することで、
プレーヤー個々のじゃんけんの手を自由に変えることが出来る。

詳しくは本を読んで下さい。

なぜ、あなたはJavaでオブジェクト指向開発ができないのか―Javaの壁を克服する実践トレーニング

なぜ、あなたはJavaでオブジェクト指向開発ができないのか―Javaの壁を克服する実践トレーニング