関連では、クラス間の関連について説明しました。ここではオブジェクト指向における委譲について説明します。
オブジェクト指向ではオブジェクト(クラス)が自分自身の情報に対する処理を行うことが基本となります。
パターン(1) 関連では、マネージャークラスで合計金額を算出していますが、受注明細を扱っているのは受注クラスですので受注クラスで合計金額を算出します。
このように自分が管理しているクラスに処理をお願いすることを“委譲”と呼びます。
すなわち、マネージャークラスが受注クラスに合計金額を算出する処理を委譲することになります。
ここで合計金額算出メソッドをテストするテストケースを追加します。
ソースは次のようになります。
<?php
require_once 'PHPUnit.php';
require_once 'Juchu.php';
class juchuTest extends PHPUnit_TestCase {
var $juchu;
function juchuTest($name)
{
$this->PHPUnit_TestCase($name);
}
function setUp()
{
$this->juchu = new Juchu(1);
$meisai1 = new meisai(1, "Thriller", 2000);
$meisai2 = new meisai(2, "Dangerous", 2000);
$this->juchu->addMeisai($meisai1);
$this->juchu->addMeisai($meisai2);
}
function testMeisai()
{
$meisai1 = new meisai(1, "Thriller", 2000);
$meisai2 = new meisai(2, "Dangerous", 2000);
$meisais = array($meisai1, $meisai2);
$this->assertEquals($meisais, $this->juchu->meisais);
}
function testTotalPrice()
{
$this->assertEquals(4000, $this->juchu->getTotalPrice());
}
//CUPPA:End of Test Suite
}
?>
<?php
require_once 'Chumonsya.php';
require_once 'Meisai.php';
class juchu {
var $no; // 注文番号
var $chumonsya; // 注文者
var $meisais = array(); // 受注明細
function juchu($no)
{
$this->no = $no;
}
function addMeisai($meisai)
{
$this->meisais[] = $meisai;
}
function getTotalPrice()
{
$totalPrice = 0;
for ($i=0; $i<count($this->meisais); $i++) {
$meisai = $this->meisais[$i];
$totalPrice += $meisai->price;
}
return $totalPrice;
}
}
?>
マネージャークラスを委譲したメソッドを使うように変更します。
ソースは次のようになります。
<?php
require_once 'Juchu.php';
class Manager {
function main()
{
// データベース作成
$juchu = new Juchu(1);
$juchu->chumonsya = new Chumonsya("牛尾 剛", "大阪府 箕面市");
$meisai1 = new Meisai(1, "Thriller", 2000);
$meisai2 = new Meisai(2, "Dangerous", 2000);
$juchu->addMeisai($meisai1);
$juchu->addMeisai($meisai2);
// 表示画面作成
$output = <<<__EOT__
受注伝票
受注番号: {$juchu->no}
注文者 : {$juchu->chumonsya->name}
注文者住所: {$juchu->chumonsya->address}
明細番号 注文商品 金額
__EOT__;
for ($i=0; $imeisais); $i++) {
$meisai = $juchu->meisais[$i];
$output .= $meisai->no . "\t\t" . $meisai->productName . "\t" . $meisai->price . "円\n";
}
$output .= "--------------------------------------\n";
$output .= " 合計金額\t\t\t" . $juchu->getTotalPrice() . "円\n";
return $output;
}
}
?>
実行します。した画面のようになれば動作は正常です。
[デモ]
Copyright © 1997-2003 by A.G.Labo
$Revision: 1 $