• 締切済み

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

現在Javaを勉強しているのですが、 Javaに限らず最近のプログラムの特徴であるオブジェクト指向がよくわかりません。 C言語も学んでいたので少しは知識はあります。 以下は私の解釈です。 C言語は関数の集まったものがいわゆる私たちが作るプログラムで、 作ったプログラムはそれ単体で機能する。 それに比べてオブジェクト指向を用いたプログラムでは、 オブジェクトからクラスが生成、このクラスが一つのプログラムとなる。 クラスのプログラムをいくつも集めたものが最終的なソフトとなる。 Cだとミスを一か所直すと他のところを直す羽目になるかもしれませんが、 オブジェクト指向においてはミスをオブジェクト単位で修正するので、 他のオブジェクトへの影響度は少ない。 よってオブジェクト指向の方が拡張・修正などでも優れている。 こんな感じに解釈したのですがどうでしょうか? オブジェクト指向では最終的なプログラムソフトはオブジェクトの集合体によって構成されているため、オブジェクト指向=オブジェクト中心の考えと言えるのでしょうか。

noname#177863
noname#177863
  • Java
  • 回答数8
  • ありがとう数0

みんなの回答

回答No.8

まず入門書を読んで、判らないところを質問したほうがよいと思います。 質問がでかすぎます。 とりあえず「オブジェクト指向でなぜつくるのか」第2版 あたりは いかがでしょう? 前にも書きましたが、メイヤーの「オブジェクト指向入門」も分厚いですがお勧めです。 「Java言語で学ぶデザインパターン入門」もお勧め。 OOPに王道はないので腰を据えてゆっくり学んでください。 拙速に学ぶと誤りを抱え込んでろくなことはありません(経験済み(^^;)。 判ったと思ったら一歩引いて、コードで検証するのがこつかな。

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.7

>>オブジェクト指向が理解できません 教えてください オブジェクト指向言語がどんな目的で、誰に対して、どんなメリットを得ようとして発展してきたか?を考えることも大切だと思います。 C++言語の設計者であるBjarne Stroustrup氏(ビャーネ・ストロヴストルップ)の著書「C++の設計と進化」の 「第9章 そしてこれから」  9.2.1 C++の設計方針は成功だったのか? には、以下のようなことが書かれています。 ・・・中略・・・ 「C++は現場のプログラマにとってプログラミングがもっと楽しくなるために設計された汎用のプログラミング言語である」。この目標に関しては、C++は明らかに成功した。 具体的には、ほどほどの教育と経験のあるプログラマが、Cと比べて効率性を損なうことなく、より高度な抽象化のレベルでプログラムを書けるようになったので、この目標が達成されたといえる。 ・・・中略・・・ それまでプログラマがより高い抽象化のレベルで仕事ができる言語がいろいろあったにもかかわらず、それらのどの言語の前にも立ちはだかっていた不信の壁を破壊した。 ・・・中略・・・ C++は開発現場のプロのプログラマ向けに設計されており、彼らが手がける大規模で複雑な仕事に合わせて成長してきた。その結果を、プログラミングの初心者やC++の入門者が見ると圧倒されるかもしれない。 また「第-1章」(目次、まえがきの前にある章)では、 ・・・中略・・・ 私が予言したように、Javaは年月を経て新しい機能を身につけてゆき、その結果単純さという”もともとの長所”を打ち消してしまったが、だからといって性能を上げるということもなかった。 ・・・中略・・・ 基本的にC++とJavaは、多くの人が考えている以上に、その目的と言語構造と実装モデルにおいて極めて大きな違いがある。 たぶん、質問者さんが「オブジェクト指向が理解できた!」という意味は、言語によらない、設計手法レベルの問題ではないかと思います。 でも、それを実際に理解するためには、サンプル的なプログラムを作って動かして(実装して)みないと、納得できないと思います。 私も、C++の例題を打ち込んで動かすことで、「ああ、こういうのがオブジェクト指向なのか・・・」といくらか納得した経験があります。 ちなみに、以前、億単位の開発費を費やしたC++によるプロジェクトが最後に破綻したことあります。設計者は、オブジェクト指向の原則にのっとって設計したんでしょうけど、仕様変更が入ると、継承を多用していたために、修正箇所が多くて、私を含めて、プログラマさんは悲鳴を上げました。まあ、プロジェクトが失敗したのは、言語の問題じゃあなく、要件定義がまずかったことだったんですけどね。 いずれにしても、適用プロジェクトのサイズや基本設計がまずいと、オブジェクト指向を採用することで、拡張・修正が難しくなります。

noname#208507
noname#208507
回答No.6

オブジェクト指向プログラミングを提唱したのはアラン・ケイさん(当時はゼロックス・パロアルト研究所の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.

noname#212058
noname#212058
回答No.5

『オブジェクト指向』とはプログラムの設計手法です。 これに対して C などが得意な設計手法を『構造化プログラ ミング』といいます。 例えば、図書館システムで 『本を借りる』『本を返す』という 機能を作るとしましょう。 ○構造化プログラミング  「本を借りる」「本を返す」という『機能』に着目し、同じような  『処理』をまとめて関数化(構造化)してプログラムを作る ○オブジェクト指向プログラミング  「本」「本を借りるユーザ」「図書館司書」という登場人物に  着目し、それぞれの登場人物の責任範囲 (処理・データ) を  決めてプログラムを作る 『登場人物』と『責任範囲』に着目するのがポイントです。 最初に『処理』に目が行ってしまうと構造化プログラミングの 域を出ません。 登場人物(実装的にはクラスになっていく)の責任範囲が明確 になっていきますと、『カプセル化 (情報隠蔽)』 ということが 可能になっていきます。オブジェクト指向の実装(プログラム)で 最も重要なのがこの『カプセル化』です。 質問者さんは「グローバル変数」の扱いなどで苦労されたことは ないでしょうか? 特に複数人で大きなプログラムを開発すると、 自分の知らないとこで勝手に変数値を書き換えられて困ることが 良くあります。 オブジェクト指向では、最初にそれぞれのオブジェクトの責任 範囲を決めて、他のオブジェクトに使ってもらう機能以外は 『カプセル化』で隠します。これで複数人で開発しても、意図しない 変数や関数が勝手に変えられることはありません。より安全に 開発が可能になると言えるでしょう。 色々書きましたが、『オブジェクト指向』を活かすも殺すも設計 次第です。これがきちんとできると、非常に見通しの良いプロ グラムができますが、失敗すると 『構造化プログラミング』に 毛が生えたものができます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

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

回答No.3

私の理解は、 >jjon-com さんは、新しい物を創造し、この世に無い物をうみだせる。zinrouさんは、秀才タイプで、方程式に当てはめて、回答でき、100点の答案を書けるが、この世に無い物は、つくりだせない。 のよに文面からよみとれましたが。それでいいでしょうか? その違いが、彼のような、似た質問を何年にも渡って、だしつづけるのでしょう。もう、かれこれ5年以上、同じ質問を見ている。 そのたびに、質問者が、どうしても「オブジェクト指向=クラス定義」と言う図式にもってゆきたいらしい。

noname#177863
質問者

補足

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

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.2

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

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.1

2003年に「オブジェクト脳のつくり方」を著した牛尾剛 氏によると, > ●オブジェクト指向がわかった(気になる)きっかけ > ・多くの人は「ポリモーフィズム」の理解でわかった気がする人が多いようである。 とのこと。 http://objectclub.jp/event/2003christmas/pdf/object_brain.pdf -------- 私は,同質問者の2週間前の同質問にも回答しているのですが, http://okwave.jp/qa/q8020101.html の私の回答No.1 Javaの勉強を始めたばかりで,オブジェクト指向言語の利点を実感できるほどの段階に達していないのに「少しは知識はあります。以下は私の解釈です」と無理に理解のつじつまを合わせたところでそれは往々にして曲解にしかなりません。 質問者は,ポリモフィズムのコードを書くところまでJavaの勉強が進んでいますか? 進んでいないようならそこまで勉強を進めてください。 そこまで勉強が進んでいるのに,それとオブジェクト指向との関係が実感わかないようでしたら,同じ処理をC言語でコーディングしてみてください。

関連するQ&A

  • オブジェクト指向、理解しやすい?

     最近、Javaの解説書や解説サイトを見ていて、しばしば、「Javaは完全なオブジェクト指向だから理解しやすい」といった記述を見かけます。(「プログラムが見やすくなる」とかではなく)  Javaに限った話ではないのですが、個人的に、オブジェクト指向の概念は、プログラミング初心者の最大の関門ではないかと勝手に思っています。僕はPHPから入ったのですが、ある程度基本事項をマスターした後も、オブジェクト指向だけは長い間苦手としてきました。(最近やっと慣れてきたところです。)  そこで伺いたいのですが、最初にやったプログラミング言語がオブジェクト指向だったという方、オブジェクト指向の概念は、 1.わかりやすかった 2.そこでつまずいた 3.特に意識せずに通り過ぎた 4.その他 いずれでしょうか? ※最初にJavaについて書きましたが、これはただの例なので、オブジェクト指向言語全般についての質問であるととらえてください。

  • Javaにおけるオブジェクト指向とは?

    現在Javaを勉強しております。 以前はC言語を勉強しておたのですが、 JavaとCの違いにおいてJavaの特徴としてオブジェクト指向と習いました。 しかしいまいちこのオブジェクト指向を理解できません。 プログラムを一つのまとまりとして考えるというのはどういうことなのでしょうか? 確かにJavaはC言語とは違いいくつかのプログラムからできている (はず?見当違いだったらすみません) C言語が一つの大きなプログラムでできているとすると、 Javaは細かいプログラムの集合体であると私は考えていました。 この細かいプログラムの集合体というのがオブジェクト指向なのでしょうか? 全くの見当違いだったらすみません。 よろしくお願いします。 

    • ベストアンサー
    • Java
  • オブジェクト指向の教え方

    新入社員にJavaを教えているところなのですが、オブジェクト指向プログラミングをどのように教えていいか困っています。 全員がC言語研修を受講済みで、さらにJava言語も、継承やオーバーロード、例外まで一通り教えて、一応理解しています。 そこで、次のレベルとして、C言語風のプログラミング(「プログラム=関数の集まり」の考え方)から、オブジェクト指向(「プログラム=オブジェクトの集まり」の考え方)に意識改革させたいところです。 問題領域をオブジェクトの集まりとしてとらえ、そこからクラスを抽出していく、という説明がよくありますが、 「何をオブジェクトにするのか」「どのようにクラスを抽出したらいいのか」の部分を詳しく教えたいのですが、どのように説明したらいいでしょうか。また、参考になるWebサイトなどありませんでしょうか? 自分が普段作るときは、ほぼ「勘」でクラス設計していますので、それでは教えられなくて困っています。よろしくお願いします。

    • ベストアンサー
    • Java
  • オブジェクト指向の利点とは?

    汎用機でCOBOLのSEを10数年やってました。(今は自営業) COBOLはプロセス型の言語といわれているのに対して C言語はオブジェクト指向型の言語といわれています。 私はC言語やJAVAで開発したことはないのですが、 C言語、すなわちオブジェクト指向の利点ってなんでしょう? JAVA、C言語はオブジェクト指向ですよね。 私はソフトウェア開発技術者の資格など持っていますのでオブジェクト指向の表面的な意味は分かります。 ですが実際、アプリ開発時・運用時にどのような利点があるのかがイマイチ分かりません。 「どっちでもいいんじゃないか」なんて思ってしまいます。 プロセス指向(VB、COBOL等)とオブジェクト指向(C言語、JAVA)の差異って何なんでしょう。 よろしくお願いします。

  • オブジェクト指向とUMLについて

    「オブジェクト指向」と「UML」の勉強をしようと思っているのですが、お勧めの参考書またはWebサイトをお教えていただきたいです。 ※オブジェクト指向については、JavaやC++のような言語についてではなく、オブジェクト指向についてです。 ちなみに私はJavaは経験したことがありますが、正直"オブジェクト指向がなんたるか"はわかっていないです… 現在業務でJavaに携わっていてるので、オブジェクト指向という考え方をこの機にしっかりと学べればと思っています。 UMLはまったく無知です; クラス図やシーケンス図など中身にナニがあるか微妙に知っているだけです…; どちらか片方でも良いので何かございましたら、お教え願います。 …参考書だと電車で読めるので、ちょっとだけ喜びます(笑

  • オブジェクト指向の特徴

    プログラミングにおいて Java言語などのオブジェクト指向とは 「クラス(設計図)からインスタンス(実体)を量産できる。」がオブジェクト指向ではないプログラミング言語との決定的な違いなのでしょうか? またオブジェクト指向とオブジェクト指向ではない言語の決定的な違いや 実際に実務において経験した感覚的な違いなどがあれば教えてください。 インターネットに乗っていない些細なことでも構いません。

    • ベストアンサー
    • Java
  • VBがオブジェクト指向言語でない理由

    一般的にVBはオブジェクト指向ではない(VB7でその方向へ向かう)といわれていますが、実際にVBをさわり始め、いろんな本を読んでみると、 1)クラスが作成でき、構造体と関数を1つにまとめ、メンバ(プロパティ・メソッド)を定義付けできる 2)Implementsステートメントでクラスの継承が出来る と、ある程度のオブジェクト指向言語の要件を備えているように見えます。 といっても私はJAVAもSmallTalkも知らないので、「何が真のオブジェクト指向か」というのを良く判っていないのかも知れないのですが。 しかしC++関連書などを読んでいると出てくるクラスの使用例などはVBのそれと大差なく、なぜクラスの作成もできて、継承も可能なVBがオブジェクト指向ではないのか? という疑問がわいてきました。 JAVAとは何が違うのか? これが出来ないからオブジェクト指向ではないのだ! という理由をご存じの方、回答もらえればうれしいです。

  • オブジェクト指向の言語

    シスアド受験者です。テキストにジャバはオブジェクト指向の言語だと書いてあります。オブジェクト志向とは具体的にどのようなことなのか教えていただけないでしょうか。よろしくお願いいたします。

    • ベストアンサー
    • Java
  • オブジェクト指向に関して。

    Javaの解説本を読んでオブジェクト指向プログラミングという物があることをしりました。その本には「オブジェクトはデータとそのデータを扱うための機能を持っている。この機能はメソッドと呼ぶ。クラスは設計図のような物で変数とメソッドから構成されている。設計図を実際に形にした物がインスタンスである。」と書いてありました。私はオブジェクト=クラスのような感じがしたのですが、実際のところオブジェクト=クラスでいいのでしょうか?  また、友人に話したところ、オブジェクト指向はサブルーチンに似ているといっていました。私はプログラミングの知識が全くないのでサブルーチンという物が何なのかわからないのですが、サブルーチンとオブジェクト指向の考え方は違うような気がするのです。友人に説明して納得させるにはどうしたら良いのでしょうか? ぜひ、力を課してください。

  • オブジェクト指向について

    趣味でプログラミングをしているのですが オブジェクト指向の概念がうまく理解できていないので 教えていただけませんでしょうか? 解説本などを読むと、オブジェクト指向のクラスを動物クラスを継承して犬クラスや猫クラスなどと解説してあるのですが。 どうも、僕がプログラム設計するとしっぽクラスや泣き声クラスなどといった違った動物の類似機能をまとめてのクラスをつくり各メソッドとしてしまいまっています。 動物クラスや乗り物クラスを組み合わせてプログラムを設計する事ができません。 本格的なプログラムを組む用途では無いので気にしなくても目的の機能が実装できれば問題無いと知人からは言われ(面倒なので教えたくないのかもしれませんが)そのまま来てしまいました。 最近、気になって来たので。 正しい使い方を身に着けたいと思いチャレンジしていますが、変な癖がついていて犬や猫クラスなどと思いながら設計していると思考が止まってしまいます。 そこで、下記のことを教えていただけませんでしょうか? (1)泣き声クラスなどの同機能を1つのクラスにしてしまう設計しか出来ない(発想できない)のは考え方のどこがわるいのでしょうか? (追記:一部分だけならペンギンクラス猫クラスなどと言う動物クラスの継承的な発想はできるのですが実際のプログラミングの際は動物のようなわかり易い物オブジェクトとして目に見える物体ではない事柄をオブジェクト化にする事が難しく感じるのではないかと思います。) (2)今までの小さい規模での開発なら、クラスのつくり方がおかしくても不具合は無かったのですが、どのような時に困る事があるのでしょうか?(解説などでも再利用性などと、さらっと解説されていますがイマイチぴんときません) (3)正しくオブジェクト指向がマスター出来ている方にとって、どのクラスにどのメソッド実装するか悩む事などはあるのでしょうか? また、設計で一番悩むのはどのあたりですか? (4)UMLのマスターは必須でしょうか?(現在は、なんとなくUMLぽい感じでメモ書きをつくり、えせオブジェクト指向でプログラムを組んでいます。) (5)その他アドバイスがあればお願いします。 ※乱文で問題もハッキリせず質問の整理等がうまくいっていないと思いますが1つの項目だけでも構いませんので、ご教授お願いします。

    • ベストアンサー
    • Java