テンプレートパターンの説明。パターンを使用しない場合のプログラミングの例

オブ脳 in PHP

テンプレートパターン(1) 社長命令・起立

ProEvo > PHP Evo > オブ脳 in PHP > テンプレートパターン (1) 社長命令・起立

テンプレートパターンの説明用のプログラム。「社長命令・起立」の氏名・基本給設定つきの例


1. 社長命令・起立
1.1 社員クラスの作成
1.2 社長クラスの作成

1. 社長命令・起立

1.1 社員クラスの作成

本の中の仕様に従い社員クラスを作成します。
TDDに従いテストケースから作ります。
テストのソースは次のようになります。

alltest.php
<?php
// UnitTest
require_once 'PHPUnit/GUI/HTML.php';
require_once 'Tests/TantouTest.php';
require_once 'Tests/ShuninTest.php';
require_once 'Tests/BuchouTest.php';

// run Test Suites
$suite = array();
array_push($suite, new PHPUnit_TestSuite("TantouTest"));
array_push($suite, new PHPUnit_TestSuite("ShuninTest"));
array_push($suite, new PHPUnit_TestSuite("BuchouTest"));
$result = new PHPUnit_GUI_HTML($suite);
$result->show();
?>
		
Tests/TantouTest.php
<?php
require_once 'PHPUnit.php';
require_once 'Tantou.php';

class TantouTest extends PHPUnit_TestCase {
  var $shain;

  function TantouTest($name)
  {
    $this->PHPUnit_TestCase($name);
  }

  function setup()
  {
    $this->shain = new Tantou("牛尾", 100);
  }

  function testStandup()
  {
    $out = $this->shain->standup();
    $this->assertEquals("担当牛尾起立しました。給料は100円です。\n", $out);
  }
}
?>
		
Tests/ShuninTest.php
<?php
require_once 'PHPUnit.php';
require_once 'Shunin.php';

class ShuninTest extends PHPUnit_TestCase {
  var $shain;

  function ShuninTest($name)
  {
    $this->PHPUnit_TestCase($name);
  }

  function setup()
  {
    $this->shain = new Shunin("菅原", 100);
  }

  function testStandup()
  {
    $out = $this->shain->standup();
    $this->assertEquals("主任菅原起立しました。給料は201円です。\n", $out);
  }
}
?>
		
Tests/BuchouTest.php
<?php
require_once 'PHPUnit.php';
require_once 'Buchou.php';

class BuchouTest extends PHPUnit_TestCase {
  var $shain;

  function BuchouTest($name)
  {
    $this->PHPUnit_TestCase($name);
  }

  function setup()
  {
    $this->shain = new Buchou("Jackson", 100);
  }

  function testStandup()
  {
    $out = $this->shain->standup();
    $this->assertEquals("部長Jackson起立しました。給料は300円です。\n", $out);
  }
}
?>
		
上記のテストが通るように社員クラスを作成します。
ソースは次のようになります。
Shain.php
<?php
class Shain {
  var $name;      // 社員氏名
  var $kihonkyu;  // 基本給

  function standup()
  {
  }
}
?>
		
Tantou.php
<?php
require_once 'Shain.php';

class Tantou extends Shain {
  function Tantou($name, $kihonkyu)
  {
    $this->name = $name;
    $this->kihonkyu = $kihonkyu;
  }

  function standup()
  {
    $out = "担当" . $this->name . "起立しました。";
    $out .= "給料は" . $this->kihonkyu . "円です。\n";
    return $out;
  }
}
?>
		
Shunin.php
<?php
require_once 'Shain.php';

class Shunin extends Shain {
  function Shunin($name, $kihonkyu)
  {
    $this->name = $name;
    $this->kihonkyu = $kihonkyu;
  }

  function standup()
  {
    $kyuryou = $this->kihonkyu * 2 + 1;
    $out = "主任" . $this->name . "起立しました。";
    $out .= "給料は" . $kyuryou . "円です。\n";
    return $out;
  }
}
?>
		
Buchou.php
<?php
require_once 'Shain.php';

class Buchou extends Shain {
  function Buchou($name, $kihonkyu)
  {
    $this->name = $name;
    $this->kihonkyu = $kihonkyu;
  }

  function standup()
  {
    $kyuryou = $this->kihonkyu * 3;
    $out = "部長" . $this->name . "起立しました。";
    $out .= "給料は" . $kyuryou . "円です。\n";
    return $out;
  }
}
?>
		
テストを実行します。結果がグリーンバーになれば終了です。
[テスト結果]

1.2 社長クラスの作成

プログラムを実行するためのクラス“社長クラス”と実行用プログラム"run.php"を作成します。
ソースは次のようになります。
Shachou.php
<?php
require_once 'Tantou.php';
require_once 'Shunin.php';
require_once 'Buchou.php';

class Shachou {
  function main()
  {
    $name = $_POST["name"];
    $kihonkyu = intval($_POST["kihonkyu"]);
    switch ($_POST["tantou"]) {
    case "担当":
      $shain = new Tantou($name, $kihonkyu);
      break;

    case "主任":
      $shain = new Shunin($name, $kihonkyu);
      break;

    case "部長":
      $shain = new Buchou($name, $kihonkyu);
      break;

    }

    return $shain->standup();
  }
}
?>
		
run.php
<?php
require_once 'Shachou.php';
?>
<head>
	<title>temolate step1</title>
<body>

<form method="post" action="<?= $_SERVER["PHP_SELF"];?%gt;">
	社長:
	<select name="tantou">
		<option>担当
		<option>主任
		<option>部長
	</select>
	氏名  = <input type="text" name="name" size="20">
	基本給= <input type="text" name="kihonkyu" size="5">
	<input type="submit" name="standup" value="立ちなさい">
</form>
<p>
<?php
$shachou = new Shachou();
echo "<PRE>\n";
echo $shachou->main();
echo "</PRE>\n";
?>
		
プログラムを実行します。下のような画面が出れば成功です。
[実行結果] [デモ]

$Revision: 1 $
Last update: $Date: 2009-03-19 20:17:04 +0900 (譛ィ, 19 3譛 2009) $