みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

オブジェクト指向が理解できません 教えてください

現在Javaを勉強しているのですが、
Javaに限らず最近のプログラムの特徴であるオブジェクト指向がよくわかりません。
C言語も学んでいたので少しは知識はあります。
以下は私の解釈です。

C言語は関数の集まったものがいわゆる私たちが作るプログラムで、
作ったプログラムはそれ単体で機能する。

それに比べてオブジェクト指向を用いたプログラムでは、
オブジェクトからクラスが生成、このクラスが一つのプログラムとなる。
クラスのプログラムをいくつも集めたものが最終的なソフトとなる。

Cだとミスを一か所直すと他のところを直す羽目になるかもしれませんが、
オブジェクト指向においてはミスをオブジェクト単位で修正するので、
他のオブジェクトへの影響度は少ない。
よってオブジェクト指向の方が拡張・修正などでも優れている。

こんな感じに解釈したのですがどうでしょうか?
オブジェクト指向では最終的なプログラムソフトはオブジェクトの集合体によって構成されているため、オブジェクト指向=オブジェクト中心の考えと言えるのでしょうか。

投稿日時 - 2013-04-13 18:20:33

QNo.8041326

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.8

まず入門書を読んで、判らないところを質問したほうがよいと思います。
質問がでかすぎます。

とりあえず「オブジェクト指向でなぜつくるのか」第2版 あたりは
いかがでしょう?

前にも書きましたが、メイヤーの「オブジェクト指向入門」も分厚いですがお勧めです。

「Java言語で学ぶデザインパターン入門」もお勧め。

OOPに王道はないので腰を据えてゆっくり学んでください。
拙速に学ぶと誤りを抱え込んでろくなことはありません(経験済み(^^;)。

判ったと思ったら一歩引いて、コードで検証するのがこつかな。

投稿日時 - 2013-04-17 18:48:30

ANo.7

>>オブジェクト指向が理解できません 教えてください

オブジェクト指向言語がどんな目的で、誰に対して、どんなメリットを得ようとして発展してきたか?を考えることも大切だと思います。

C++言語の設計者であるBjarne Stroustrup氏(ビャーネ・ストロヴストルップ)の著書「C++の設計と進化」の

「第9章 そしてこれから」 
9.2.1 C++の設計方針は成功だったのか?

には、以下のようなことが書かれています。

・・・中略・・・
「C++は現場のプログラマにとってプログラミングがもっと楽しくなるために設計された汎用のプログラミング言語である」。この目標に関しては、C++は明らかに成功した。
具体的には、ほどほどの教育と経験のあるプログラマが、Cと比べて効率性を損なうことなく、より高度な抽象化のレベルでプログラムを書けるようになったので、この目標が達成されたといえる。
・・・中略・・・
それまでプログラマがより高い抽象化のレベルで仕事ができる言語がいろいろあったにもかかわらず、それらのどの言語の前にも立ちはだかっていた不信の壁を破壊した。
・・・中略・・・
C++は開発現場のプロのプログラマ向けに設計されており、彼らが手がける大規模で複雑な仕事に合わせて成長してきた。その結果を、プログラミングの初心者やC++の入門者が見ると圧倒されるかもしれない。


また「第-1章」(目次、まえがきの前にある章)では、

・・・中略・・・
私が予言したように、Javaは年月を経て新しい機能を身につけてゆき、その結果単純さという”もともとの長所”を打ち消してしまったが、だからといって性能を上げるということもなかった。
・・・中略・・・
基本的にC++とJavaは、多くの人が考えている以上に、その目的と言語構造と実装モデルにおいて極めて大きな違いがある。


たぶん、質問者さんが「オブジェクト指向が理解できた!」という意味は、言語によらない、設計手法レベルの問題ではないかと思います。
でも、それを実際に理解するためには、サンプル的なプログラムを作って動かして(実装して)みないと、納得できないと思います。
私も、C++の例題を打ち込んで動かすことで、「ああ、こういうのがオブジェクト指向なのか・・・」といくらか納得した経験があります。


ちなみに、以前、億単位の開発費を費やしたC++によるプロジェクトが最後に破綻したことあります。設計者は、オブジェクト指向の原則にのっとって設計したんでしょうけど、仕様変更が入ると、継承を多用していたために、修正箇所が多くて、私を含めて、プログラマさんは悲鳴を上げました。まあ、プロジェクトが失敗したのは、言語の問題じゃあなく、要件定義がまずかったことだったんですけどね。

いずれにしても、適用プロジェクトのサイズや基本設計がまずいと、オブジェクト指向を採用することで、拡張・修正が難しくなります。

投稿日時 - 2013-04-16 11:32:51

オブジェクト指向プログラミングを提唱したのはアラン・ケイさん(当時はゼロックス・パロアルト研究所のLearning研究グループ所属)。その言葉によれば「オブジェクト指向」はメッセージの伝達だそうです[1]。


> Javaに限らず最近のプログラムの特徴であるオブジェクト指向

オブジェクト指向自体はそんなに最近でもないです。Smalltalk72が実装されたのが1972年[2]、Actor理論に影響を与えたのも1972年[3]ですから、原型が確立したのはそれ以前でしょう。


Learning研究グループはSmalltalkが商業化したころBYTE誌に特集を載せており、(マシンアーキテクチャの論文などを除けば)これが最も原点に近いオブジェクト指向プログラミングの文献でしょう[4]。このときすでに「オブジェクト指向の意味は人によって異なる」と述べられていおり、以前から明確な定義がなかったことが分かります。


> よってオブジェクト指向の方が拡張・修正などでも優れている。

一般にそのように認識されていると思います。しかしその説明には後付けの部分もあると思います。オブジェクト指向が確立したころ、拡張・修正のコストの削減が明確に研究テーマに入っていたようには思えません。その昔、MacintoshのようなGUIデスクトップ環境の成功が、背景技術であるオブジェクト指向の実利面でのセールストークを後押ししたのではないかと。


おそらく「オブジェクト」はシンプルな発想、問題を記述するための概念的なツールだったのではないかと思います。Lispのような関数型プログラミングにおいて全てのものが関数であり、その適用で計算を実現するように[5]、全てのものはメッセージを送受信(Javaの場合はメソッド呼び出し)をするオブジェクトであり、オブジェクトの集まりが互いにメッセージを伝達し合うことによって計算を実現する機械とはいかなるものであるか?というように。

プログラミング上の利点・欠点による存在意義から「オブジェクト」について考察を進めるより、そういう計算モデルの一部であると割りきって調べた方が良いと私は思います。


[1] "Dr.Alan Kay on the Meaning of "Object-Oriented Programming".
  http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en
[2] 竹内. オブジェクト指向の指向するもの. 情報処理, 1988.
[3] Hewitt. Smith. Towards a Programming Apprentice, IEEE Trans. on SE., SE-1, No1, 1975.
[4] Robson. Object-Oriented Software Systems. BYTE, Vol.6, No.8, 1981.
[5] 木村. 米澤. 算法表現論. 岩波書店. 1982.

投稿日時 - 2013-04-14 17:34:45

『オブジェクト指向』とはプログラムの設計手法です。
これに対して C などが得意な設計手法を『構造化プログラ
ミング』といいます。

例えば、図書館システムで 『本を借りる』『本を返す』という
機能を作るとしましょう。

○構造化プログラミング
 「本を借りる」「本を返す」という『機能』に着目し、同じような
 『処理』をまとめて関数化(構造化)してプログラムを作る

○オブジェクト指向プログラミング
 「本」「本を借りるユーザ」「図書館司書」という登場人物に
 着目し、それぞれの登場人物の責任範囲 (処理・データ) を
 決めてプログラムを作る

『登場人物』と『責任範囲』に着目するのがポイントです。
最初に『処理』に目が行ってしまうと構造化プログラミングの
域を出ません。


登場人物(実装的にはクラスになっていく)の責任範囲が明確
になっていきますと、『カプセル化 (情報隠蔽)』 ということが
可能になっていきます。オブジェクト指向の実装(プログラム)で
最も重要なのがこの『カプセル化』です。

質問者さんは「グローバル変数」の扱いなどで苦労されたことは
ないでしょうか? 特に複数人で大きなプログラムを開発すると、
自分の知らないとこで勝手に変数値を書き換えられて困ることが
良くあります。
オブジェクト指向では、最初にそれぞれのオブジェクトの責任
範囲を決めて、他のオブジェクトに使ってもらう機能以外は
『カプセル化』で隠します。これで複数人で開発しても、意図しない
変数や関数が勝手に変えられることはありません。より安全に
開発が可能になると言えるでしょう。


色々書きましたが、『オブジェクト指向』を活かすも殺すも設計
次第です。これがきちんとできると、非常に見通しの良いプロ
グラムができますが、失敗すると 『構造化プログラミング』に
毛が生えたものができます。

投稿日時 - 2013-04-14 01:21:31

ANo.4

「オブジェクトからクラスが生成」ってどういう意味だろう.

そして, 現実的には「オブジェクト指向言語」だからといって必ずしもクラスがあるとは限らなかったりする.

投稿日時 - 2013-04-13 23:40:09

ANo.3

私の理解は、

>jjon-com

さんは、新しい物を創造し、この世に無い物をうみだせる。zinrouさんは、秀才タイプで、方程式に当てはめて、回答でき、100点の答案を書けるが、この世に無い物は、つくりだせない。

のよに文面からよみとれましたが。それでいいでしょうか? その違いが、彼のような、似た質問を何年にも渡って、だしつづけるのでしょう。もう、かれこれ5年以上、同じ質問を見ている。

そのたびに、質問者が、どうしても「オブジェクト指向=クラス定義」と言う図式にもってゆきたいらしい。

投稿日時 - 2013-04-13 21:11:23

補足

ではオブジェクト指向とはものと言うよりも概念なのでしょうか?

投稿日時 - 2013-04-14 01:20:48

ANo.2

さらに迷っちゃうかもしれないですけど
C言語ででもオブジェクト指向プログラミングはできます。
プログラミング言語がオブジェクト指向プログラミングをサポートしている事と、オブジェクト指向プログラミングをすることは別のことです。

投稿日時 - 2013-04-13 21:06:42

ANo.1

2003年に「オブジェクト脳のつくり方」を著した牛尾剛 氏によると,

> ●オブジェクト指向がわかった(気になる)きっかけ
> ・多くの人は「ポリモーフィズム」の理解でわかった気がする人が多いようである。

とのこと。
http://objectclub.jp/event/2003christmas/pdf/object_brain.pdf

--------
私は,同質問者の2週間前の同質問にも回答しているのですが,
http://okwave.jp/qa/q8020101.html の私の回答No.1

Javaの勉強を始めたばかりで,オブジェクト指向言語の利点を実感できるほどの段階に達していないのに「少しは知識はあります。以下は私の解釈です」と無理に理解のつじつまを合わせたところでそれは往々にして曲解にしかなりません。

質問者は,ポリモフィズムのコードを書くところまでJavaの勉強が進んでいますか?
進んでいないようならそこまで勉強を進めてください。
そこまで勉強が進んでいるのに,それとオブジェクト指向との関係が実感わかないようでしたら,同じ処理をC言語でコーディングしてみてください。

投稿日時 - 2013-04-13 19:51:56

あなたにオススメの質問