オブジェクト指向における"委譲"の解説。受注クラスに委譲のメソッド合計金額算出を追加する

オブ脳 in PHP

委譲

ProEvo > PHP Evo > オブ脳 in PHP > 委譲

関連では、クラス間の関連について説明しました。ここではオブジェクト指向における委譲について説明します。


1. 委譲について
1.1 委譲とは何か
2. 合計算出処理を委譲する
2.1 合計金額メソッドを追加
2.2 マネージャークラスの変更
3. 実行

1. 委譲について

1.1 委譲とは何か

オブジェクト指向ではオブジェクト(クラス)が自分自身の情報に対する処理を行うことが基本となります。
パターン(1) 関連では、マネージャークラスで合計金額を算出していますが、受注明細を扱っているのは受注クラスですので受注クラスで合計金額を算出します。
このように自分が管理しているクラスに処理をお願いすることを“委譲”と呼びます。
すなわち、マネージャークラスが受注クラスに合計金額を算出する処理を委譲することになります。

2. 合計算出処理を委譲する

2.1 合計金額メソッドを追加

ここで合計金額算出メソッドをテストするテストケースを追加します。
ソースは次のようになります。

Tests/juchuTests.php
<?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
}
?>
		
上記のテストが通るように受注クラスを修正します。
ソースは次のようになります。
Juchu.php
<?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;
  }
}
?>
		
テストを実行します。下のようにグリーンのバーになれば変更は終了です。
[テスト結果]

2.2 マネージャークラスの変更

マネージャークラスを委譲したメソッドを使うように変更します。
ソースは次のようになります。

Manager.php
<?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;
  }
}
?>
		
テストを実行します。下のようにグリーンのバーになれば修正は完了です。
[テスト結果]

3. 実行

実行します。した画面のようになれば動作は正常です。
[実行結果] [デモ]


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