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