社長命令・起立プログラムをリファクタリングしてテンプレートパターンを適用する
本の中で説明しているようにテンプレートパターン(1)では社員クラスに似たような記述があります。これをリファクタリングしてシンプルでわかりやすいコードに変更します。
リファクタリングではプログラムの外部仕様は変わりません。つまり、テンプレートパターン(1)で作成したテストがそのまま使えます。
安全のために一つ変更したらテストを実行して、グリーンバーのままなのを確認しながら修正を行います。
役職は各クラスで固定です。しかし、後のことを考えると属性にしておいて参照したほうが都合が良いです。そのため、属性に役職を追加します。
また、これらを社員クラスのコンストラクタで設定するように変更します。
ソースは次のようになります。
<?php
class Shain {
var $name; // 社員氏名
var $kihonkyu; // 基本給
var $yakusyoku; // 役職
function Shain($name, $kihonkyu, $yakusyoku)
{
$this->name = $name;
$this->kihonkyu = $kihonkyu;
$this->yakusyoku = $yakusyoku;
}
function standup()
{
}
}
?>
<?php
require_once 'Shain.php';
class Tantou extends Shain {
function Tantou($name, $kihonkyu)
{
$this->Shain($name, $kihonkyu, "担当");
}
function standup()
{
$out = "担当" . $this->name . "起立しました。";
$out .= "給料は" . $this->kihonkyu . "円です。\n";
return $out;
}
}
?>
<?php
require_once 'Shain.php';
class Shunin extends Shain {
function Shunin($name, $kihonkyu)
{
$this->Shain($name, $kihonkyu, "主任");
}
function standup()
{
$kyuryou = $this->kihonkyu * 2 + 1;
$out = "主任" . $this->name . "起立しました。";
$out .= "給料は" . $kyuryou . "円です。\n";
return $out;
}
}
?>
<?php
require_once 'Shain.php';
class Buchou extends Shain {
function Buchou($name, $kihonkyu)
{
$this->Shain($name, $kihonkyu, "部長");
}
function standup()
{
$kyuryou = $this->kihonkyu * 3;
$out = "部長" . $this->name . "起立しました。";
$out .= "給料は" . $kyuryou . "円です。\n";
return $out;
}
}
?>
2.1で役職属性を追加したので、メソッドstandupでその属性を私用するように変更します。
ソースは次のようになります。
<?php
require_once 'Shain.php';
class Tantou extends Shain {
function Tantou($name, $kihonkyu)
{
$this->Shain($name, $kihonkyu, "担当");
}
function standup()
{
$out = $this->yakusyoku . $this->name . "起立しました。";
$out .= "給料は" . $this->kihonkyu . "円です。\n";
return $out;
}
}
?>
<?php
require_once 'Shain.php';
class Shunin extends Shain {
function Shunin($name, $kihonkyu)
{
$this->Shain($name, $kihonkyu, "主任");
}
function standup()
{
$kyuryou = $this->kihonkyu * 2 + 1;
$out = $this->yakusyoku . $this->name . "起立しました。";
$out .= "給料は" . $kyuryou . "円です。\n";
return $out;
}
}
?>
<?php
require_once 'Shain.php';
class Buchou extends Shain {
function Buchou($name, $kihonkyu)
{
$this->Shain($name, $kihonkyu, "部長");
}
function standup()
{
$kyuryou = $this->kihonkyu * 3;
$out = $this->yakusyoku . $this->name . "起立しました。";
$out .= "給料は" . $kyuryou . "円です。\n";
return $out;
}
}
?>
給料を計算する処理をメソッドとして独立させます。メソッド"standup"を給料取得メソッドを使ってメッセージを作成するように変更します。
ソースは次のようになります。
<?php
require_once 'Shain.php';
class Tantou extends Shain {
function Tantou($name, $kihonkyu)
{
$this->Shain($name, $kihonkyu, "担当");
}
function getKyuryou()
{
return $this->kihonkyu;
}
function standup()
{
$out = $this->yakusyoku . $this->name . "起立しました。";
$out .= "給料は" . $this->getKyuryou() . "円です。\n";
return $out;
}
}
?>
<?php
require_once 'Shain.php';
class Shunin extends Shain {
function Shunin($name, $kihonkyu)
{
$this->Shain($name, $kihonkyu, "主任");
}
function getKyuryou()
{
return ($this->kihonkyu * 2) + 1;
}
function standup()
{
$out = $this->yakusyoku . $this->name . "起立しました。";
$out .= "給料は" . $this->getKyuryou() . "円です。\n";
return $out;
}
}
?>
<?php
require_once 'Shain.php';
class Buchou extends Shain {
function Buchou($name, $kihonkyu)
{
$this->Shain($name, $kihonkyu, "部長");
}
function getKyuryou()
{
return $this->kihonkyu * 3;
}
function standup()
{
$out = $this->yakusyoku . $this->name . "起立しました。";
$out .= "給料は" . $this->getKyuryou() . "円です。\n";
return $out;
}
}
?>
2.3の変更でstandupメソッドはどのクラスも同一の記述になりました。
そのためstandupメソッドを親クラスであるShainクラスに移動します。
ソースは次のようになります。
<?php
class Shain {
var $name; // 社員氏名
var $kihonkyu; // 基本給
var $yakusyoku; // 役職
function Shain($name, $kihonkyu, $yakusyoku)
{
$this->name = $name;
$this->kihonkyu = $kihonkyu;
$this->yakusyoku = $yakusyoku;
}
function standup()
{
$out = $this->yakusyoku . $this->name . "起立しました。";
$out .= "給料は" . $this->getKyuryou() . "円です。\n";
return $out;
}
}
?>
<?php
require_once 'Shain.php';
class Tantou extends Shain {
function Tantou($name, $kihonkyu)
{
$this->Shain($name, $kihonkyu, "担当");
}
function getKyuryou()
{
return $this->kihonkyu;
}
}
?>
<?php
require_once 'Shain.php';
class Shunin extends Shain {
function Shunin($name, $kihonkyu)
{
$this->Shain($name, $kihonkyu, "主任");
}
function getKyuryou()
{
return ($this->kihonkyu * 2) + 1;
}
}
?>
<?php
require_once 'Shain.php';
class Buchou extends Shain {
function Buchou($name, $kihonkyu)
{
$this->Shain($name, $kihonkyu, "部長");
}
function getKyuryou()
{
return $this->kihonkyu * 3;
}
}
?>
![[テスト結果]](images/template2-04.jpg)
プログラムを実行します。下の画面のようになれば成功です。
[デモ]
以上で変更は終了です。
Copyright © 1997-2003 by A.G.Labo
$Revision: 1 $