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

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

解決済みの質問

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

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

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

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

よろしくお願いします。

投稿日時 - 2007-04-06 09:46:10

QNo.2898284

暇なときに回答ください

質問者が選んだベストアンサー

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

>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

投稿日時 - 2007-04-08 21:42:06

お礼

回答ありがとうございます。

>C言語も、VBも、COBOLも、確か、同じ「手続き型言語」の一種ですよね。

失礼しました。そうですよね。投稿した後分かりました。
「デザインパターン」なるものはあまりよく知りませんでした。効率よくプログラムを開発できるのなら使ってみたいですね。プログラムの構造が見やすくなる、というのも魅力的です。

ただ、COBOLにもサブルーチンはあるし、VBやCには関数もありますよね。実際、JAVA等でPGをしたことがないので、どう”効率的”になるのかイメージしずらいのです。教えていただいたJAVAの本で勉強してみたいと思います。

今回のこの質問は私にとって非常に参考になりました。
今まで知らなかった世界を垣間見た感じです。まだまだ勉強不足なのでいろいろ調べてやってみたいと思います。

ありがとうございました!

投稿日時 - 2007-04-09 14:04:19

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

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

回答(3)

ANo.2

オブジェクト指向技術を数学(形式)ぬきで説明することが多すぎるので様々な事象が起きているように思います
少しでも抽象的な理解を深めると、考え方が変わるように思います
参考にしてください
オブジェクト指向システム分析設計入門
http://www.sra.co.jp/people/aoki/IntroductionToOOAOOD/index.htm
オブジェクト指向は内容よりも形式を大事にする。抽象化を武器にして,内容から形式を切り離し,独創的な構想から新たな形式を創り出すことを尊ぶのである。その意味で,哲学の構造主義や,数学の公理主義に近い。けっして機能主義や経験主義を否定しているのではない。内容の抽象化を経て得られた形式の背後には,無数の具体的なものが控えているはずであり,現実世界からかけはなれたものではない。しかし,形式を偏重し過ぎて,対応する現実世界を失った構想が乱用される危険が増したことも事実であろう。かといって,オブジェクト指向からフレームワークという枠組みを排斥すれば,オブジェクト指向そのものが否定される。オブジェクト指向は,これらの微妙なバランスの上に成立しているのである。

投稿日時 - 2007-04-08 14:44:05

お礼

回答ありがとうございます。
難しそうな本ですね(笑)でも読んでみたいと思います。
大学は理系だったため数学は多少分かります。
ありがとうございます。

投稿日時 - 2007-04-09 13:18:56

ANo.1

私は10年前まではCOBOLで汎用機のプログラムを書いていました。
今はVB、VC++と渡り歩いてこの数年JAVAでコードを書いています。

10年という経験者と言うご質問者さまに合わせましてある程度専門的な観点からお答えしたいと思います。

COBOLなどの手続き型のプログラミングの場合、フローチャートなどの流れ図に従いながら設計を行います。
その中で、同じロジックが組まれている部分をサブルーチンと呼ばれる子供のプロセスを呼び出して処理を行いますね。
しかし、その中で使用する変数のメモリ空間はCOBOLで言えばDATA DIVISIONで定義したプログラム内の共通したメモリ空間を使用する事になると思います。

一方、JAVA、C(VBもオブジェクト指向ですね。)などは、そのサブルーチンが一つ一つが物体(オブジェクト)という仮定したモノを取り扱う形で設計します。そのためにフローチャートの前にUMLなどを使用してオブジェクトの設計を行います。
オブジェクトにはプロパティ(属性)やメソッド(作用)があり、プロパティを設定して、作用させることによって得られた戻り値を他のオブジェクトやメインルーチンで使用する事になります。
一つ一つのサブルーチンが物体として完結しているので、その部分の流用が可能となり、コーディングの流用化や品質責任の明確化などの利点があります。

もちろん、オブジェクト指向な言語でもベタで手続き型としてプログラムを書くことは可能です。
たとえば全ての変数をメンバ変数として定義してコードを作成した場合はオブジェクト指向で書いたコードとは実際言えないと思います。

投稿日時 - 2007-04-06 13:15:39

お礼

返事遅れてすみません。
回答ありがとうございました。
COBOLでサブルーチンを使用する場合、あらかじめコンパイルしてロードモジュールにサブルーチンを組み込んでおかなくてはいけません。(staticの場合)なのでメモリ空間もサブルーチンと共用で使用しなければなりませんが、javaはサブルーチン自身が1つのオブジェクトなのでメモリ空間はメインPGと独立して生成されるということでしょうか。なるほど。参考になりました。
UML図なども勉強してみたいと思います。

投稿日時 - 2007-04-09 13:14:17

あなたにオススメの質問