第3章 アクセス修飾子とカプセル化
3.3 カプセル化について
カプセル化については3.1節で少し触れましたが、この節で詳しく説明していきます。
まずカプセル化とは以下の要件を満たすものになります。
カプセル化の要件
① フィールド変数を「private」にして隠す。(他のクラスから利用できないようにする)
② フィールド変数の値を取得・設定する「public」のメソッドを用意する。
カプセル化を行うことで、フィールド変数への直接的なアクセスは禁止し、フィールド変数の値を設定するメソッド(setterメソッド)や取得するメソッド(getterメソッド)を用意します。それにより、フィールドには決められた操作しかできないように強制できます。
このようなフィールドへアクセスする「セッターメソッド」と「ゲッターメソッド」を総称してアクセサメソッドと呼びます。
ポイント・フィールド変数にprivateをつけて他からのアクセスを制限し、専用の操作(メソッド)を用意することをカプセル化と呼ぶ。
カプセル化のメリット・デメリット
・メリット
1 private修飾子を利用して外部からの、直接アクセスでメンバ変数の変更を防ぐことができる。
2 専用のアクセサメソッドを利用することで、外部からの間違ったアクセスを未然に防ぐことができる。
3 使用者が内部構造を理解していなくても使用できる。
・デメリット
1 ソースコードの記述量が増える。
2 内部構造を知っていないと修正が難しくなる。
3 熟練者で無い人が作成したクラスを使うのは信用性に欠ける。
カプセル化を行うことで多少のデメリットは出てきますが、PHPプログラミングに精通していければ解決する問題です。プログラムを作成するうえでは不正なアクセスを防ぎ、専用の操作を介することで間違ったアクセスを未然に防ぐメリットの方がデメリットよりも重要になってきます。
オブジェクト指向プログラミングでは、このカプセル化の仕組みが大変重要な役割を担っていると言えます。
すでにカプセル化の要件を満たしたソースコードを学習してきましたが、改めて最も基本的なカプセル化の要件を満たしたサンプルを次の項で紹介します。
3.3.1 カプセル化クラスと非カプセル化クラスの比較
カプセル化クラスと非カプセル化クラスを、簡単なプログラムの例から比較を行い確認してみます。
図 3.3.1: カプセル化クラスと非カプセル化クラスの比較
上記の例を見て分かるように、非カプセル化クラスではフィールド変数のみが定義されています。別のクラスからアクセスする場合も直接フィールド変数にアクセスしています。
カプセル化クラスを見てみると、先ずフィールド変数にprivate修飾子がついているのが確認できます。そして、privateのフィールド変数にアクセスできる、「get/setメソッド」を定義しています。このget/setメソッドにpublic修飾子をつけることで、クラスの外からでもフィールド変数にアクセスできるように対応しています。
カプセル化を行うと直接フィールド変数にはアクセスできなくなる為、必ずアクセサメソッドを利用して値の変更や参照(取得)が行うようにルールを設けることができます。操作に対するルールを設けることで、誤りの起こり難いプログラムを作成することがカプセル化の最も大きな利点になります。
今回の例では記述していませんが、セッターメソッドで引数のチェックを行い不正な値を防ぐことができます。このようなチェックはカプセル化することで初めて可能になります。ゲッターメソッドも値を返す前にチェック処理を行うことが可能になります。
3.3.3 アクセサメソッドの作成規則について
カプセル化ではsetterメソッドとgetterメソッドが必要になると学習しました。ではそのアクセサメソッドを定義するための作成規則を簡単に説明します。
書式:アクセサメソッド
※<フィールド変数名>の先頭文字は大文字にする
getterメソッドは「getXxx」、setterメソッドは「setXxx」という名前の形式にする必要があります。get、setに続く「Xxx」はフィールド変数名になり先頭文字を大文字にします。
またアクセサメソッドにはアクセス修飾子「public」をつけ、setterメソッドの戻り値の型は戻り値を返さない点にも注意して下さい。なお、フィールド変数の型が「boolean」の場合はgetXxxの代わりに「isXxx」と記述してもいいルールになっています。
凡例:アクセサメソッド