\r\n\r\n
プログラミングの初心者の方や、いろいろな言語を調べ始めた方は、「オブジェクト指向プログラミング」(または「OOP」)という言葉を目にしたことがあるかもしれません。
どういうものか、技術的な説明はいろいろありますが、今日はオブジェクト指向をわかりやすく定義します。
オブジェクト指向プログラミング言語が何であるかを理解するためには、それが何に取って代わるのかを理解する必要があります。初期のプログラミング言語は手続き型と呼ばれるもので、プログラマーがコンピュータに実行させるプログラムを非常に具体的に定義するからである。
初期のころは、ミシン目の入ったカードにプログラムが書かれていた。これらのステップは、データを受け取り、そのデータに対して一連の演算を行い、新しいデータを出力するものであった。
手続き型言語は、以前からうまくいっていた(今でも使われているものもある)。しかし、基本的な手順の連続を超えたプログラムを書きたい場合、手続き型言語では手に負えなくなることがあります。そこで活躍するのがオブジェクト指向プログラミングです。
では、オブジェクト指向プログラミングとは何だろうか。
最初のオブジェクト指向言語(Simulaとされることが多い)は、情報の集まりを1つの実体として扱うオブジェクトという概念を導入した。
これが実際に何を意味するのか、例を挙げてより深く掘り下げていきますが、その前にクラスについて説明する必要があります。クラスはプレ・オブジェクトのようなものです。定義されるとオブジェクトになるプロパティのリストが含まれています。
チェスゲームのプログラミングを例にとると、Pieceというクラスがあるとします。Pieceには、プロパティのリストがあります。
オブジェクトは、それが属するクラスの特定のインスタンスを定義するだけです。
だから、白の女王というオブジェクトがあってもいい。このオブジェクトは、4つのプロパティ(白、高さ、セレーションを持つ円筒形、任意の方向に任意の数のスペース)がすべて定義されていることになります。また、メソッドや関数を持つ場合もあります。
プロシージャルアプローチと比較して、何が優れているのでしょうか?
つまり、Javaなどのオブジェクト指向プログラミング言語では、データやコードの整理が容易なため、大規模なプロジェクトでも汎用的に対応できるのです。
より詳しく説明するために、オブジェクト指向プログラミングの4つの基本について説明します。
使いたいものがあるからといって、その仕組みを知る必要はないのです。例えば、エスプレッソマシンは複雑です。でも、その仕組みは知らなくても大丈夫です。スタートしたらエスプレッソが飲めるということだけ知っていればいいんです。
これは、オブジェクト指向プログラミングにおけるオブジェクトにも言えることです。チェスの例では、move()メソッドがあるかもしれません。この方法では、大量のデータなどが必要な場合があります。初期位置と最終位置の変数を必要とする場合があります。駒が捕獲されたかどうかを判断するために、別の方法を用いることもできる。
しかし、それを知る必要はありません。必要なのは、あなたが駒に動くよう指示すれば、駒は動くということです。それが抽象的なのです。
カプセル化は、オブジェクト指向プログラミングが抽象化を行う方法の一つである。各オブジェクトはデータの集まりで、1つの実体として扱われる。これらのオブジェクトの中には、データである変数とメソッドがあります。
オブジェクトの変数は通常プライベートであり、他のオブジェクトやメソッドはアクセスすることができません。
ビショップオブジェクトは、複数の情報を含むことができます。例えば、move()メソッドを使うために必要な "position "という変数を持つことができる。もちろん、色もついています。
position変数をprivateに、move()メソッドをpublicにすることで、プログラマはmove変数を他の要因から保護することができます。色がプライベート変数の場合、それを変更できるメソッドがない限り、他のオブジェクトがそれを変更することはできません。(この作品の色は変わらないはずなので、おそらく持っていないでしょう)。
これらの変数とメソッドはBishopオブジェクトに格納されます。カプセル化されているため、プログラマはパブリックインターフェースを気にすることなく、オブジェクトの構造や内容を変更することができます。
オブジェクト指向プログラミング言語には、クラスのほかにサブクラスがあり、親クラスのすべてのプロパティを含むが、他のプロパティも含むことができる。
チェスでは、駒がボードの端に到達したら、他の駒に変形させる方法が必要です。これをtransformPiece()メソッドと呼びます。
すべてのピースにtransformPiece()メソッドが必要なわけではありません。だから、数え役満にはつけたくないんです。その代わりに、Pawnというサブクラスを作成します。サブクラスであるため、Pieceのすべてのプロパティを継承しています。したがって、サブクラスPawnのインスタンスには、許可された色、高さ、形状、および動きが含まれます。
しかし、transformPiece()メソッドも含まれています。これで、車内でうっかりこの機能を使う心配がなくなりました。ここでは、技術的な説明をします。
また、サブクラスを作成することで、多くの時間を節約することができます。プログラマーは、すべてに新しいクラスを作るのではなく、基本クラスを作り、必要なときに新しいサブクラスへと拡張することができます。(ただし、相続に頼りすぎるのはよくないということは知っておいたほうがいい)。
多型は遺伝の結果である。ポリモーフィズムを完全に理解するには、ある程度のプログラミングの知識が必要なので、ここでは基本的なことだけを説明します。つまり、ポリモーフィズムによって、プログラマは同じ名前のメソッドを異なるオブジェクトで使用することができるのです。
例えば、Pieceクラスには、駒を任意の方向に1スペース移動させるmove()メソッドがあるとします。これは王の駒には有効ですが、他の駒には有効ではありません。この問題を解決するには、Rookのサブクラスに新しいmove()メソッドを定義して、前進、後退、左、右と無限のスペースに移動することを定義すればよいのです。
これで、プログラマーがフラグメントを引数としてmove()メソッドを呼び出したとき、プログラムがフラグメントの移動方法を正確に把握することができます。このため、どの方法を使うべきかを考えるのに比べ、多くの時間を節約することができます。
最後の4つの定義を読んで、少し頭が真っ白になったとしても、あまり心配しないでください。
これらのポイントを押さえておけば、オブジェクト指向プログラミングとは何かということに十分対応できるはずです。先ほども言いましたが、オブジェクト指向の4つの基本は、ちょっと扱いにくいかもしれません。でも、プログラミングを始めると、それらが明確になるんです。
今回は、あくまでも一般論であることをお忘れなく。オブジェクト指向の言語が違えば、それぞれ癖や実装方法が異なります。自分に合った言語を選択したら、OOPの原則を実践する方法を学び始めます。
次に、オブジェクト指向のコードを整理する方法を学びます。