オブジェクト指向
オブジェクト
- オブジェクトとは
-
データは複数の変数に格納されるが、それをまとまった塊として扱いたいことがある。たとえば会員制ショッピングサイトの会員データは
- 会員番号
- パスワード
- 連絡先メールアドレス
- 住所
- 氏名
など多岐にわたっており、それらをプログラムコード中にバラバラに管理するのは面倒である。
複数のデータをまとめる手段としては「配列」があるが、配列は本来は同じ種類のデータをまとめるためのものであり、上記例のようにバラバラの属性を持ったデータをまとめるためのものではない。
配列はどこにどのようなデータが入っているかは仕様上は不明であり、それを知るにはソースを読み解かなければならない。それはプログラムの保守上とても厄介なことなのだ(配列本来の使い方なら、同種のデータが連なっているだけなので、問題ない)。
ということで複数のデータを明確な仕様に則して格納する仕組みが求められる。そうした仕組みで作られたデータの塊を「構造体」と呼ぶ。
データが特定の文脈でまとめられると、それに対する処理もそれに付随したものとして特定化されたものが求められた。関数は処理のみをパッケージングして独立させようとしたものだが、今度はデータとそれに付随した処理をパッケージングして独立させようとするのだ。
このようにまとまった意味を持ったデータ群とそれに付随する処理をパッケージングして独立させたものを「オブジェクト」と呼ぶ。
- オブジェクトとクラス
-
オブジェクトはどのようなデータを持ち、どのような処理を持っているかが仕様上明確に確定されている。このオブジェクトの(プログラム側の)「仕様書」がクラスである(人間=プログラマ側の仕様書はクラスの仕様に則して別途作らなければならないし、簡単に作れる)。
オブジェクトを使うためにはまずはその元となるクラスを定義しなければならない。
- クラス
- プログラム内の仕様書・設計書
- オブジェクト
- 仕様書(クラス)通りに作られたモノ
- クラスの構成要素
-
クラスはデータ群と処理から構成される。クラスで定義されるデータ(変数)をメンバ変数と呼び、処理(関数)をメソッドと呼ぶ。
- 例
-
- 名前
- 加入期
- 出身地
オブジェクトの利用
- インスタンス化
-
オブジェクトはクラスをもとに(コンピュータシステムの元ではメモリ上に展開され)実体化されることによって利用できるようになる。この実体化を「インスタンス化」(英語にしただけだが)と呼ぶ。オブジェクトとインスタンスは同義である。
クラスがインスタンス化されるときにはクラス内で定義された特殊なメソッド(関数)である「コンストラクタ」によってメンバ変数の初期化(変数に具体的な値が最初に代入されること)が行われる。
- コンストラクタ
-
コンストラクタはコンストラクタに与えられた引数などを用いてメンバ変数の初期化を行う。
- メンバ変数・メソッドの利用
-
クラスで定義されたメンバ変数やメソッドはインスタンス化された後、利用できるようになる。
- カプセル化
-
メンバ変数やメソッドはオブジェクトの外で利用できるものと外部から呼び出せないものとがある。それを決めているのがアクセス修飾子である。
- アクセス修飾子
-
メンバ変数やメソッドのどれが外から使用可能で、どれが不可能かを制御することができる。オブジェクトの特定の属性を外部から制御できなくする仕掛けをカプセル化と呼ぶ。たとえばメンバ変数の$nameは一度初期化したら変更できないときには$nameをprivateに設定する(これが配列にはできない、$nameがソースの中でいつの間にか変更されている可能性を除去できない)。
このようなprivateのように外部からのアクセス可能性を制御するための修飾子をアクセス修飾子という。
- private
- クラスの内部でのみ利用でき、外部からは呼び出せない。
- protected
- クラスの内部とサブクラスからの未利用できる(本講では扱わない)。
- public
- クラスの外からも呼び出せる。
使用例
オブジェクト指向プログラミング
- 発展
-
クラスは親子関係を持つなどして、グルーピングすることができる。
- キーワード
-
- 継承
- スーパークラス
- 抽象クラス
- 実装
- インタフェース
- ポリモーフィズム
- 継承
ここからが「オブジェクト指向」の真髄に入っていくが、本講では扱わない。
- オブジェクト指向言語
-
PHPはオブジェクト指向プログラムとしても書くことはできるが、そうではない書き方(手続き型という)もできる。本講では手続き型の書き方を扱ってきた。
オブジェクト指向プログラミングは一からプログラムを書くというより、組織的に役割分担をしてシステム構築をする際に有効な手法。理解し、慣れるまでは負荷が高い。
オブジェクト指向言語の代表といえばJavaだが、JavaScriptやVisualBasic(VB)という一般ユーザーに普及している言語もオブジェクト指向言語である。それゆえJavaScript,VBともに言語仕様全体を理解するのは非常に難しい。逆に断片的に「つまみ食い」的に扱うのは比較的容易である。