オブジェクト指向プログラミングとその利点についてわかりやすく教えてください。

回答の条件
  • 1人2回まで
  • 登録:2007/03/14 22:36:12
  • 終了:2007/03/15 23:39:52

ベストアンサー

id:kazu1107 No.1

kazu1107回答回数199ベストアンサー獲得回数142007/03/15 01:26:23

ポイント100pt

とりあえず、利点について書いてみました、より深く知りたいと思うなら本を読むべきです。

まずはじめに言っておかなければならないのは、オブジェクト指向とはあくまで思想であって、言語的な機能が全てという訳ではありません。

 継承やらメモリ管理・初期化などは、確かにC言語では不自由な点が多いですが、実践しようとして出来ない物でもなかったりしますし、無意識のうちに実践してるものかも知れません。

 オブジェクト指向の利点はその保守性にあります。

 クラスがよく設計図にたとえられるように、クラスという設計図を作れば、オブジェクト指向言語はそこから複数のオブジェクトを作成してくれます。

 実質的なクラスという機能は、C言語の構造体に関数の機能を追加できるもの。最初はその程度の認識で良いかと思います。

 C言語の時も、「struct struct_name struct_data;」 で構造体のメモリを確保できたように、C++言語のクラスも「class_name object;」という宣言でメモリを確保することが出来ます。

 一見してとても似た二つの機能(C++上では構造体の機能はクラスと99%同じです)ですが、Cの構造体と、C++のクラス。両者の決定的な違いは内包するデータの扱い方にあります。

 構造体に対してはmain関数など、プログラムの流れに直接関わってくるような場所でも自由に設定などするのに対し、クラスを使った場合、インタフェイスとなる関数を通して操作を行うことを作法としています。(直接的な読み書きも可能ですが、オブジェクト指向の思想に反します)

 この利点はインタフェイスの仕様さえ変えなければ、たとえクラス内部データの扱い方を変えようが、アルゴリズムを変えようが、インタフェイスの動作仕様さえ変わらなければ外部への影響はない。よって、保守が簡単になります。

 プログラミングに限らず、設計時の基本として、物事は細かく分けて見れば見るほど単純な構造になり、問題点を把握しやすいのです。車一台をつくるにしても、エンジンとボディの設計はある程度切り離されて行われたりします。

 現実世界でも実践されている思想をプログラミング言語に取り入れた手法が「オブジェクト指向」と言われる物です。

 今回はとりあえず「カプセル化」で得られる利点を書いてみましたが、他に継承という機能もあります。

 詳しくは書きませんが、簡単に言うなら、過去に作成したクラスに機能を追加したい時や、一部のオブジェクトに例外的な処理が必要な時など、ベースクラスのコードを再利用するとき便利な機能です。

 このような利点はその思想の裏にある特徴を理解しないと、表向きだけの実装で、スパゲティコードになってしまうこともあるので注意が必要ですね。

id:loast

長文ありがとうございます。

本を読み、もっと勉強してお話しの内容を理解できるように勤めることとします。

C言語の構造体という説明は私にはわかりやすかったです。ありがとうございます

2007/03/15 23:35:43

その他の回答(2件)

id:kazu1107 No.1

kazu1107回答回数199ベストアンサー獲得回数142007/03/15 01:26:23ここでベストアンサー

ポイント100pt

とりあえず、利点について書いてみました、より深く知りたいと思うなら本を読むべきです。

まずはじめに言っておかなければならないのは、オブジェクト指向とはあくまで思想であって、言語的な機能が全てという訳ではありません。

 継承やらメモリ管理・初期化などは、確かにC言語では不自由な点が多いですが、実践しようとして出来ない物でもなかったりしますし、無意識のうちに実践してるものかも知れません。

 オブジェクト指向の利点はその保守性にあります。

 クラスがよく設計図にたとえられるように、クラスという設計図を作れば、オブジェクト指向言語はそこから複数のオブジェクトを作成してくれます。

 実質的なクラスという機能は、C言語の構造体に関数の機能を追加できるもの。最初はその程度の認識で良いかと思います。

 C言語の時も、「struct struct_name struct_data;」 で構造体のメモリを確保できたように、C++言語のクラスも「class_name object;」という宣言でメモリを確保することが出来ます。

 一見してとても似た二つの機能(C++上では構造体の機能はクラスと99%同じです)ですが、Cの構造体と、C++のクラス。両者の決定的な違いは内包するデータの扱い方にあります。

 構造体に対してはmain関数など、プログラムの流れに直接関わってくるような場所でも自由に設定などするのに対し、クラスを使った場合、インタフェイスとなる関数を通して操作を行うことを作法としています。(直接的な読み書きも可能ですが、オブジェクト指向の思想に反します)

 この利点はインタフェイスの仕様さえ変えなければ、たとえクラス内部データの扱い方を変えようが、アルゴリズムを変えようが、インタフェイスの動作仕様さえ変わらなければ外部への影響はない。よって、保守が簡単になります。

 プログラミングに限らず、設計時の基本として、物事は細かく分けて見れば見るほど単純な構造になり、問題点を把握しやすいのです。車一台をつくるにしても、エンジンとボディの設計はある程度切り離されて行われたりします。

 現実世界でも実践されている思想をプログラミング言語に取り入れた手法が「オブジェクト指向」と言われる物です。

 今回はとりあえず「カプセル化」で得られる利点を書いてみましたが、他に継承という機能もあります。

 詳しくは書きませんが、簡単に言うなら、過去に作成したクラスに機能を追加したい時や、一部のオブジェクトに例外的な処理が必要な時など、ベースクラスのコードを再利用するとき便利な機能です。

 このような利点はその思想の裏にある特徴を理解しないと、表向きだけの実装で、スパゲティコードになってしまうこともあるので注意が必要ですね。

id:loast

長文ありがとうございます。

本を読み、もっと勉強してお話しの内容を理解できるように勤めることとします。

C言語の構造体という説明は私にはわかりやすかったです。ありがとうございます

2007/03/15 23:35:43
id:karasimiso No.2

karasimiso回答回数41ベストアンサー獲得回数12007/03/15 11:48:18

ポイント90pt

簡単なシューティングゲーム作成を例に例えると、


構造化プログラミングの場合、

  1. 画面表示
  2. キー入力
  3. 自機の移動
  4. 敵機の移動
  5. 自弾の発射&移動
  6. 敵弾の発射&移動
  7. 自機の当たり判定 -> 当たりなら自機爆発 -> 1機減らす
  8. 敵機の当たり判定 -> 当たりなら敵機爆発 -> スコア加算&敵機消滅
  9. はじめに戻る


オブジェクト指向プログラミングの場合

  • 画面上の物体クラス
    • ステータス1:スコア
    • ステータス2:ヒットポイント
    • メソッド1:移動
    • メソッド2:当たり判定
  • 画面クラス
    • ステータス1: 今、画面上にある物体一覧
    • メソッド1:ゲーム開始
    • メソッド2:キー入力イベント
    • メソッド3:今、画面上にある物体を全て移動&当たり判定&表示


このように、オブジェクト指向プログラミング(以下OOP)では(上位レイヤーにおいて)、自機や敵機、弾や背景さえもシステム上で区別する必要が無いので設計がずいぶんとすっきりします。

そして、後はシステムの中核をいじることなく敵機やステージの設計に専念できるようになります。(もちろん、敵機や自機は「画面上の物体クラス」を継承して作っていく必要があるので、ソースコードはいじりますが。)

id:loast

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

シューティングゲームにおけるOOPのご説明、経験しただけに感覚的に理解できる気がします。

カプセル化して、細分化・専門化、とてもわかり易い説明ありがとうございました。

2007/03/15 23:38:50
  • id:nandedarou
    loastさんに分かりやすく解説する為には、
    loastさんがどんなことを知っているかを大体知る必要があります。
    そこで、質問したいのですが、
    loastさんは何かプログラムやマクロを作ったことはありますか?
    作った事があるなら、どんな言語で作りましたか?
  • id:loast
    どうも。
    私が満足に使えるのはC言語です。
    SDLを使ってシューティングゲームを作成したことがあります。
  • id:coolstyle
    とりあえずこちらも一読しておくことを強くお勧めします。
    http://d.hatena.ne.jp/sumim/20040525/p1
  • id:nandedarou
    質問だけして回答せず、失礼しました。
    (他の回答者が回答し易いように、情報を引き出すのが目的で質問しました。私よりうまく解説してくれる人がいると思いましたので。)

    私は、『オブジェクト指向でなぜつくるのか』という本を読んだことがあります。私には非常に分かり易かったです。

    あと、理解の為の裏技を紹介します。
    VBをやると、オブジェクトが直感的にわかるようになります。VBのコントロールといわれる部品がアイコンになっていて目に見えます。それがクラスであり、それをドラッグ&ドロップすると実際に使えるようになります。それは、オブジェクトです。そのオブジェクトをクリックするとプロパティーウィンドーにプロパティーが表示され、変更や設定ができます。ここまで、目に見える物のように感じます。これがオブジェクトの感覚です。
    ※VB自体は完全なオブジェクト指向ではありません。

    私はオブジェクト指向言語でなくても、この感覚でプログラムを作っています。実際、kazu1107さんのいうように「オブジェクト指向とはあくまで思想であって

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません