TOP比較データ> PHP5版 Template Methodパターン

徹底比較!! PHP & Java

第5回:PHP5のオブジェクト指向

著者:ワイズノット  土橋 芳孝   2004/12/17
前のページ  1  2  3
PHP5版 Template Methodパターン

   つづいてPHP4では実現できなかったGoFのデザインパターンのひとつTemplate MethodパターンをPHP5で検証してみます。

   Template Methodパターンは、フレームワークを開発する際などに頻繁に利用されます。継承とポリモフィズム(※1)を利用して、コードの再利用性や拡張性を確保できます。
※1 ポリモフィズムは多態性ともいいます。仕様と実装を分離することによって主に拡張性を高めることを目的としています。たとえば、親クラスにおいて仕様、つまりメソッドのみを宣言し、その親クラスによって宣言されたメソッドを子クラスにおいて実装することで仕様と実装を分離することができます。このポリモフィズムによって親クラスに変更を加えなくても、子クラスを取り替えることで内部実装を柔軟に交換することが可能となっています。

PHP5版 Template Methodパターン
<?php
abstract class AbstractClass {

// 処理の手順を実装したテンプレート
public function templateMethod() {
$this->primitiveOperation1();
echo " + ";
$this->primitiveOperation2();
echo " = ";
$this->primitiveOperation3();
echo "\n";
}

// 抽象メソッド1
abstract protected function primitiveOperation1();

// 抽象メソッド2
abstract protected function primitiveOperation2();

// 抽象メソッド3
abstract protected function primitiveOperation3();
}

class ConcreteClass1 extends AbstractClass {

// 抽象メソッド1の実装
protected function primitiveOperation1() {
echo "1";
}

// 抽象メソッド2の実装
protected function primitiveOperation2() {
echo "2";
}

// 抽象メソッド3の実装
protected function primitiveOperation3() {
echo "3";
}
}

class ConcreteClass2 extends AbstractClass {

// 抽象メソッド1の実装
protected function primitiveOperation1() {
echo "2";
}

// 抽象メソッド2の実装
protected function primitiveOperation2() {
echo "4";
}

// 抽象メソッド3の実装
protected function primitiveOperation3() {
echo "6";
}
}

class ConcreteClass3 extends AbstractClass {

// 抽象メソッド1の実装
protected function primitiveOperation1() {
echo "4";
}

// 抽象メソッド2の実装
protected function primitiveOperation2() {
echo "8";
}

// 抽象メソッド3の実装
protected function primitiveOperation3() {
echo "12";
}
}

echo "処理を開始しました\n";

// 1 + 2 = 3 を表示
$obj1 = new ConcreteClass1();
$obj1->templateMethod();

// 2 + 4 = 6 を表示
$obj2 = new ConcreteClass2();
$obj2->templateMethod();

// 4 + 8 = 12 を表示
$obj3 = new ConcreteClass3();
$obj3->templateMethod();

echo "処理を終了しました\n";
?>

PHP5版  Template Methodパターンの実行結果
処理を開始しました
1 + 2 = 3
2 + 4 = 6
4 + 8 = 12
処理を終了しました

   AbstractClassクラスは、処理の手順を実装したtemplateMethodメソッドと抽象メソッドであるprimitiveOperationメソッドで構成されています。AbstractClassクラスは抽象クラスであるため直接オブジェクト化することはできません。したがって、AbstractClassクラスを継承したConcreteClassクラスをオブジェクト化して利用することになります。

   ConcreteClassクラスでは、AbstractClassクラスを継承しているためAbstractClassクラスのtemplateMethodメソッドを再利用できます。また、AbstractClassクラスには抽象メソッドであるprimitiveOperationメソッドが宣言されているため、AbstractClassクラスを継承したConcreteClassクラスにはprimitiveOperationメソッドの実装が強要されます。

   このprimitiveOperationメソッドへの実装が強要されることでコードの拡張性が高まっています。上記プログラムでは、primitiveOperation1メソッドで左辺、primitiveOperation2メソッドで右辺、primitiveOperation3メソッドで解をそれぞれ表示しますが、これらのメソッドのいずれが抜けても数式が成り立ちません。そのため、TemplateMethodパターンによってprimitiveOperationメソッドを実行する手順を明確にしたうえで、primitiveOperationメソッドへの実装を開発者に強制しています。もし他の数式を新たに表示したい場合、AbstractClassクラスを継承した新しいConcreteClassを作成することで容易に実現できますので、必要最小限度の労力で機能を拡張することが可能です。

   ここまでPHP5によって実現された新機能を中心に解説してきました。PHP5によってPHPのオブジェクト指向機能は大幅に強化され、Javaと同じようなコードを記述できるようになりました。現在流行しているオブジェクト指向を取り入れた開発プロセスや設計手法もPHP5であれば容易に導入できます。
   これらはオブジェクト指向を得意とするJavaの開発者にとっても、PHPが馴染み易い言語となったことを意味するものではないでしょうか。今後は状況に応じてJavaの開発者も開発生産性の高いPHP5を利用する必要があると筆者は強く感じています。

   次回は企業システムにおけるPHP5の可能性について考察していきたいと思います。ご期待ください。

前のページ  1  2  3



著者プロフィール
株式会社ワイズノット  土橋 芳孝
以前はJavaを利用したWebアプリケーション開発とオブジェクト指向設計を得意としていたが、ワイズノットに入社以来、PHPの魅力にとりつかれる。現在はワイズノットのプロジェクトマネージャーとして、PHPをはじめとしたオープンソースの普及に力を注いでいる。


INDEX
第5回:PHP5のオブジェクト指向
  PHP5版  Singletonパターン
  PHP5版 例外処理
PHP5版 Template Methodパターン