連載
» 2015年06月25日 05時00分 公開

PHPオブジェクト指向プログラミング入門(2):大規模PHP開発で欠かせないアクセス修飾子とカプセル化、アクセサー、コンストラクター/デストラクター (2/3)

[古庄道明,株式会社格子組]

大規模なプログラミングに重要な「モジュール化」「情報隠蔽」「カプセル化」

 プログラムだけではなく、工学などにも出てくる概念に「モジュール」というモノがあります。モジュールは「まとまりのある機能を持った部品」「交換可能な構成要素」といった意味合いのものです。

 モジュールの本来の意味は「基準になる基本寸法」のことで、建築の世界の「モジュール」はまさにその意味合いで使われています(インチモジュール/メーターモジュール/尺モジュール)。

 ただ、それ以外の多くのところでは「基本寸法が同じである→同じ基本寸法のものであれば別のものに交換ができる→その基準によって交換可能となった構成要素」というような流れから「交換可能な構成要素」をモジュールと呼称するケースが多々あります。

 例えば「部屋のドアの鍵が壊れた」ときに、ドアごと交換をするのではなく「鍵だけを交換できる」のは、鍵が「一つのモジュールとして適切に設計されているから」になります。

 クラスは、この「モジュール」という概念を踏まえておくと理解がしやすいでしょう。クラスは「まとまりのある機能を持った部品」です。また、クラスは「機能を拡張したい」や「問題があったから修正したい、書き直したい→交換したい」という状況があり得るために、それが可能なように設計と実装をする必要があります。

 こういった「交換が容易」な設計や実装を、プログラムの世界だと「疎結合」といった言われ方をされることも多いです。

 また、大規模のプログラムを書くときにも、このモジュール化はとても重要になります。

 人間が理解できる複雑さには、個人差はもちろんありますが、いずれにしても「限界」があります。モジュール化によって「ある程度大きいサイズの部品」を、その全てを把握するのではなくて「こんな機能があるまとまりなんだ」という部分的な理解で「使える」ようにします。これにより、「取りあえず理解しなくても使える」部分の複雑さを、いったん、思考から「隠蔽する」ことができます。

 そうすると「全てを理解していなければ書けない」状況と比較して、モジュール化した場合には「より複雑なプログラムを、複雑さをある程度隠蔽した状態で」書くことができるために、結果として「全体としてはより複雑度の高いプログラム」を書くことができるようになります。

 これは「大規模なプログラミング」をするときに、とても重要なアプローチになります。

 このように「モジュール化」することは、とても重要です。オブジェクト指向プログラミングでは、これを「情報隠蔽」「カプセル化」などと呼称します。

 「モジュール化」「情報隠蔽」「カプセル化」は、厳密には少し意味合いが異なる部分もあるのですが、今は「同じようなものである」と理解してください。

カプセル化の実装方法、アクセサー(accessor)

 カプセル化の一部として「データ隠蔽」という考え方があり、その実装方法として「アクセサー」というものがあります。「常に必ず使われる」ものではないですし、今なお「アクセサーの是非」は議論されているものではありますが、それでも比較的多くのところで「実際に使われている」概念であり実装なので、把握しておくとよいでしょう。

 アクセサーを実装する場合、以下のようなルールで実装されることが多いです。

  • プロパティ(変数)はprivate
  • プロパティに値を入れるためのメソッドを「setter」、プロパティから値を取り出すためのメソッドを「getter」と呼ぶ(併せて「アクセサー(accessor)」と呼ぶ)
  • setterは「'set' + プロパティ名(先頭1文字目を大文字)」、getterは「'get' + プロパティ名(先頭1文字目を大文字)」にする
  • setter/getterは、publicまたはprotectedにする
  • setterには、簡単なバリデート(validate)処理を入れることがある
  • アクセサー以外の全てのメソッドは、自クラスのプロパティであっても「アクセサー経由で」プロパティを触る

 前回の連載でもsetterは実装していたのですが、実際にアクセサーの付いたクラスの実例を書いてみましょう。

<?php
 
class hoge {
  public function setVal($v) { $this->_val = $v; }
  public function getVal() { return $this->_val; }
//
private $_val;
}
//
$obj = new hoge();
$obj->setVal('test');
var_dump( $obj->getVal() );

 PHPでは、アクセサーを実装するもう一つ「とても大きな理由」があるのですが、それについては後の連載で説明します。ここでは、アクセサーの存在と書き方を覚えておいてください。

Copyright © ITmedia, Inc. All Rights Reserved.

編集部からのお知らせ

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。