オブジェクト指向(導入)
オブジェクト指向とは
プログラミングパラダイム
プログラミングパラダイムとは,プログラミングにおける見方や考え方のことを意味する.具体的には,以下のようなことが,プログラミングにおける見方や考え方である.
- プログラムの作り方に関する規範
- 設計手順やプログラム構造およびプログラムの記述方法を規定するもの
- プログラミングの際に,何に着目して問題を整理するのか,何を中心にプログラムを構成するのかの方向付けを与えるもの
プログラミングの見方や考え方を具体化するには,プログラミングパラダイムが反映されたプログラミング言語を伴うことがある.
プログラミングパラダイム | プログラミング言語 |
---|---|
手続き型プログラミング | FORTRAN, COBOL, PASCAL, C |
関数型プログラミング | Lisp, Scheme, Haskell |
論理型プログラミング | Prolog |
オブジェクト指向プログラミング | Smalltalk, C++, Java, C#, Ruby |
アスペクト指向プログラミング | AspectJ, Hyper/J |
構造化定理
E. W. Dijkstra(エドガー・ダイクストラ)が提唱した,構造化プログラミングのなかで,プログラムの基本制御構造として,連接,反復,選択の3種類の処理の組み合わせで,あらゆる処理を表すことができることが述べられている.
- 「連接」:逐次的な動作の列
上から順番に実行する. - 「反復」:一連の動作の繰り返し
for, whileなどのループで繰り返す. - 「選択」:2つの一連動作の選択
if, switchなどにより,条件判断する.
ダイクストラは,構造化プログラミングとして,段階的詳細化をすることや,小さな部分でまとめること(関数化),基本制御構造で表せること,go-toを用いないことなどについて述べている. この考え方は,処理の流れや,捉え方などをまとめたものであり,プログラムの規模が大きくなるときに,整理する考え方を述べているものといえるだろうか.
ダイクストラが構造化プログラミングについて述べている時代より,さらにプログラムの規模が大きくなったり,機能が増えるようになってきた.そのとき,プログラムの捉え方,考え方について,これまでと違う見方によって整理する方法が提案される.その一つが,オブジェクト指向プログラミング(Object-oriented programming)である.
UML
「オブジェクト指向」は考え方であるので,それを具体的にするときには,何かしら,形にすることが求められる.それがプログラムであるならば,オブジェクト指向が体現できるプログラミング言語があればよい.コンピュータプログラムにする段階よりもより上位の段階,すなわち,設計や分析においても,解決したい問題の構成部品や,関係する立場など,最終的にシステムによって解決したい対象をオブジェクトでとらえる必要がある.そうすることで,システムを構成するプログラムも,オブジェクト指向として具現化しやすくなる.
プログラミングの段階よりも上位(上流)の場所では,プログラムまで具体的な状態ではなく,システム化する対象を決めたり,対象の関係を明らかにしたり,処理手順を整理したり,分析や設計を行う.これらの結果を表すために適した方法は何だろうか.
設計書として表すためには,自然言語を用いることも一つの方法であろう.しかし,オブジェクトや,関係やタイミングなどを表すときに,言語であらわされた記述を読み解く方法では,イメージをつかみにくい.そのとき,図による表現を用いることで,とらえやすい形で表すことができる.現状で,オブジェクト指向で分析,設計するときに適した図式表現手法として,UML(Unified Modeling Language)が定義されている.UMLは,13種類からなり,表したい対象にあわせて,用いる図の種類を選択して用いる.
オブジェクト指向プログラミング
プログラムを構成する要素について,オブジェクトを単位としてとらえる.データとその操作をカプセル化したものをオブジェクトする.オブジェクト間のメッセージ通信で記述する.このような捉え方をプログラミングで実装できるようにした言語で,プログラミングする手法をオブジェクト指向プログラミングという.
では,オブジェクト指向をプログラムで具現化するために,プログラミング言語が持つべきものは何かとなると,完全に定義することは難しい.構成要素としては,オブジェクトを定義する「クラス」があり,クラスを構成するデータをあらわす「フィールド」と,データの操作を表す「メソッド」を表すことが必要である.
さらに,このクラスをより有効に活用するために必要とする,オブジェクト指向の三大要素と呼ばれているのが,以下の性質であるといわれている.
- 継承(インヘリタンス)
共通の性質を持つ複数のクラスにおいて,その性質を共有して,冗長性を排除する. - カプセル化
オブジェクトのアクセス範囲・方法を限定することにより,オブジェクトを保護し,安全性を高める. - 多態性(ポリモーフィズム)
ある呼び出しが,状況に応じて異なる振る舞いをする.
これらができることがオブジェクト指向プログラミングかというと,必ずしもそうとはいえない.さまざまな考え方があるので,その点は探求してほしい.