C++は大きな違いがオブジェクト指向ができるらしいのですが・・

調べてみると・・
オブジェクト指向とは、データと手続き型をカプセル化したもの。

意味分かりません。(滝汗)

詳しく教えてください。お願いします。

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

A 回答 (7件)

 オブジェクト指向プログラミングと、従来のプロシージャ指向プログラミングでは、プログラムの中核およびプログラミングする内容が大きく異なります。


 プロシージャ指向ではアルゴリズムを記述したものがプログラムであり、データを流す手順をプログラミングします。
 これに対しオブジェクト指向ではオブジェクト間の連携方式を記述したものがプログラムであり、オブジェクトに与えるメッセージの流れをプログラミングします。

 オブジェクト指向プログラミングの主用概念は、次の3つにあります。
■抽象化
 ・詳細を排除し、基本的特徴だけをとりだすこと。
 ・関数などによってプロセスの詳細を排除する「プロシージャの抽象化」と、CのFILE型やBASICの文字列型のように、複雑なデータ構造を概念的に簡単に表現する「データの抽象化」とがあり、これにより大規模なプログラムを簡単に記述できる。クラスはこの2つを併せ持つ。
■カプセル化
 ・オブジェクト内の細かい仕様や構造を外部から隠蔽すること。
 ・外部からは公開された手続き(メソッド)を通してしかデータを操作できないようにすることで、内部の仕様変更が外部に影響しなくなり、結果ソフトウェアの保守性や開発効率の向上につながる。
■クラスの階層化(継承)
 ・あるクラスをもとに、拡張や変更を加えた新しいクラスを定義し、クラスの階層構造をつくること。
 ・基本クラスの性質は派生クラスへ受け継がれるため、派生クラスでは差分を定義するだけでよい。これによりプログラムの拡張性が高まる。
    • good
    • 0
この回答へのお礼

みなさん、ありがとうございました。

オブジェクト指向についてはなんとなくですが分かりました。
ところで、
オブジェクト指向以外に、CとC++の違いはあるのでしょうか?

お礼日時:2001/06/10 23:23

C++理解の為のおすすめサイトを紹介します



参考URL:http://www.tcp-ip.or.jp/~ikken/cpp/
    • good
    • 0

「たとえ」で紹介していきます。



「動物」というオブジェクトを定義します。
「動物」に共通の性質などはここで定義します。頭があり、足があり、毛があるなどでしょうか?
行動はどうでしょうか?  食べる、鳴く、歩くなどでしょうか?

「動物」には、「犬」、「猫」などがいます。
この「犬」、「猫」などのオブジェクトは「動物」から継承されます。その共通の「性質」などは改めて定義する必要はありません、「犬」、「猫」に特有な「性質」、「行動」などを追加します。

このオブジェクト「動物」に「なけ」という命令をすると、「犬」は「ワンワン」と吠えるでしょう。「猫」は「ニァーン」となくでしょう。これは単に「なけ」という命令だけで、そのオブジェクト(犬や猫)が自分で判断して行動するのです。これが「オブジェクト指向プログラム」です。

では、いままでの「プログラム」はどうでしょうか?

「犬」には「ワンワン」と吠えなさい!
「猫」には「ニァーン」となきなさい!
とそれぞれ指示しないといけませんでした。
これが「手続き型プログラミング」です。

われわれ人間が普通に生活しているときに使用している行動や言葉に非常に近かずいています。

質問の一部だけの紹介でした(^^;
    • good
    • 0

まず、オブジェクトとは「モノ」を抽象化したものです。


その「モノ」は、オブジェクトにあるデータによって特定されます。

 例えば「車」というオブジェクトがあったとします。そして、データとして
排気量、エンジン種別、メーカー、車体色、オーナー名・・・などなどを与える
と1つの車を特定できますよね。
 「Aさんの車」は1600cc、4気筒エンジン、ホンダ、白、Aさん・・・という
データが入っているわけです。(こういうのをインスタンスといいます)
 さてここで「Aさんの車」の車体色を白から赤に変えたとします。
 しかしすぐに不具合が見つかったときに「車体色を塗り替えたのが誰か」が
わからなかったらどうでしょう。とても困りますよね。
 そこで、「車」オブジェクトにあるデータを変えられるのは、「B整備工場」
だけだと決めてしまうわけです。他の人(団体)は、変えられません。
 こうしておくと、「車」オブジェクトのデータを変えるのは常に「B整備工場」
となるので、責任のありかが明確なわけです。
 つまり、オブジェクトにはデータと、それにアクセスできる手続きが一緒に
パッケージ化されてるわけですね。

 こうして、「データと、それにアクセスできる手続きを定義した」オブジェクト
を作っていき、それを組み合わせることで処理を実現することをオブジェクト指向
といい、それを実現するための言語をオブジェクト指向型言語といいます。

 厳密に言えばC言語でもオブジェクト指向に沿ったプログラミングはできます。
 ですから、CとC++の大きな違いは、C++は「オブジェクト指向に沿った仕様が
盛り込まれている」ということだと思います。
    • good
    • 0

Cはオブジェクト指向を取り込んでC++となりました。


オブジェクト指向とは、こう考えてください。
プログラムを作るとき、サブルーチンやサブプログラムを
作ることが多いと思います。一度作成したサブルーチンは
プログラムのあちこちで再利用したり、他のプログラムで
再利用したりします。この考え方をさらに押し進めると
たくさんのサブルーチン(サブプログラム)があれば
簡単にプログラムが作成できるようになります。
オブジェクト指向言語とは、開発に便利な強力なサブルーチン集が提供されたものと考えてください。
このようなオブジェクト(サブプログラム)を組み合わせてプログラムを作る言語です。
(厳密にいうと違うのですが、考え方の基本は上記のようなものです。)
    • good
    • 0

こんにちは、honiyonです。


 今までは関数は関数、データはデータでしたが、これらを組み合わせて「モノ」として定義したのが「クラス」です。 「データと手続き型をカプセル化したもの」とは一般的にクラスといいます・・・というか私はそう思っているのですが間違ってるのかな?(^^i
 クラスについて説明します。

 ここではテレビやビデオについて説明します。
 もし「テレビをつける」という関数をつくるとします。 ただ漠然「void つける();」なんてしたら何をつけるのか分からないので、「void テレビをつける();」などと書く事でしょう。 次にビデオの場合も「void ビデオをつける();」となると思います。 どちらも電源を入れるという動作には変わりはなく、対象物が違うだけで2つの、別の名前(前に対象物の名前がついただけだけど)になっています。 
 クラスを用いると「つける」という名前だけの関数を作る事が出来ます。
 使い方は以下のようになります。 「テレビ.つける();」「ビデオ.つける();」
 イメージ的には構造体(テレビ/ビデオ)の中に関数「つける」が入っているような感じです。 ただ間にドットが入っただけじゃん!!と突っ込まれそうですが、これがとても便利なのです。 例えば「PC.つける」では? 答えは「PCの電源を入れる」ための関数となります。 つまり、ある程度関数名を見ただけでその効果がイメージできちゃうんですね。 変数にしても然り。
 そしてある程度何でも汎用的に使えそうな変数や関数をまとめたクラスを作っておくと、継承なんていうものが出来たりします。 例えば関数「つける」「けす」と変数「置き場所」をまとめたクラスを作成しておきます。 名前は(電気製品)とします。 それぞれの動作はイメージできると思うので省略します。
 そして、 「テレビ = class(電気製品)」としてクラス「テレビ」に継承すると、中身に何も書かずに「テレビ.つける」という動作が出来てしまったりします。
 もし Cでこういう事をしたかったら「void つける(対象 taishou);」をという関数を作っておいて、「つける(テレビ)」となります。 が、真似できないのは「オーバーライド」ですね。 ただ単純に「つける(テレビ);」と同効果ではなく、「つける」関数を「テレビ」用に味付け出来たりするのが「オーバーライド」です。

 クラスの醍醐味は、継承で共通する部分の再開発を避ける事が出来、また関数名も自然と統一されてくるので扱いやすいという所にあると私は思います。

 ん~、こんな説明で良いのかな(^^; 多分微妙にニュアンスが違っている所もあると思うので、もし説明が難解過ぎて分からないようでしたら「関数と変数が詰まってる構造体」でも考えておいてください(笑) 私も最初はそこからクラスを覚えていきました。 そして徐々にオーバーライド、オーバーロード等などクラス独自の楽しみ方を覚えていきました。
 余談&個人的な意見ですが、C++より Delphiを使った方がクラスやオブジェクト指向を覚えやすいかもしれません。 Delphi自体やそのコンポーネントがクラスやオブジェクトをフルに活用しているので、使っているうちにその考えで馴染んでいきます。 

 参考になれば幸いです(..
    • good
    • 0

オブジェクト指向を英語でいうと”Object-Oriented”となります。


”Object”とは「物・物体」を意味し”Oriented”はorientの過去分詞であり
「~の向きにあわせた、~に適応させた」という意味があります。
実世界での物や、物と物との関係をそのまま反映させるプログラム開発の方法を
オブジェクト指向といいます。

わ、分かりにくい・・?
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

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

Qphpでオブジェクト指向と呼べる設計をするには・・・

phpで、なるべく同じ処理は関数化し、
ひとつの大きな処理としてまとめています。

これは、オブジェクト指向といえるのでしょうか?
オブジェクト指向とはもっと高度で汎用性が高く
たんなる関数化ではオブジェクト指向とはいえないでしょうか?

綺麗なオブジェクト指向とは一体のどようなものなのでしょうか?

どこまでオブジェクト化すれば
オブジェクト指向なのかよく分かりません。
使いまわしがきけばオブジェクト指向なのでしょうか?
他のプログラムに影響を与えなければオブジェクト指向なのでしょうか?

質問が抽象的ですが、よろしくお願いします。

Aベストアンサー

>たんなる関数化ではオブジェクト指向とはいえないでしょうか?

いえない。それは「構造化プログラミング」というものだ。プログラムを処理ごとに整理し構造化する手法だな。

オブジェクト指向は、「処理ごと」に整理するのを超え、「独立して扱える個々のプログラムの集合体」として設計する。これはクラスとして設計される。それぞれのクラスは、他のプログラムに依存せずそれぞれ単独で機能する形で設計されなければならない。そうして設計されたクラスの組み合わせによりプログラム全体を構築する。これがオブジェクト指向プログラミング。

関数は、ただ「一つの機能をまとめたもの」に過ぎない。これに対し、クラスは「機能と、値をパッケージ化」する。そのクラスに必要な機能をメソッドとして用意し、そのクラスを利用するために必要な情報をすべてメンバー変数として自身の中に保持する。そのクラスを利用するのに必要な情報は、すべて自分自身の中にある。そうした独立性のあるオブジェクトとしてプログラムを定義するのがオブジェクト指向。

ただ、PHPの場合、ちょっとしたものだとわざわざオブジェクト指向を持ち出さなくとも作れてしまうので、なかなかオブジェクト指向の考えを実践するのは難しいところがある。オレも、ちょっとしたものならまずクラスなんて定義しないで作っちまうし。すっきりと美しく作られたオブジェクト指向を理解したいなら、PHPの場合、MVCによるフレームワークを勉強するのが割と手っ取り早いんでないかと思うな。CakePHPとかZend frameworkなんかを実際に使ってみると、オブジェクト指向がどういうものか、次第にわかってくるんでないかな。

>たんなる関数化ではオブジェクト指向とはいえないでしょうか?

いえない。それは「構造化プログラミング」というものだ。プログラムを処理ごとに整理し構造化する手法だな。

オブジェクト指向は、「処理ごと」に整理するのを超え、「独立して扱える個々のプログラムの集合体」として設計する。これはクラスとして設計される。それぞれのクラスは、他のプログラムに依存せずそれぞれ単独で機能する形で設計されなければならない。そうして設計されたクラスの組み合わせによりプログラム全体を構築する。こ...続きを読む

Qオブジェクト指向の「カプセル化」について

>>@ITより
http://www.atmarkit.co.jp/fjava/devs/object02/fig2_1.gif
オブジェクトが、「固有の状態」と「振る舞い」をカプセル化して隠ぺいしている
>>MSより
メソッド (振る舞い) とプロパティ (属性) をインタフェースとして備えています

@ITの記事では、メソッド自体(振る舞い)もカプセル化により隠ぺいされていると理解したのですが、
MSではインターフェイスとしてメソッドとプロパティが公開されていると説明されていました。

カプセル化では、インターフェイスとして何が公開されているのか、
隠ぺいされているものは何なのか。以上の二点がわかりません。

ちなみに各記事のURLはこちらです。
http://www.microsoft.com/japan/msdn/academic/Articles/csharp/02/csharp2.aspx
http://www.atmarkit.co.jp/im/carc/serial/object02/object02.html

>>@ITより
http://www.atmarkit.co.jp/fjava/devs/object02/fig2_1.gif
オブジェクトが、「固有の状態」と「振る舞い」をカプセル化して隠ぺいしている
>>MSより
メソッド (振る舞い) とプロパティ (属性) をインタフェースとして備えています

@ITの記事では、メソッド自体(振る舞い)もカプセル化により隠ぺいされていると理解したのですが、
MSではインターフェイスとしてメソッドとプロパティが公開されていると説明されていました。

カプセル化では、インターフェイスとして何が公開されているのか...続きを読む

Aベストアンサー

オブジェクトのカプセル化の目的は、内部の振る舞いと属性を外部から隠蔽することで再利用性・メンテナンス性を高めることにあります。
すべてのメソッド(=メッセージ)を隠蔽してしまっては、外部とのインターフェイスが取れなくなりますので、メソッドをすべて隠蔽することはありません。
プロパティ (属性) が外部に公開されても構いませんが、プロパティを外部から書き換えられることで内部の振る舞いに支障が出るようなカプセル化は失敗です。
という前提でMSと@ITの言葉を整理してみましょう。

・@IT「固有の状態」
内部の振る舞いに関する属性を固有の状態と呼んでいると思われます。カプセル化には必須のことです。
・@IT「振る舞い」
内部の振る舞いの事を呼んでいると思われます。同じくカプセル化には必須のことです。
・MS「メソッド (振る舞い)」
外部とのインターフェイスのためのメソッドです。外部の要求に対してメソッドとしての振る舞いをしますが、内部の振る舞いが隠蔽されているならばカプセル化は問題ありません。
・MS「プロパティ (属性)」
外部とのインターフェイスのための属性です。これ単体で使われることはありません。何らかのメソッドで対で使われる必要があります。属性に値を入れてメソッドを呼ぶか、メソッドを呼んで属性に値を入れてもらうかどちらかでしょう。
これ以外に内部の振る舞いのための属性が存在する前提で書かれたものと思われます。

オブジェクトのカプセル化の目的は、内部の振る舞いと属性を外部から隠蔽することで再利用性・メンテナンス性を高めることにあります。
すべてのメソッド(=メッセージ)を隠蔽してしまっては、外部とのインターフェイスが取れなくなりますので、メソッドをすべて隠蔽することはありません。
プロパティ (属性) が外部に公開されても構いませんが、プロパティを外部から書き換えられることで内部の振る舞いに支障が出るようなカプセル化は失敗です。
という前提でMSと@ITの言葉を整理してみましょう。

・@I...続きを読む

Qオブジェクト指向設計について

オブジェクト指向設計に興味を持って、いくつかオブジェクト指向の本を読んでみたのですが、
どうもオブジェクト指向に関する基礎知識の説明ばかりで、
オブジェクト指向でどのように設計するのか、どのように生かされるのか、
肝心な部分がいまいちピンときません。

オブジェクト指向による設計に重点を置いたお薦めの書籍などありましたら是非教えてください。

Aベストアンサー

私も「オブジェクト指向のこころ」がお勧めです。
http://www.amazon.co.jp/dp/4894716844
通して読むと、オブジェクト指向の考え方が分かります。

他には下記のものもお勧めです。
「オブジェクト指向でなぜつくるのか」
http://www.amazon.co.jp/dp/4822281957/

「アジャイルソフトウェア開発の奥義」
http://www.amazon.co.jp/dp/4797347783/

「Code Complete第2版〈上〉」(6章にクラスの解説が有る)
http://www.amazon.co.jp/dp/489100455X/

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

C#でプログラミングをしているのですが、オブジェクト指向を一切使わずに作っています。

作っていくにしたがってツールが重くなってきたのですが、オブジェクト指向を使ってい書いたほうがアプリケーションは軽くなりますか?

Aベストアンサー

描画のやり方がまずいとか、スレッドにすべき部分をしていないとかじゃないでしょうか。
オブジェクト指向と速度には直接の関係はありません。
ただ、ちゃんとオブジェクト指向できる人は、大抵プログラムの設計や最適化もちゃんと出来ると思います。

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

プログラミングにおいて

Java言語などのオブジェクト指向とは

「クラス(設計図)からインスタンス(実体)を量産できる。」がオブジェクト指向ではないプログラミング言語との決定的な違いなのでしょうか?

またオブジェクト指向とオブジェクト指向ではない言語の決定的な違いや
実際に実務において経験した感覚的な違いなどがあれば教えてください。

インターネットに乗っていない些細なことでも構いません。

Aベストアンサー

数学の世界では、関数(写像) の引数には定義域というものがあって、範囲外の値を入力することは許されません。

しかし、定義域を変えて新しい関数を定義することはできます。

例えば対数関数 log x の場合、定義域は x>0 ですが、x=0 の時、log 0=-∞ と定義することもできます。

高校数学では、x<0 を可能にするために log|x| とすることが多いのですが、多値関数の概念を学ぶと

cosπ+i sinπ=e^(iπ)
log(-1)=i(2n-1)π

のように負の対数も定義可能になります。

オブジェクト指向の概念はこれと似ており、入力側の型や範囲を拡げて定義することで既存のプログラムの書き換えをする手間を減らそうというものです。

Qオブジェクト指向のプログラミング言語の勉強法について

オブジェクト指向のプログラミング言語の勉強法について

お尋ねします。
iPhoneアプリを作ってみたいと思い、最近プログラミングの勉強を始め、C言語の入門書を一通り熟読しました。そして、次にオブジェクト指向の言語を勉強しようと思っているのですが、iPhoneアプリの開発に用いる言語は「Objective-C」で、他にも開発に使用できる言語として、「C++」や「Java」などいくつかあると聞き、どれから勉強すればいいのか迷っています。
Objective-CとC++やJavaでは、技術的(表現力?)に大きな差はあるのでしょうか?それとも、Objective-Cだけでも十分なのでしょうか?

そのほか、まだC言語を勉強したばかりでわからないことが多いのですが、ゲームアプリの開発にどのような知識が必要なのか、また効率のよい学習順序、お勧めの書籍など助言を頂ければ幸いです(__)


ちなみに、
・プログラミングの経験は全くありません。
・はじめはシューティングなど動的なゲームアプリを作ろうと思っています。
・妥協せず、基礎からきちんと勉強したいと思っています。

オブジェクト指向のプログラミング言語の勉強法について

お尋ねします。
iPhoneアプリを作ってみたいと思い、最近プログラミングの勉強を始め、C言語の入門書を一通り熟読しました。そして、次にオブジェクト指向の言語を勉強しようと思っているのですが、iPhoneアプリの開発に用いる言語は「Objective-C」で、他にも開発に使用できる言語として、「C++」や「Java」などいくつかあると聞き、どれから勉強すればいいのか迷っています。
Objective-CとC++やJavaでは、技術的(表現力?)に大きな差はあるのでしょう...続きを読む

Aベストアンサー

iphoneアプリを作るならObjective-Cのみです。
先月辺りの規約改定でiphoneアプリの開発環境はapple純正(有料)に制限されました。(個人的には良いことと思ってません。)そこで使用できる言語はObjective-Cだけだったと思います。(確認してください)

先の方も言っているように、まずはどんな形でも動作するものを作るところから始めてください。正直いきなりシューティングはハードルが高いです。

Objective-Cの書籍を買って読みつつサンプルプログラムを動作させつつ一冊終えた辺りで開発環境を購入するぐらいで良いのではないでしょうか。

言語としてのC, C++, JavaはC<=C++<<Javaで左の方がよりハードウエア寄りです。JavaのみでOSは作成できません。アプリを作るならJavaの方が楽です。要するに向き不向きがあるので何をしたいかに拠ります。

オブジェクト指向がきちんとわかれば、C++もJavaも扱いは似たようなものです。
基礎からきちんと勉強するのであればまずは書籍を一冊きっちり終わらせましょう。がんばってください。

iphoneアプリを作るならObjective-Cのみです。
先月辺りの規約改定でiphoneアプリの開発環境はapple純正(有料)に制限されました。(個人的には良いことと思ってません。)そこで使用できる言語はObjective-Cだけだったと思います。(確認してください)

先の方も言っているように、まずはどんな形でも動作するものを作るところから始めてください。正直いきなりシューティングはハードルが高いです。

Objective-Cの書籍を買って読みつつサンプルプログラムを動作させつつ一冊終えた辺りで開発環境を購入するぐ...続きを読む

Qオブジェクト指向の利点とは?

汎用機でCOBOLのSEを10数年やってました。(今は自営業)
COBOLはプロセス型の言語といわれているのに対して
C言語はオブジェクト指向型の言語といわれています。

私はC言語やJAVAで開発したことはないのですが、
C言語、すなわちオブジェクト指向の利点ってなんでしょう?
JAVA、C言語はオブジェクト指向ですよね。

私はソフトウェア開発技術者の資格など持っていますのでオブジェクト指向の表面的な意味は分かります。
ですが実際、アプリ開発時・運用時にどのような利点があるのかがイマイチ分かりません。
「どっちでもいいんじゃないか」なんて思ってしまいます。
プロセス指向(VB、COBOL等)とオブジェクト指向(C言語、JAVA)の差異って何なんでしょう。

よろしくお願いします。

Aベストアンサー

当方は、単なる学部卒の人間ですので、もっとおおざっぱな回答を試みます。(ていうか、そういった事しか出来ないだけなんですが。)

>C言語はオブジェクト指向型の言語といわれています。

C言語も、VBも、COBOLも、確か、同じ「手続き型言語」の一種ですよね。で、それとは別に「非手続き型言語」が何タイプかあり、その中の一つとして、オブジェクト指向型の言語(C++やJavaやSmalltalkなど)があったものと思われます。(以上、第3世代に属する高水準言語です。)

最近も、以下のJavaカテゴリの方で、「オブジェクト指向とは何たるか?」について、回答しておきましたので(#5の所)、そちらの方も参考にされたら、と思います。

「教えて下さい☆」
http://oshiete1.goo.ne.jp/qa2864855.html

上記の過去ログ内にも書かれていますが、「オブジェクト指向の利点」の一つに、「デザインパターンを利用することが出来る」というのが挙げられます。このデザインパターンとは、手短にいえば、過去の熟練したソフト設計者の方々が、数々の試行錯誤の上に得られた、オブジェクト指向設計を行う上で定石とも言える効率的な設計手法(パターン)をまとめたものです。当初は、C++を元に作成され、一番最初に提唱した4人の方々に敬意を表して、GoFパターンとも呼ばれています。(GoFとは、Gang of Four「4人のギャング」の頭文字を取ったもの。)

現在では、この汎用的な23のデザインパターン以外にも、Javaで言えば、J2EEの技術に特化した「J2EEパターン」なるものも存在したりします。こういった事から、若手であまり設計などの経験に乏しい技術者でも、そのような便利な設計手法を利用することができ、一から過去の設計者の方々が経験した、様々な成功や失敗などの体験を繰り返すことがなくなるわけですね。(まあ、実際にはあくまでも手段であって、全部のデザインパターンを使うといったこともないですし、かなり抽象的で難しい事もあってか、逆に使用しない方がいい、といった場合もあるらしいですが。)

あとそれから、以下の書籍の15ページの所に、次のような記述があります。

「ゼロから学ぶC/C++ フリーのコンパイラで気軽に始めよう!」
(編:日経ソフトウェア編集,発行:日経BP社,2005年1月24日 第1版第1刷発行)

「(前略)いったい、オブジェクト指向プログラミングができると何がうれしいのでしょうか。端的に言えば、効率よくプログラムを開発できるようになるのです(図7)。そもそもプログラムをオブジェクトの集合体としてとらえることで、プログラムの構造がぐっと見やすくなります。2000個の変数と1000個の関数から構成した売上管理プログラムだって、わずか数十種類のクラスに整理することが可能なのです。これが開発効率を高めるのは容易に想像できるでしょう。開発時だけでなく、後からプログラムの機能を追加したり、改造を加えることも容易になります。(後略)」

この文章自体がまさに、「オブジェクト指向の利点」を言い表していますね。同じページ内にも「*19 もちろんC言語でも再利用可能なソフト部品を実現できますが、C++のクラスのほうが継承(後述)などによって、より再利用しやすい部品を作ることができます。」といった記述もあります。

最後に、現在Javaの開発においては、Strutsを始めとした「MVCフレームワーク」が主流となっていますが、これ自体もまた、実際には「MVCパターン」というデザインパターンの一種を活用したものとなっています。このことに関して、以下の過去ログでは、「それじゃあ、なぜそのような新しい技術であるフレームワークを利用するのか?」といったような質問がなされています。

「ストラッツ(Struts)って本当にいいの?」
http://oshiete1.goo.ne.jp/qa2049016.html

ここで回答された方々の内容いずれもが、まさに「オブジェクト指向の利点」となっていますね。実際に、M(Model)とV(View)とC(Controller)の3つに分けることによって、担当する部分をより明確にして、切り分けているのです。部品化による恩恵が、こういった所にも表れているわけですね。

参考URL:http://www.ascii.co.jp/books/books/detail/4-7561-4155-2.shtml

当方は、単なる学部卒の人間ですので、もっとおおざっぱな回答を試みます。(ていうか、そういった事しか出来ないだけなんですが。)

>C言語はオブジェクト指向型の言語といわれています。

C言語も、VBも、COBOLも、確か、同じ「手続き型言語」の一種ですよね。で、それとは別に「非手続き型言語」が何タイプかあり、その中の一つとして、オブジェクト指向型の言語(C++やJavaやSmalltalkなど)があったものと思われます。(以上、第3世代に属する高水準言語です。)

最近も、以下のJavaカテゴ...続きを読む

Qオブジェクト指向

 C++ではクラスがありますが、このクラスで「公開(public)」「非公開(private)」キーワードがあります。クラスが変数を持つ場合、どういった変数を公開にしておき、どういった変数を非公開にしておくべきでしょうか。
 Setなんたら()、Getなんたら()というメンバ関数を大量につければ一応変数は全部privateでもできるようですが・・・。なんか非効率的な気がします。

Aベストアンサー

変数を基準に考えてるのではオブジェクト指向になりません。オブジェクトの中でどのような操作が行われているかは、外からすれば気にしないで良いように設計するべきです。
オブジェクトが外に公開するのは、その操作(実装で言えばメンバ関数)です。どのような操作をそのオブジェクトは提供するか、という視点で考えてみてください。

例えば複素数クラスであれば、
 ・足し算可能
 ・掛け算可能
 ・コピー可能
 ・偏角・絶対値取得
 ・Re・Im取得
などを使えれば十分でしょう。このように、使用させる操作だけ公開しておけば、中の変数が(x,y)で管理されていたとしても(r,θ)で管理されていたとしても外から見れば関係ありません。

基本的には、内部の変数そのものは外からタッチさせないものです。

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

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

1.わかりやすかった
2.そこでつまずいた
3.特に意識せずに通り過ぎた
4.その他

いずれでしょうか?

※最初にJavaについて書きましたが、これはただの例なので、オブジェクト指向言語全般についての質問であるととらえてください。

Aベストアンサー

自分は最初の言語がVB6.0とJavaでした(VB6.0は業務で、Javaは個人的に)
なので、最初の言語がオブジェクト指向かどうかは微妙な所です。
(VB6.0はオブジェクト指向言語だと思ってないので)

で、オブジェクト指向の理解については、
2.そこでつまずいた
ですね。
本に書いてある内容は別に難しくも何ともないのですが、
それが何で便利なのか?構造化プログラムとどう違うか?がよく分からなかった。
(完全に独学だったのもありますが)
これを乗り越えなくてはオブジェクト指向を理解する意味ないですから。

また、オブジェクト指向自体も、オブジェクト指向プログラミングと
オブジェクト指向設計/分析とに大きく分かれると思いますが、
それを混同していたというのもありました。
※「モノと捉える」と言いながら、一方で「インターフェース」なんてものが出てくる。
インターフェースって「モノ」なのか?…とか考えてた。

ただ、分かった時はすぐでしたね。ちょっとずつ分かった、という感じではなかった。
真っ暗な部屋でドアが中々見つからなかったのに、部屋の明かりを点けたらそれまでが嘘のように分かった。
そんな感じです。
UMLで設計の勉強したのと、デザインパターンをかじりだしたのがきっかけです。
ずいぶん回り道した気がする…

オブジェクト指向は、ちゃんとした設計で作れば管理しやすく再利用性も高い技術です。
逆に言えば、設計に手を抜くとかえって扱いづらく再利用性のない無駄なコードにもなります。
そういう意味で実践で敬遠されてるのかもしれないですね。
何にしても、奥が深い技術なのでまだまだ勉強中です。

自分は最初の言語がVB6.0とJavaでした(VB6.0は業務で、Javaは個人的に)
なので、最初の言語がオブジェクト指向かどうかは微妙な所です。
(VB6.0はオブジェクト指向言語だと思ってないので)

で、オブジェクト指向の理解については、
2.そこでつまずいた
ですね。
本に書いてある内容は別に難しくも何ともないのですが、
それが何で便利なのか?構造化プログラムとどう違うか?がよく分からなかった。
(完全に独学だったのもありますが)
これを乗り越えなくてはオブジェクト指向を理解する意味ないですか...続きを読む

Qオブジェクト指向の利点と欠点

オブジェクト指向についてある程度勉強しました。そしてだいたいのプログラムの組み方は分かってきました。しかし、まだまだはじめたばかりなので実際のところ利点と欠点がわかりません。オブジェクト指向の原理はだいたいわかりますが、多分経験が不足している状態です。カプセル化や継承、多様性...を使うことで度のようなメリット、デメリットがあるのか具体的に教えてください。

Aベストアンサー

方法論について細かい利点や欠点を語るのは無理があります。
そういう話が出来るのは、もっと具体的な話になってからです。
勉強中ということなので、カプセル化、継承、多態など
要素毎の利点はすでに理解されていると仮定して・・・。

よく言われているところでは、
規模の小さいものを作るのには向いてません。
規模の大きいものを作るに向いています。
また設計が重要です。全てを決定すると言ってもよいです。
設計さえ上手く行けば、あらゆる変更に柔軟に対応出来ます。
その代わり設計は難しいですし、設計を生かすために実装技術も
色々勉強しなくてはならないでしょう。

方法論に根ざした深遠な議論に興味がないなら、
とりあえずライブラリを使ってみることをお勧めしますよ。
MFCはお勧めしません。WindowsやるならBorlandのOWL等。

C++ではSTL,Javaなら各種コレクションなどのライブラリは、
多態や隠蔽がどのように活用されて
使いやすいインターフェイスを提供してくれるかという優れた見本になります。


人気Q&Aランキング

おすすめ情報