オブジェクト指向プログラミング
オブジェクト指向プログラミングとは
オブジェクト指向(Object-oriented)とは
オブジェクト指向とは、プログラム上の計算対象をオブジェクト化(物体化)して捉える考えかたのことです。
プログラムを構成する要素について、データとその操作をカプセル化したものをオブジェクトという単位として考えます。
オブジェクトは現実の人・モノと結び付けて考えることができるため、直感的に理解しやすくなります。
オブジェクト指向の三大要素とクラス
オブジェクト指向の三大要素は、「継承」、「カプセル化」、「多態性」です。
これら要素は「クラス」というオブジェクトを定義する機能によって実現されます
なお、クラスに基づいて作製されたオブジェクトの実体そのもののことをインスタンスとも呼びます。
オブジェクト指向の三大要素について
継承(インヘリタンス)
継承とは、あるクラスを流用して別の新しいクラスを作成する仕組みのことです。
既存のクラスを継承した新しいクラスは、「フィールド(変数定義)」や「メソッド」などを引き継ぐことができます。
継承される既存のクラスを「スーパークラス」、継承した新しく作ったクラスを「サブクラス」といいます。
継承のメリットは、物事を「抽象化」できることです。
継承とは、「子クラス is-a 親クラス(子クラスは、親クラスの一種である)」という「is-a関係」に則っています。
子クラスになるほど「特化」(特殊で具体的なものに具体化)していき、親クラスになるほど「汎化」(抽象的であいまいなものに一般化)していきます。
つまり、継承を用いることで、ある2つのクラスに「汎化と特化の関係」があることを示すことができるようになります。
カプセル化
カプセル化とは、対象物をカプセルに入れて外部から見えなくして、その内容を隠蔽することをいいます。
カプセル化によって、オブジェクトの情報(フィールドやメソッドなど)を隠蔽することで、オブジェクトへの直接アクセスを制限することができます。
オブジェクトのアクセス範囲・方法を限定することにより、オブジェクトを保護して安全性を高めることができます。
カプセル化のメリットは、使用者が内部構造を理解していなくても、そのクラスを使用できることです。
また、関連する操作がひとまとまりになっているので、利用者側は理解しやすく、開発側は変更の影響を局所化できる点も挙げられます。
多態性(ポリモーフィズム)
多態性とは、ある呼び出しが、状況に応じて異なる振る舞いをすることをいいます。
複数のオブジェクトに対して、それぞれに同一の命令メッセージを送ると、オブジェクトごとに異なった処理を行わせることができます。
多態性のメリットは、命令メッセージを送る側の手間を省くことです。呼び出される側のクラスを変更しても、呼び出し元のクラスに影響しません。
オブジェクト指向プログラミング言語を利用するメリットとデメリット
オブジェクト指向プログラミングのメリット
オブジェクト指向プログラミングは、プログラムを効率よく設計・開発できるというメリットがあります。
例えば、クラス設計によって処理が再利用しやすくなるため、同じコードを何度も書くことを防げます。
また、開発する機能を分類しやすいため、大人数が同時に開発することができます。
機能の影響範囲を限定できることも大きなメリットです。
オブジェクトごとの独立性を高めることで、影響範囲を把握しやすく、プログラムの仕様が変わっても対応しやすくなります。
また、コードの冗長性が軽減されたことでプログラムの視認性が高まるため、不具合の原因を特定しやすくなるメリットもあります。
オブジェクト指向プログラミングのデメリット
オブジェクト指向プログラミング言語のソースコードは、大規模化すると非常に複雑になってしまうデメリットがあります。
オブジェクト指向プログラミングでは、しばしば「ヨーヨー問題」が取り上げられます。
「ヨーヨー問題」とは、継承関係が深すぎる・複雑すぎるなどの理由で、プログラマが注目している場所がヨーヨーの動きのように上下することから来ています。
「メッセージツリーの内容を理解しようとする際、ヨーヨーの上に乗っているかのような感じがすることがよくある」