0

私は 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();
4

2 に答える 2

3

movieforeachのコレクションを繰り返し処理しています。したがって、次のようにすることができます。

foreach($this->rentals as $rental) {
   switch($rental->getMovie()->getCode()) {

もちろん、変数の名前はそのままにしておくことができますeach$movieこの文脈では、より読みやすく理解しやすいと思います。

于 2012-06-13T19:27:27.890 に答える
1

行を次のように置き換えます。

$each->getMovie->getCode()
于 2012-06-13T19:27:29.170 に答える