私は Martin Fowler による Rafactoring を読んでいて、本の冒頭で彼は (Java で書かれた) サンプル アプリケーションを使用しており、これをトレーニング目的で PHP に変換しようとしています。(この質問をするためにコードをトリミングしましたが、変数が公開されている場合は機能します。)
問題は、$code が非公開であるため、Movie クラスのメソッド getCode() を使用して、値 (スイッチを参照) にアクセスする必要があるステートメントを作成することです。(もちろん、すべての変数が公開されている場合、以下のコードは機能しますが、私はそれらを非公開にしたいと考えています。)
statement() のスイッチから Movie の getCode() メソッドを呼び出すプライベート変数にアクセスする方法について、誰かに光を当ててください。(または、より良い方法があれば教えてください。)
class Movie {
private $title;
private $code;
public function __construct($title, $code) {
$this->title = $title;
$this->code = $code;
}
public function getCode() {
return $this->code;
}
public function getTitle() {
return $this->title;
}
}
class Rental {
private $movie; // will carry a Movie object
private $days;
public function __construct(Movie $movie, $days) {
$this->movie = $movie;
$this->days = $days;
}
public function getMovie() {
return $this->movie;
}
}
class Customer {
private $name;
private $rentals; // will be a collection of Rental Objects
public function __construct($name) {
$this->name = $name;
}
public function addRental(Rental $rental) {
$this->rentals[] = $rental;
}
public function statement() {
$thisAmount = 0;
foreach ($this->rentals as $each) {
// what is the better way to call this value??????
switch ($each->movie->code) {
case 1:
$thisAmount+= ($each->days - 2) * 1.5;
break;
case 2:
$thisAmount += $each->days * 3;
break;
case 3:
$thisAmount += 1.5;
break;
}
// show figures for this rental
$result = "\t" . $each->movie->title . "\t" . $thisAmount . "\n";
}
return $result;
}
}
// pick a movie
$movie = new Movie('Star Wars', 0);
// now rent it
$rental = new Rental($movie, '2');
// now get statement
$customer = new Customer('Joe');
$customer->addRental($rental);
echo $customer->statement();