- 締切済み
オブジェクト指向って何ですか?
オブジェクト指向という表現、よく聞きますが、何のことだかさっぱりわかりません。文系の私にも理解できるよう、どなたか教えてください。 よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- myau
- ベストアンサー率29% (50/169)
finglasさんがどの程度の前提知識をお持ちで どのレベルの事をご質問されてるのかちょっとわからないので あまり厳密な話でなく、おおざっぱですが。 オブジェクト指向は、コンピュータプログラミングをする上での考え方です。 JAVAとかC++とかが「オブジェクト指向プログラミング言語」と言えます。 オブジェクト指向に基づいたプログラムがつくりやすいという言語です。 なので、オブジェクト指向に基づかないプログラムもつくれます。 要は 「オブジェクトという概念で、実世界の全てのモノが表現できる」 というような考え方なのですが、(宗教にも近いかもしれない) そのオブジェクトというのはなにかというと、 私は「ある概念」だと思います。 自動販売機システムを作る場合を考えると オブジェクト指向ではないプログラムをつくると 「自販機がどういう状態のときに、お金どのくらい入れたとき、 ある結果(ジュースを出すとか、10円切れランプをつけるとか)を出す」 と考えて、 じゃあ、自販機の状態を覚えておく部分が必要だとか、 お金を数える部分が必要だとか、考え、 そういった機能を満たすプログラムを作っていきます。 これをオブジェクト指向で考えると、 まず、実世界における、対象物(ここでは自販機)の情報を書きます。 自販機というのは、 ・中にジュースが入っている ・ジュースが買える ・お金を入れられる ・おつりを出す それから、その自販機と関係をもつ他のモノを考えます。 ・買う人 ・ジュース ・お金(100円玉、10円玉、50円玉、1000円札) 100円玉 ・硬貨 ・100円の価値 ・この自販機に入れられる では、買う人とは何か。 ・お金を持っている ・お金を入れてジュースを買う ジュースとは何か ・名前 ・値段 ・自販機から出てくる こんな風にそのモノの情報を出します。 情報には、モノの属性情報と、動きを表す情報があります。 ジュースだと、名前は属性情報で、出てくるというのが動きです。 ここで挙げたモノが全て「オブジェクト」です。 そして、このオブジェクト同士の関係図を書きます。 買う人ーーお金ー>自販機 <ージュース とか。 そうすると、実世界の対象物を図に書けたことになります。 このオブジェクトの情報と関係図と情報をもとに、 (というか、それをほぼそのまま) プログラムをつくるのです。 実際にプログラミングしたことがないとちょっと想像しにくいとは思いますが オブジェクト指向に基づいてつくったプログラムだと 後々の変更の際、楽である、(これは、関係図の造り方具合によりますが) のが特徴です。 逆にいえば、関係図など(つまり設計)をてきとーに書いてしまうと 後で変更がとても大変!になってしまいます。 #関係図自体を書きなおさなくてはならないとか。 実世界の変化がプログラムの変化につながるわけで たとえば、2000円札が発行されたのでプログラムもそれに対応してほしいとすると お金に2000円が加わり、2000円札は紙幣で、2000円の価値があって、 という風に、関係図に入れられます。 そしてプログラムではその増えた部分だけを 変更すればよい(厳密にはちがいますが)のです。 そうすると、実世界の変化に対応したプログラムができるわけです。 #実世界は全てオブジェクトで表せるわけですし。 #ですが、図がいいかげんだったり実世界の世界観が変わったりすると・・・ #図から書きなおしの大変なことに。 これがオブジェクト指向でないプログラムだと、 2000円に対する処理がどのくらいになるのか いろいろ調べてみないとわからないことが多いです。 お金を数える部分や1000円しか入らない前提でおつりを出している部分など (まあ、もしそうならということですが) どこを直したらいいのか?もすぐにはわかりにくいのです。 #このあたりはa-kumaさんも書いてらっしゃいますよね
- a-kuma
- ベストアンサー率50% (1122/2211)
「オブジェクト指向」ではなく、それまでのプログラムの作り方というのは、 やること(機能)を決めて、そのやることを細分化・整理(構造化する、と 言う)し、その細分化されたことがらを、プログラミング言語を使って記述 する(機械に分かるように翻訳する)といった流れでした。 このやりかたで問題が出ないシステムもあるのですが、実際、システムの 寿命というのはものによって5~20年あるので、その間に、最初に決めた やることの内容が少し変わったり、やることが想定している対象が増えたり 減ったりということがおきます。 例えば、給与の計算システムを考えた場合、年俸制が導入されたり、派遣社員 も対象としたり、何てことは多々あります。 そのときには、それに対応するように、プログラムの変更を行なうのですが、 その変更の度合いによって、システムの考え方の根元を揺るがすような、まあ ざっくり言うと、変更を加えるところがとても多くなるようなケースが出て きます。 例えば、年俸制なんかの場合、それまでのプログラムには、あちこちに 「月単位であること」を前提としているところがあるはずで、それらを 全て洗い出して、年俸制が適用されている社員だったら、という判断を いちいち追加してゆかなくてはいけません。 こんなことをいちいちやっているのは、とても大変だ、何か良い方法は ないだろうか、と考えていた人たちがいます。 で、その人たちの一部がたどり着いたのが、「オブジェクト指向」です。 根本的な考え方は、「機能というものは、ときと場合によって良く変わる が、【もの】は、そうそう変わるものではない」ということです。 この考え方に基づくと、プログラムの変更の必要が出た場合(*)、もともと 想定していた変更ではなくても、あまり変更するところが多岐に渡ること が無い(ということになっている)です。 (*) どう作ろうが、プログラムの変更の必要は、必ずあります :-)
- kokucho81
- ベストアンサー率61% (157/255)
過去にも似たようなしつもんがありますが、プログラマ向けに説明されたものが多く、少し難しいかもしれません。 ここでは、私自身も文系出身で、プログラムを学んでいった人間ですので、説明致しましょう。 オブジェクト指向とは、何か?という前に、「オブジェクト指向」という考え方の位置付けを知りましょう。 オブジェクト指向という考え方は、ソフトウェア(プログラム)が巨大化するにしたがって、それまでのプログラム技法(構造化プログラム)だけでは、管理しきれないということから、ここ10年で一気に注目を集めてきた概念です。 その誕生自体は、30年以上もまえにさかのぼりますが、実際の現場のプログラマに使われ始めたのは、ここ10年と言って良く、プログラマ開発メンバほぼ全員に浸透したという意味では、ここ5年程度といえると思います。 ですから、実際問題として、「オブジェクト指向型言語で15年以上プログラムしている」という人はほとんど皆無であり、「10年」というひともほとんどいないはずです。 そう言う意味では、私も含め、偉そうなことを行っている人達も、ついぞ最近(ここ10年ほどの間に)学んだことであるには違いないのです。 さて、では本題にうつりましょう。 オブジェクト指向を語る上で、おおきく3つに分けることが出来ると思います。 (1)オブジェクト指向という考え方 (2)オブジェクト指向をサポートするのに必要な機能 (3)オブジェクト指向をサポートするのに必要な機能を備えるプログラミング言語 ★(1)オブジェクト指向という考え方 オブジェクト指向とは、特定の機能を持つオブジェクトが自立する、ということです。ハイ。何の事かわかりませんね。例を使ってみましょう。 オブジェクト指向「でない」考え方とは、どのようなものでしょう。 例えば、「Aさん」の「身長」で例にとり考えてみましょう。 オブジェクト指向ではない考え方では、「Aさん」は、自立していません。 ですから、「Aさん」は、自分で身長をしりません。 そこで、身長を計るための機械(=関数)を別に用意してやり、「Aさん」をここにたたせてやる必要性があります。 すなわち、「Aさん」を「身長の計測器」に乗せてその身長を得るのです。このように「Aさん」が自立していないと、手取り足取り面倒がかかってしょうがないのです。 では、オブジェクト指向「である」考え方とはどのようなものでしょう。 オブジェクト指向では、「Aさん」は、自立しています。 ですから、「Aさん」は、自分で身長を知っています。 ですから、「Aさん」には「身長の計測器」は不必要です。 「Aさん」から身長を得るには、「Aさん、あなた身長は?」と訪ねれば良いだけです。そうすれば、「Aさん」はつつがなく、「何センチです」と答えてくれるでしょう。 この両者の違いが、オブジェクト指向と、そうでないものの根源的違いです。 (2)オブジェクト指向をサポートするのに必要な機能 オブジェクト指向をサポートするために最も必要なこととは何でしょう。 「Aさん」が自立できなかったことと、自立できたことの違いとは、なんなのでしょう。 身長の例で考えてみましょう。 「Aさん」が身長に関して、自立するためには、「身長」という情報と「身長を尋ねられたときの受け答え」について、「Aさん」自身が保持していればよいはずです。 「Aさん」像 〔 ★値★ 身長=170センチ ★行動★ 身長を尋ねられたときの受け答え=“私の身長は”+★値★+“です。” 〕 これで、「Aさん」は身長について自立することが出来ました。ほかにもいっぱい付け足していけば、それだけ「Aさん」はいろいろなことについて、自立できそうですね。 これがオブジェクト指向プログラムの、もっとも根源的ポイントです。 他にも様々な概念がありますが、それらはこの考え方を根本とした派生的、拡張的な概念に過ぎません。 一般的にはオブジェクト指向には次の概念が含まれることが望ましいといわれます。 カプセル化・抽象・継承・ポリモーフィズム ★カプセル化★ カプセル化とは、先ほどの例でいうと、「Aさんの中」と「Aさんの外」をはっきりと区分けして、そとから「Aさんの中」をひっかきまわすことができないようにすることです。 たとえば、外から、勝手に、「Aさん」の身長を150センチにかえたりすると、えらくまずいことになるということがわかります。「Aさん」が自分で身長を知っている意味がなくなってしまいます。 ですから、そのようなことが出来ないようにする仕組をカプセル化といいます。 ★抽象★とは、物事に対して、共通の性質を見つけ、より抽象化することです。(そのままや) 例えば、「ビデオデッキ」と、「コンポ」には、 電源・再生・巻き戻し・はや送り、一時停止・停止・記録 という機能が共通の機能としてあることがわかります。 ですから、「ビデオデッキ」や「コンポ」ではない、モット何か、抽象的な何か概念のようなものがそこにあるということがわかります。こういったことをすることを「抽象」と言います。 ★継承★とは、ちょうど、抽象の逆にあたります。 例えば、 「人類」というのはとても、抽象された概念です。 ここから、 「日本人」「アメリカ人」「中国人」などなど色々な派生概念があることがわかります。 ここで「人類」と「日本人」の「差だけ考えて共通部分は利用する」のが継承です。 「人類」と「日本人」の差とは、 日本人は、「人類」中、ちょっと身長が低い・・・ 日本人は、「人類」中、ちょっと数学に強い・・・ 日本人は、「人類」中、ちょっとお金持ち・・・ だから、日本人は、「人類の共通の性質」+「上のような特殊な性質」と言い表せます。人類の共通の性質は、目が二つとか、耳も二つ~、とか、恒温で~とかいろいろありますが、そういうあたりまえの部分は「継承を使用すれば全て省略できる」ことがわかります。 アメリカ人は、「人類」中、ちょっと身長が高い・・・ アメリカ人は、「人類」中、ちょっと自己中・・・ アメリカ人は、「人類」中、ちょっと発想が自由・・・ アメリカ人も、「人類の共通の性質」+「上のような特殊な性質」と言い表せます。日本人の時と同様に、基本的な性質が全て省略かのうであり、差分だけ考えれば良いことがわかります。 ★ポリモ-フィズム★とは。。。なんだか言葉が意味不明ですね。 しかし、概念は難しくありません。 先ほどの、日本人、アメリカ人、中国人などを例にとって考えてみましょう。 このいろいろな国の人達に、一列に整列してもらいましょう。 そして、前から順番に挨拶してもらいます。 このとき、あなたは、ただひとこと、「挨拶しろ!」と号令をかけるだけです。 すると、 日本人は「こんにちは!」 アメリカ人は「HELLO!」 中国人は「ニーハオ!」 といってくれるのです。あなたは、どこの国の人かは意識していません。 あなたは、ただただ、「挨拶しろ!」といっただけにもかかわらず、 それぞれの人達は、自分の国の言葉で挨拶してくれました。 これが「ポリモーフィズム」です。 「オブジェクトが自立している!」という根源的概念がここに見え隠れしています。 もし、オブジェクト指向でなければ、「あなたは日本人だから、日本人的な挨拶」「あなたはアメリカ人だから、アメリカ人的な挨拶」と手取り足取り教えてあげなくてはならなのです。オブジェクト指向っていいですね♪ (3)オブジェクト指向をサポートするのに必要な機能を備えるプログラミング言語 さぁ、最後になりました。 オブジェクト指向をサポートする言語はいろいろあるのですが、 現在多くの人に広く使用されている、となると数はそれほど多くはありません。 まず、オブジェクト指向言語の代表格としては、「Java言語」があります。 「Ruby言語」なども存在します。 この2つの言語は「オブジェクト指向言語」としてかなり高い完成度を持っています。これらは、「美しい」という言葉がふさわしい言語です。 次にオブジェクト指向的考え方をサポートする言語です。 これの代表格は「C++」です。世界でもっとも多くのプログラマが使用している言語であり、非常に「コンピューターちっく」なことから、先ほどのオブジェクト指向のような「抽象的」なことまで、幅広くサポートする、「強力」という言葉がふさわしい言語です。 次に「Perl言語」です。Perl言語はバージョン5から、オブジェクト指向的考え方をサポートしました。このPerl言語は、「C++」が弱いような分野で非常に力を発揮しており、これは「柔軟」という言葉がふさわしい言語です。 そう、まさに、「剛」と「柔」! 「ラオウ」と「トキ」!(う~ん 古!) いやまぁ、そういうことはどうでもいいとして・・・ 他にも、「PHP」「ObjectPascal」など様々な言語が存在します。いろいろと自分で発見してみてください。