オブジェクト指向という表現、よく聞きますが、何のことだかさっぱりわかりません。文系の私にも理解できるよう、どなたか教えてください。
よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

finglasさんがどの程度の前提知識をお持ちで


どのレベルの事をご質問されてるのかちょっとわからないので
あまり厳密な話でなく、おおざっぱですが。

オブジェクト指向は、コンピュータプログラミングをする上での考え方です。
JAVAとかC++とかが「オブジェクト指向プログラミング言語」と言えます。
オブジェクト指向に基づいたプログラムがつくりやすいという言語です。
なので、オブジェクト指向に基づかないプログラムもつくれます。

要は
「オブジェクトという概念で、実世界の全てのモノが表現できる」
というような考え方なのですが、(宗教にも近いかもしれない)
そのオブジェクトというのはなにかというと、
私は「ある概念」だと思います。

自動販売機システムを作る場合を考えると
オブジェクト指向ではないプログラムをつくると
「自販機がどういう状態のときに、お金どのくらい入れたとき、
ある結果(ジュースを出すとか、10円切れランプをつけるとか)を出す」
と考えて、
じゃあ、自販機の状態を覚えておく部分が必要だとか、
お金を数える部分が必要だとか、考え、
そういった機能を満たすプログラムを作っていきます。

これをオブジェクト指向で考えると、
まず、実世界における、対象物(ここでは自販機)の情報を書きます。
自販機というのは、
・中にジュースが入っている
・ジュースが買える
・お金を入れられる
・おつりを出す
それから、その自販機と関係をもつ他のモノを考えます。
・買う人
・ジュース
・お金(100円玉、10円玉、50円玉、1000円札)
100円玉
・硬貨
・100円の価値
・この自販機に入れられる
では、買う人とは何か。
・お金を持っている
・お金を入れてジュースを買う
ジュースとは何か
・名前
・値段
・自販機から出てくる


こんな風にそのモノの情報を出します。
情報には、モノの属性情報と、動きを表す情報があります。
ジュースだと、名前は属性情報で、出てくるというのが動きです。
ここで挙げたモノが全て「オブジェクト」です。

そして、このオブジェクト同士の関係図を書きます。
買う人ーーお金ー>自販機
   <ージュース
とか。
そうすると、実世界の対象物を図に書けたことになります。

このオブジェクトの情報と関係図と情報をもとに、
(というか、それをほぼそのまま)
プログラムをつくるのです。

実際にプログラミングしたことがないとちょっと想像しにくいとは思いますが
オブジェクト指向に基づいてつくったプログラムだと
後々の変更の際、楽である、(これは、関係図の造り方具合によりますが)
のが特徴です。
逆にいえば、関係図など(つまり設計)をてきとーに書いてしまうと
後で変更がとても大変!になってしまいます。
#関係図自体を書きなおさなくてはならないとか。

実世界の変化がプログラムの変化につながるわけで
たとえば、2000円札が発行されたのでプログラムもそれに対応してほしいとすると
お金に2000円が加わり、2000円札は紙幣で、2000円の価値があって、
という風に、関係図に入れられます。
そしてプログラムではその増えた部分だけを
変更すればよい(厳密にはちがいますが)のです。
そうすると、実世界の変化に対応したプログラムができるわけです。
#実世界は全てオブジェクトで表せるわけですし。
#ですが、図がいいかげんだったり実世界の世界観が変わったりすると・・・
#図から書きなおしの大変なことに。

これがオブジェクト指向でないプログラムだと、
2000円に対する処理がどのくらいになるのか
いろいろ調べてみないとわからないことが多いです。
お金を数える部分や1000円しか入らない前提でおつりを出している部分など
(まあ、もしそうならということですが)
どこを直したらいいのか?もすぐにはわかりにくいのです。

#このあたりはa-kumaさんも書いてらっしゃいますよね
    • good
    • 0

「オブジェクト指向」ではなく、それまでのプログラムの作り方というのは、


やること(機能)を決めて、そのやることを細分化・整理(構造化する、と
言う)し、その細分化されたことがらを、プログラミング言語を使って記述
する(機械に分かるように翻訳する)といった流れでした。

このやりかたで問題が出ないシステムもあるのですが、実際、システムの
寿命というのはものによって5~20年あるので、その間に、最初に決めた
やることの内容が少し変わったり、やることが想定している対象が増えたり
減ったりということがおきます。

例えば、給与の計算システムを考えた場合、年俸制が導入されたり、派遣社員
も対象としたり、何てことは多々あります。

そのときには、それに対応するように、プログラムの変更を行なうのですが、
その変更の度合いによって、システムの考え方の根元を揺るがすような、まあ
ざっくり言うと、変更を加えるところがとても多くなるようなケースが出て
きます。

例えば、年俸制なんかの場合、それまでのプログラムには、あちこちに
「月単位であること」を前提としているところがあるはずで、それらを
全て洗い出して、年俸制が適用されている社員だったら、という判断を
いちいち追加してゆかなくてはいけません。


こんなことをいちいちやっているのは、とても大変だ、何か良い方法は
ないだろうか、と考えていた人たちがいます。

で、その人たちの一部がたどり着いたのが、「オブジェクト指向」です。

根本的な考え方は、「機能というものは、ときと場合によって良く変わる
が、【もの】は、そうそう変わるものではない」ということです。

この考え方に基づくと、プログラムの変更の必要が出た場合(*)、もともと
想定していた変更ではなくても、あまり変更するところが多岐に渡ること
が無い(ということになっている)です。

  (*) どう作ろうが、プログラムの変更の必要は、必ずあります :-)
    • good
    • 0

過去にも似たようなしつもんがありますが、プログラマ向けに説明されたものが多く、少し難しいかもしれません。


ここでは、私自身も文系出身で、プログラムを学んでいった人間ですので、説明致しましょう。

オブジェクト指向とは、何か?という前に、「オブジェクト指向」という考え方の位置付けを知りましょう。

オブジェクト指向という考え方は、ソフトウェア(プログラム)が巨大化するにしたがって、それまでのプログラム技法(構造化プログラム)だけでは、管理しきれないということから、ここ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」など様々な言語が存在します。いろいろと自分で発見してみてください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q初心者です。よろしくお願い致します。

初心者です。よろしくお願い致します。

Audio Studioで曲を作りました。これをCD-RWに録音したいのですが、ツールからトラックアットワンスを選ぶとエラーなく録音できますが、なぜか、全く音が聞こえません。録音は無事終わっているのに、いざ聞いてみると無音なのです。

じゃあ、ディスクアットワンスで録音してみようと思ったのですが・・・ツールから、ディスクアットワンスが選べないのです。トラックアットワンスは選べます。

どうしたら、ちゃんとCDに録音されて聞くことができるのでしょうか。

お分かりの方いらしたら、教えてください。
よろしくお願い致します。

Aベストアンサー

えーとCD-RWでは確か駄目です
CD-Rでないと音は出ませんよ。
それと知っているならいいのですが
CDで再生出来るCD-DAフォーマットは
44.1Mhzの16ビットステレオです。

Q秀丸の正規表現で [ や ] 自体を表現したい

秀丸の正規表現による検索や置換で [ や ] 自体を使いたいんですがどうすればよいでしょう。
たとえば、配列[i][j][k] ( i , j , k は0~9でいくつかある)などを一気に配列[i][i][i]としたり配列[k][j][i]としたりしたいのです。
よろしくお願いします。

Aベストアンサー

正直言って秀丸のことはよく知りませんが、正規表現のメタ文字の意味を打ち消するには「\」を前につけます。

\[ とか \] と書くといいのではないでしょうか。

Q秀丸の正規表現(1バイト文字,2バイト文字の表現)

「英文-日本文」がセットになったデータがあります。これを英文と日本文の間で切り分けたいと思っています。Perlなどを使えばより簡単かもしれませんが、Perlはあまり知らないので、秀丸の正規表現でやりたいと思っています。そこで、1バイト文字、2バイト文字の表現の仕方が必要になってくると思うのですが、どう書いたらいいのでしょうか。

(参考データ)
This is a pen. これはペンです。

This is a pen. /// これはペンです。
のようにしたいです。

Aベストアンサー

> 第3水準の「・」まででも大丈夫かも。

ほらインターネットじゃ文字化けしちゃった・・・

\f[\ -~]\f[、-熙]
これの「熙」を別の文字に変えてください。

IMEパッドの「文字一覧」を起動。
漢字一覧を一番下までスクロール。
「・」が連続してますが、そこから上へちょっと戻ると漢字がでてきます。
私はWindowsXP IME2002(8.1.4004.0)ですが、シフトJISの0xfc4bの文字が一番最後の漢字みたいです。
「熙」をその文字に変えてみてください。

QSimDisc3 の使い方がさっぱり分かりません

せっかくあるのに使い方がさっぱり分かりません。マウントしたいソフトの仮想ファイルというのはSimDiscで作るのではないのですか。「イメージ作成」で作るのかなと思ったのですが。拡張子は?ドライブ数を決めますよね?あれは、たくさん作ると何か問題があるのでしょうか。問題がなければ、最初から10個設定とか勝手にするのでは?と思うと、不安でいくつ作ったらよいのかわかりません。ごめんなさい。わからなすぎて、弾丸のような質問になってしまいました。よろしくお願いします。使用方法のあるLINKなどありましたらお願いします。

Aベストアンサー

仮想ファイルはSimDiscで作れると思いますが、拡張子はisoです。出来なければ、ライティングソフトやフリーソフトでも可能です。
ドライブ数は1個でも10個でも構わないでしょう。
最初から10個設定になっていると、マイコンピューターに10個仮想ドライブが出て10個も使わない人は邪魔になりますよね?と言うことだと思います。
仮想ドライブ数はいつでも変更可能ですから使う数だけで良いと思いますよ。
このソフト持っていないので、あまり詳しいことを書けなくてすいませんです。

Q勝手が違うのでさっぱり分からない

LINUX1304ですがシステムフォルダーにファイルをコピーしようとしてコピーするファイルの頭で右クリックの、”コピー”を選び システムファルダーを開いて、”貼り付け”をすると「何らかのエラーでコピーできませんでした」と出ます。LINUXはWindwsの時のようにコピーできないのでしょうか?どんな時に右クリップのコピーと使うのか、コピーは端末開いてからDOSコマンドのようにいちいち指定しないと出来ないのでしょうか?すみませんビギナーですので。

Aベストアンサー

Unix系のOSはWindows系と違って、使いやすさよりも、セキュリティと基本のルールを優先して作られ、発展したOSです。
DOSやWindowsからLinuxに乗り換えるには、ちょっと一段か二段の壁があります。
使いずらく感じる点もありますけど、根気強く、頑張って覚えましょう。


このカテゴリの人気Q&Aランキング

おすすめ情報