オブジェクトによるデータ値の置き換え (リファクタリング-p175)
リファクタリング
Published: 2018-12-02

目的

「リファクタリング」を理解するためにサンプルコードを PHP で書き換えてみました。

今回は「オブジェクトによるデータ値の置き換え」について書きます。

「オブジェクトによるデータ値の置き換え」 について

追加のデータや振る舞いが必要なデータ項目がある。

変更前

<?php

class Order
{
    private $_customer;

    public function __construct($customer)
    {
        $this->_customer = $customer;
    }

    public function getCustomer()
    {
        return $this->_customer;
    }

    public function setCustomer($arg)
    {
        $this->_customer = $arg;
    }
}

class Client
{
    public static function numberOfOrdersFor($orders, $customer)
    {
        $result = 0;
        foreach ($orders as $order) {
            if ($order->getCustomer() === $customer) {
                $result++;
            }
        }

        return $result;
    }
}

$orders = [
    new Order('customer1'),
    new Order('customer2'),
    new Order('customer3'),
    new Order('customer2'),
];

echo Client::numberOfOrdersFor($orders, 'customer2') . "\n";

変更後

<?php

class Customer2
{
    private $_name;

    public function __construct($name)
    {
        $this->_name = $name;
    }

    public function getName()
    {
        return $this->_name;
    }
}

class Order2
{
    /* @var Customer2 */
    private $_customer;

    public function __construct($customerName)
    {
        $this->_customer = new Customer2($customerName);
    }

    public function getCustomerName()
    {
        return $this->_customer->getName();
    }

    public function setCustomer($customerName)
    {
        $this->_customer = new Customer2($customerName);
    }
}

class Client2
{
    public static function numberOfOrdersFor($orders, $customer)
    {
        $result = 0;
        foreach ($orders as $order) {
            if ($order->getCustomerName() === $customer) {
                $result++;
            }
        }

        return $result;
    }
}

$orders = [
    new Order2('customer1'),
    new Order2('customer2'),
    new Order2('customer3'),
    new Order2('customer2'),
];

echo Client2::numberOfOrdersFor($orders, 'customer2') . "\n";