ここから本文です

オブジェクト志向はC言語の関数化とどう違うんですか?なるべくプログラム初心者に...

常盤兼成さん

2015/4/2401:14:52

オブジェクト志向はC言語の関数化とどう違うんですか?なるべくプログラム初心者にも分かりやすい説明をお願いします

閲覧数:
118
回答数:
7
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

foo********さん

2015/4/2412:20:18

回答にはなってません。

>C言語の関数化
は、わかるのですか?

ある程度以上大きなプログラムの場合
・main() にずらずら全部書いて、やっつける
より
・複数の関数に分割して、連係プレイでやっつける
方が「やりやすい」ということが、
体感としてわかりますか? という意味です。

それも体感ない、という状態での漠然質問だとすると、
>プログラム初心者にも分かりやすい説明
は、ワタクシごときでは、できないです。

  • 質問者

    常盤兼成さん

    2015/4/2413:24:09

    c言語の関数化は多少経験したこともあるのである程度は理解しています
    オブジェクト指向の方は関数化のように分割する+αくらいのあやふやなイメージしかありません(実践経験はないに等しいです)

  • その他の返信を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2015/4/30 08:23:36

みな様回答ありがとうございました
色んな観点から解説して頂いてとても勉強になりました

>>khurataさん
『オブジェクト指向で何故作るのか』購入してみました
まだ途中までしか読めていませんがプログラミングの進化の過程を踏まえた説明がとても分かりやすかったです
これからじっくり読んでみたいと思います
ありがとうございました

ベストアンサー以外の回答

1〜5件/6件中

並び替え:回答日時の
新しい順
|古い順

アバター

ID非公開さん

2015/4/2711:31:50

基本的にシステムは 小さなプログラム(オブジェクト)の集合体なので、
スムーズにオブジェクト同士を統合できるようにしましょうっていうのが
オブジェクト指向です


乾電池みたいなもんです。

電池ってマンガンとか水銀とか色々種類はありますけど、
頭は+、ケツは−っていうのは統一されてるじゃないですか。

要するに、頭とケツさえきちんと決めていれば、
連結するとき楽になるわけです。

極端な話、電池を使う人にとって電池の中身の構造とかはどうでもいいので、
中身をどれだけ自由に作ろうが構いません。
(もちろん分かりやすくコードを書くに越したことは無いですが)

その乾電池がプログラムでいうクラスみたいなもので、
+と-の入力出力部分はpublicで公開しといて、中身の構造はprivateで隠しとけばOKみたいな


関数と似てますね。引数で入力を、returnで出力を設定するのが「関数」ですが、
それをクラス(class)ぐるみでやっちゃう感じです

2015/4/2708:51:34

関数を作るのは実装のやり方の話。
オブジェクト指向(×志向とか思考とか)は、プログラム(ソフトウェア)の全体を作り上げる概念。

Cでだってオブジェクト指向でプログラムは組めるし、オブジェクト指向対応の言語でもオブジェクト指向的じゃないプログラムになったりする。

最初からオブジェクト指向で教育しちゃえ,なんて論もあるけれど、初心者に「オブジェクト指向ってこういうことです」と教えるのは難しくないだろうか。
プログラムはこういう考え方で作りましょう、という指導なら出来そうな気はするけれど、オブジェクト指向に定義を与えてそれを理解してもらうのは初心者には難しいのでは、ということね。

#ましてや曲解してわけのわからない批判をしている熟練者は...

飛行科医さん

2015/4/2613:26:22

たとえばJavaやC++のプログラムを見ても、一見C言語とあまり違いが分からないだろう。
ひとつのクラスの中のプログラミングではC言語とホントに良く似ている。
違いがでてくるのは、複数のクラスを組み合わせてプログラミングするようになってからだ。
だから、今の時点で疑問に感じるのはむしろ当然。

なので、ちょっとした予習として、オブジェクト指向プログラミングについて説明しとく。

その前にまず、C言語でのプログラミングの問題点について。
C言語のような、オブジェクト指向プログラミング以前の言語では、大きなプログラムを1つのプログラムで作成する。
大きなプログラムの持つさまざまな機能を個別の関数として作成して、関数から関数を呼び出す形でプログラミングする。大規模な機能を持つプログラムは、大量のコーディングの塊になって、やがて人間の頭ではとても対応できなくなってしまう。

そこでオブジェクト指向プログラミングでは、大きなプログラムを作るとき、そのプログラムの機能を分析して、単純な機能を組み合わせた形で構成できるようにした。そしてその単純な機能を担当する小さなプログラムが「オブジェクト」と呼ばれるものだ。

たとえば指定されたファイルにデータを書く機能なら、指定されたファイル名(文字列)を読み込むオブジェクト、指定されたファイルを探し出すオブジェクト、ファイルが無ければ新規に作成するオブジェクト、ファイルにデータを書き込むオブジェクト・・・なんて具合(実際はもっと注意深く、汎用性が有る形に分割するが)

そしてJavaやC++の場合、オブジェクトの元になる「クラス」を定義していく形でプログラミングする。
で、実際のところクラスのプログラミング自体は、C言語のプログラムと大して変わらない。
関数のことをメソッド、変数を機能・特性に応じてフィールドとか局所変数と呼んでるけど。

違っているのは、オブジェクト指向プログラミングでは、小さなオブジェクト同士が協力して大きなプログラムを構成できるようになっている点。
だから大きな機能を作る場合も、C言語のように大規模で複雑怪奇なプログラムを作らなくて済む。
小さなオブジェクトを組み合わせて大きな機能を作れば良いのだし、うまく作ったオブジェクトならいろいろ他のプログラムでも流用できるから手間もかなり省ける(だからオブジェクトを「プログラム部品」として流通させることが可能になるわけだ)。

これから少し勉強が進んで、複数のクラス(最初は2〜3個のクラスを使うところから始めるだろうけど)を使ったプログラミングが始まると、「C言語の関数化」との違いが実感できるようになってくると思う。

プロフィール画像

カテゴリマスター

原沢信道さん

2015/4/2409:22:30

関数はプログラムのロジックを分割して単にサブルーチン化した物です(昔は値を戻すサブルーチンを関数と言っていましたが、現在はサブルーチンを関数と言っている場合が多いです)。オブジェクト指向のクラスはプログラムのロジックを持ち、更にデータも持ち、実際に使う場合はクラス名にインスタンス名を付けてオブジェクト化(しなくても良い方法も有ります)してから使うので、複雑な構造のプログラムと成り、全体を通して解析する場合、解析しにくいプログラムと成る欠点が有ります。

khurataさん

2015/4/2408:46:46

C++ で採用されたオブジェクト指向(※1)は、関数化のさらにさらに先にある技術です。

相当乱暴な言い方をすれば、どちらも、「同じことを極力2回以上書きたくない」という要望を満たすためのテクニック、つまり
「再利用」
のための技術です。

この回答欄で、誤解の無いよう説明するのは私には無理っぽいので、下記の書籍をご覧になることをおすすめします。
http://www.amazon.co.jp/dp/4822284654
(私が言葉を尽くすより、はるかに良い説明が書かれています)

※1
C++ のオブジェクト指向は、「クラス」を基盤に置くもので、そのため「クラス・ベース・オブジェクト指向」と呼ばれる。
オブジェクト指向には、他にも「プロトタイプ・ベース・オブジェクト指向」がある。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる