オブ脳の演習(2)。社員が自分の給料を答えるようにする。

オブ脳 in PHP

step2 給料はいくら?

ProEvo > PHP Evo > オブ脳 in PHP > step2 給料はいくら?


1. インターフェースを書く
1.1 入力項目の追加
2. 給料取得メソッドの実装
2.1 テストスイートを作る
2.2 担当クラスの変更
2.3 主任クラスの変更
2.4 部長クラスの変更
2.5 社長クラスの変更
3. 実行する

1. インターフェースを書く

1.1 入力項目の追加

step1のプログラムをもとに、機能追加をします。
まずは実行画面であり、UIであるrun.phpから。

「社長は基本給を教える」とありますから、基本給を入れる項目が必要です。
ここは単純にテキストボックス、項目名は"kihonkyu"としました。
ソースは次のようになります。

run.php
<?php
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
require_once 'shachou.php';
?>
<head>
	<title>standup step2</title>
<body>

<form method="post" action="<?= $_SERVER["PHP_SELF"];?>">
	社長:
	<select name="tantou">
		<option>担当
		<option>主任
		<option>部長
	</select>
	基本給=<input type="text" name="kihonkyu" size="10">
	<input type="submit" name="standup" value="立ちなさい">
</form>
<p>
<?php
$shachou = new Shachou();
echo "
\n";
echo $shachou->main();
echo "
\n"; ?>

2. 給料取得メソッドの実装

2.1 テストスイートを作る

プログラムはTDD(Test Driven Development)で作成します。
ここでは各社員ごとに給料を答えるメソッドを作るので各社員のテストケースを作る必要があります。
また、テストスイートはすべてのテストケースをテストする必要があります。
すべてのテストケースをテストするソースは次のようになります。

alltests.php
<?php
// UnitTest
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
require_once 'PHPUnit/GUI/HTML.php';
require_once 'Tests/shachouTest.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("shachouTest"));
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();
?>
		
これを実行すると下記のような画面が表示されます。
[テスト実行]
ここでチェックをしたテストケースをテストします。すべてのテストケースをチェックすれば、すべてのテストケースをテストします。
上の"(un)check all"チェックボックスを使えばすべてのテストケースのチェックができますので、利用すると良いでしょう。

2.2 担当クラスの変更

メソッドの実装に入ります。まずは、担当のテストクラスとテストを書きます。
ソースは次のようになります。

Tests/tantouTest.php
<?php
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
require_once 'PHPUnit.php';
require_once 'shachou.php';

class tantouTest extends PHPUnit_TestCase {
	var $tantou;

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

	function setup()
	{
		$this->tantou = new Tantou();
	}

	function testSetUp()
	{
		$this->assertEquals("tantou", get_class($this->tantou));
	}

	function testKyuryou()
	{
		$kyuryou = $this->tantou->getKyuryou(100);
		$this->assertEquals(100, $kyuryou);
	}
}
?>
		
次に、担当クラスにgetKyuryouメソッドを実装します。
ソースは次のようになります。
tantou.php
<?php
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
require_once 'shain.php';

/*
 * 担当
 */
class Tantou extends Shain {
	function standup()
	{
		return "担当が普通に立ちました。\n";
	}

	function getKyuryou($kihonkyu)
	{
		return $kihonkyu;
	}
}
?>
			

2.3 主任クラスの変更

担当クラスの変更と同様にテストとメソッドを作成します。
テストのソースは次のようになります。

Tests/shuninTest.php
<?php
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
require_once 'PHPUnit.php';
require_once 'shunin.php';

class shuninTest extends PHPUnit_TestCase {
	var $shunin;

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

	function setup()
	{
		$this->shunin = new Shunin();
	}

	function testKyuryou()
	{
		$kyuryou = $this->shunin->getKyuryou(100);
		$this->assertEquals(201, $kyuryou);
	}

}
?>
		

主任クラスは次のようになります。
shunin.php
<?php
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
require_once 'shain.php';

/*
 * 主任
 */
class Shunin extends Shain {
	function standup()
	{
		return "主任がすばやく立ちました。\n";
	}

	function getKyuryou($kihonkyu)
	{
		return $kihonkyu * 2 + 1;
	}
}
?>
		

2.4 部長クラスの変更

同様に部長クラスにもテストとメソッドを追加します。
テストのソースは次のようになります。
Tests/buchuoTest.php
<?php
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
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();
	}

	function testKyuryou()
	{
		$kyuryou = $this->shain->getKyuryou(100);
		$this->assertEquals(300, $kyuryou);
	}
}
?>
		

部長クラスのソースは次のようになります。
buchou.php
<?php
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
require_once 'shain.php';

/*
 * 部長
 */
class Buchou extends Shain {
	function standup()
	{
		return "部長がだるそうに立ちました。\n";
	}

	function getKyuryou($kihonkyu)
	{
		return $kihonkyu * 3;
	}
}
?>
		

2.5 社長クラスの変更

社長クラスに給料を答える処理を追加します。
メッセージが変更されるのでテストも変更します。
テストのソースは次のようになります。

Tests/shachouTest.php
<?php
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
require_once 'PHPUnit.php';
require_once 'shachou.php';

class shachouTest extends PHPUnit_TestCase {
	var $shachou;

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

	function setup()
	{
		$this->shachou = new Shachou();
	}

	function testStandup()
	{
		$_POST["tantou"] = "担当"; $_POST["kihonkyu"] = "100";
		$ret = $this->shachou->main();
		$this->assertEquals("担当が普通に立ちました。\n私の給料は100円です。\n", $ret);

		$_POST["tantou"] = "主任"; $_POST["kihonkyu"] = "100";
		$ret = $this->shachou->main();
		$this->assertEquals("主任がすばやく立ちました。\n私の給料は201円です。\n", $ret);

		$_POST["tantou"] = "部長"; $_POST["kihonkyu"] = "100";
		$ret = $this->shachou->main();
		$this->assertEquals("部長がだるそうに立ちました。\n私の給料は300円です。\n", $ret);
	}
}
?>
		
社長クラスを変更します。
ソースは次のようになります。
shachou.php
<?php
// $Id: 3-step2.html 1 2009-03-19 11:17:04Z atsushifx $
require_once 'tantou.php';
require_once 'shunin.php';
require_once 'buchou.php';

/**
* @author Furukawa Atsushi <atsushifx@aglabo.com>
*/
class Shachou {
	function main()
	{
		switch ($_POST["tantou"]) {
		case "担当":
			$shain = new Tantou();
			break;

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

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

		}

		$ret = "";
		$ret .= $shain->standup();
		$kihonkyu = $_POST["kihonkyu"];
		$kyuryou = $shain->getKyuryou($kihonkyu);
		$ret .= "私の給料は" . $kyuryou . "円です。\n";
		return $ret;
	}
}
?>
		
修正は以上です。テストを実行して下の画面のように全部グリーンならは完了です。 [テスト全終了]

3. 実行する

テストが完了しているなら、正常に動作するはずです。
以下のリンクで動作が確認できます。
[step2 動作デモ]

以上で、step2は終了です。


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