久保清隆のブログ

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

オブジェクト指向を理解する 〜プログラミング基礎の基礎学習記録

オブジェクト指向を理解するために、
『なぜ、あなたはJavaオブジェクト指向開発ができないのか』
を読んだ。


本書で使われている言語がJavaなので、Rubyの勉強をしている僕には合わないのかなと思ったが、
本書にはオブジェクト指向の本質的なことが書いてあったので、非常に勉強になった。
JavaRubyと共通しているところもあり、また本書にもJavaについての説明が多少あったので、普通に理解は出来た。

たのしいRuby 第2版 Rubyではじめる気軽なプログラミングを読んだのに、オブジェクト指向について大して理解できていなかったことを痛感した。

以下、本書の要約。

プログラムを書く流れ

プログラムを書く流れは、以下の3ステップからなる。


1.コンピュータに行わせたいことを理解する
2.理解したことを説明できるレベルまで整理する
3.コンピュータにわかる言葉へ翻訳する


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


プログラミング言語を覚えることで3が達成される。


これでめでたくプログラミングが完成。

オブジェクト指向とは

ここでオブジェクト指向が出てきたが、
オブジェクト指向とは、

ソフトウェアを効率的に開発する(プログラムの開発や拡張、保守を楽にする)ために考え出された技術
である。


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

  • ソフトウェアの変更や機能追加が大変
  • 大量生産することが出来ない

(ソフトウェアはオーダーメイドの場合が多いので、微妙に機能が異なるものを大量生産する必要がある)

(自転車の運転の仕方を言葉で説明するのは難しい、など)


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

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


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

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


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

となる。



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

審判は、
じゃんけんの開始を宣言
→プレイヤーの手から勝敗を判定
→勝った回数を聞く
→最終的な勝者を判定

プレイヤーは、
じゃんけんの手を出す
→審判から勝敗を聞く
→自分の勝った回数を答える。

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


という風に単純になる。


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


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

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


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



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

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

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

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

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



お読み頂きありがとうございます。
少しでもお役に立てたらクリックお願いします↓。
ブログランキング・にほんブログ村へにほんブログ村 IT技術ブログへにほんブログ村 IT技術ブログ プログラム・プログラマへにほんブログ村 サラリーマン日記ブログ 戦うサラリーマンへ