オブジェクト指向プログラミング
読み:オブジェクトしこう-プログラミング
外語:OOP: Object Oriented Programming
オブジェクト指向
を用いてプログラムを記述するプログラミング手法のこと。略して「OOP」。
目次
概要
発想
言語
由来
特徴
メッセージ指向
クラス指向
手続きによる抽象化
機能
概要
発想
プログラムが扱うデータなどは
オブジェクト
というまとまりで扱い、その操作を
メソッド
として記述する。
オブジェクト化することで、処理の再利用が容易になるなどのメリットがある。
言語
オブジェクト指向プログラミング言語
(OOPL)と呼ばれるプログラミング言語で、主に用いられる手法である。
代表例としては、
C++
、
C#
、
Java
、
Objective-C
などがある。
但し、言語と手法は異なるものなので、注意が必要である。C++だろうがJavaだろうが、全くオブジェクト指向でないコードを書くことは可能である。実際にプロでも、そのようなコードを書く者が存在する。
由来
「オブジェクト指向」プログラミングの「発案者」は様々な論がある。
OOPは、少なくとも次のような異なった概念が存在している。
メッセージ指向 ‐ メッセージによる動的な処理、実装、設計
クラス指向 ‐ 「抽象データ型のスーパーセット」「継承によるプログラミング」
手続きによる
抽象化
(全二者とは異なる概念)
メッセージ指向型の代表は
Smalltalk
で、
アラン・カーティス・ケイ
が産み出した。
C++やJavaに代表される形式はクラス指向で、C++の作者
ビョーン・ストラウストラップ
が体系化した。
特徴
メッセージ指向
アラン・カーティス・ケイ
が発案した
ダイナブック
を暫定的に実現するSmalltalkシステムで使用されたプログラミング言語
Smalltalk
で対応した概念である。
電子計算機に関する全ては、「オブジェクト」と「メッセージ送信」で表現する、という発想である。
この概念で重要なのはオブジェクトではなく「メッセージ送信」という考え方である。
クラス指向
現在、一般に「オブジェクト指向」を説明する場合は、無意識にこちらクラス指向を説明することが多い。
これは、
ビョーン・ストラウストラップ
が
C++
の開発を通じて体系づけた概念である。但しC++が目指したのはオブジェクト指向ではなくマルチパラダイムなので、この概念とC++をイコールで結ぶことは誤りである。
クラス指向では、
カプセル化
と情報隠蔽、
継承
、
ポリモルフィズム
といった概念を有し、抽象データ型(ユーザー定義の
データ型
)、継承、仮想関数といった動的なプログラミングを実現する。
このため、Simulaで実現されたclassを用いることが、クラス指向では必須となる。
クラス指向におけるオブジェクト指向においては、重要なことは「オブジェクト」である。先のメッセージ送信などは、オブジェクトを実現するための一手法に過ぎないもので、重要ではない。ケイのオブジェクト指向とは別の概念と言って良い。
手続きによる抽象化
メッセージ指向とクラス指向から、都合の良い部分を抜き出して好き勝手な俺的概念が広まる中、
AppleScript
の開発者であるウィリアム・クックが発表したものが「手続きによる
抽象化
」である。
抽象データ型は「型」による抽象化であるが、オブジェクト指向は「手続き」により行なわれるものとし、クラス指向のオブジェクト指向とは対極に位置する概念である。
機能
オブジェクト指向プログラミングでは、従来のそれとは事なる特徴的な機能、技術が多く存在する。
但し上述のように、オブジェクト指向は一つではなく様々な発想があるため、あるプログラミング言語に、下記するすべての機能があるとは限らない。
オブジェクト
メソッド
フィールド
シグネチャ
メッセージ
インスタンス
インスタンス変数
クラス
クラス変数
カプセル化
継承
ポリモルフィズム
再検索