とりあえず、利点について書いてみました、より深く知りたいと思うなら本を読むべきです。
まずはじめに言っておかなければならないのは、オブジェクト指向とはあくまで思想であって、言語的な機能が全てという訳ではありません。
継承やらメモリ管理・初期化などは、確かにC言語では不自由な点が多いですが、実践しようとして出来ない物でもなかったりしますし、無意識のうちに実践してるものかも知れません。
オブジェクト指向の利点はその保守性にあります。
クラスがよく設計図にたとえられるように、クラスという設計図を作れば、オブジェクト指向言語はそこから複数のオブジェクトを作成してくれます。
実質的なクラスという機能は、C言語の構造体に関数の機能を追加できるもの。最初はその程度の認識で良いかと思います。
C言語の時も、「struct struct_name struct_data;」 で構造体のメモリを確保できたように、C++言語のクラスも「class_name object;」という宣言でメモリを確保することが出来ます。
一見してとても似た二つの機能(C++上では構造体の機能はクラスと99%同じです)ですが、Cの構造体と、C++のクラス。両者の決定的な違いは内包するデータの扱い方にあります。
構造体に対してはmain関数など、プログラムの流れに直接関わってくるような場所でも自由に設定などするのに対し、クラスを使った場合、インタフェイスとなる関数を通して操作を行うことを作法としています。(直接的な読み書きも可能ですが、オブジェクト指向の思想に反します)
この利点はインタフェイスの仕様さえ変えなければ、たとえクラス内部データの扱い方を変えようが、アルゴリズムを変えようが、インタフェイスの動作仕様さえ変わらなければ外部への影響はない。よって、保守が簡単になります。
プログラミングに限らず、設計時の基本として、物事は細かく分けて見れば見るほど単純な構造になり、問題点を把握しやすいのです。車一台をつくるにしても、エンジンとボディの設計はある程度切り離されて行われたりします。
現実世界でも実践されている思想をプログラミング言語に取り入れた手法が「オブジェクト指向」と言われる物です。
今回はとりあえず「カプセル化」で得られる利点を書いてみましたが、他に継承という機能もあります。
詳しくは書きませんが、簡単に言うなら、過去に作成したクラスに機能を追加したい時や、一部のオブジェクトに例外的な処理が必要な時など、ベースクラスのコードを再利用するとき便利な機能です。
このような利点はその思想の裏にある特徴を理解しないと、表向きだけの実装で、スパゲティコードになってしまうこともあるので注意が必要ですね。
とりあえず、利点について書いてみました、より深く知りたいと思うなら本を読むべきです。
まずはじめに言っておかなければならないのは、オブジェクト指向とはあくまで思想であって、言語的な機能が全てという訳ではありません。
継承やらメモリ管理・初期化などは、確かにC言語では不自由な点が多いですが、実践しようとして出来ない物でもなかったりしますし、無意識のうちに実践してるものかも知れません。
オブジェクト指向の利点はその保守性にあります。
クラスがよく設計図にたとえられるように、クラスという設計図を作れば、オブジェクト指向言語はそこから複数のオブジェクトを作成してくれます。
実質的なクラスという機能は、C言語の構造体に関数の機能を追加できるもの。最初はその程度の認識で良いかと思います。
C言語の時も、「struct struct_name struct_data;」 で構造体のメモリを確保できたように、C++言語のクラスも「class_name object;」という宣言でメモリを確保することが出来ます。
一見してとても似た二つの機能(C++上では構造体の機能はクラスと99%同じです)ですが、Cの構造体と、C++のクラス。両者の決定的な違いは内包するデータの扱い方にあります。
構造体に対してはmain関数など、プログラムの流れに直接関わってくるような場所でも自由に設定などするのに対し、クラスを使った場合、インタフェイスとなる関数を通して操作を行うことを作法としています。(直接的な読み書きも可能ですが、オブジェクト指向の思想に反します)
この利点はインタフェイスの仕様さえ変えなければ、たとえクラス内部データの扱い方を変えようが、アルゴリズムを変えようが、インタフェイスの動作仕様さえ変わらなければ外部への影響はない。よって、保守が簡単になります。
プログラミングに限らず、設計時の基本として、物事は細かく分けて見れば見るほど単純な構造になり、問題点を把握しやすいのです。車一台をつくるにしても、エンジンとボディの設計はある程度切り離されて行われたりします。
現実世界でも実践されている思想をプログラミング言語に取り入れた手法が「オブジェクト指向」と言われる物です。
今回はとりあえず「カプセル化」で得られる利点を書いてみましたが、他に継承という機能もあります。
詳しくは書きませんが、簡単に言うなら、過去に作成したクラスに機能を追加したい時や、一部のオブジェクトに例外的な処理が必要な時など、ベースクラスのコードを再利用するとき便利な機能です。
このような利点はその思想の裏にある特徴を理解しないと、表向きだけの実装で、スパゲティコードになってしまうこともあるので注意が必要ですね。
長文ありがとうございます。
本を読み、もっと勉強してお話しの内容を理解できるように勤めることとします。
C言語の構造体という説明は私にはわかりやすかったです。ありがとうございます
簡単なシューティングゲーム作成を例に例えると、
構造化プログラミングの場合、
オブジェクト指向プログラミングの場合
このように、オブジェクト指向プログラミング(以下OOP)では(上位レイヤーにおいて)、自機や敵機、弾や背景さえもシステム上で区別する必要が無いので設計がずいぶんとすっきりします。
そして、後はシステムの中核をいじることなく敵機やステージの設計に専念できるようになります。(もちろん、敵機や自機は「画面上の物体クラス」を継承して作っていく必要があるので、ソースコードはいじりますが。)
回答ありがとうございます。
シューティングゲームにおけるOOPのご説明、経験しただけに感覚的に理解できる気がします。
カプセル化して、細分化・専門化、とてもわかり易い説明ありがとうございました。
長文ありがとうございます。
本を読み、もっと勉強してお話しの内容を理解できるように勤めることとします。
C言語の構造体という説明は私にはわかりやすかったです。ありがとうございます