クラスの抽出 (リファクタリング-p149)
リファクタリング
Published: 2018-11-18

目的

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

今回は「クラスの抽出」について書きます。

「クラスの抽出」 について

2つのクラスでなされるべき作業を1つのクラスで行なっている。

変更前

<?php

class Person
{
    private $_name;
    private $_officeAreaCode;
    private $_officeNumber;

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

    public function getTelephoneNumber()
    {
        return '(' . $this->_officeAreaCode . ')' . $this->_officeNumber;;
    }

    public function getOfficeAreaCode()
    {
        return $this->_officeAreaCode;
    }

    public function getOfficeNumber()
    {
        return $this->_officeNumber;
    }

    public function setOfficeAreaCode($arg)
    {
        $this->_officeAreaCode = $arg;
    }

    public function setOfficeNumber($arg)
    {
        $this->_officeNumber = $arg;
    }
}

$p = new Person();
$p->setOfficeAreaCode('AreaCode');
$p->setOfficeNumber('xxxxx-xxxx-xxxx');

echo $p->getTelephoneNumber() . "\n";

変更後

<?php

class TelephoneNumber2 {
    private $_number;
    private $_areaCode;

    public function getTelephoneNumber()
    {
        return '(' . $this->_areaCode . ')' . $this->_number;
    }

    public function getAreaCode()
    {
        return $this->_areaCode;
    }

    public function setAreacode($arg)
    {
        $this->_areacode = $arg;
    }

    public function getNumber()
    {
        return $this->_number;
    }

    public function setNumber($arg)
    {
        $this->_number = $arg;
    }
}

class Person2
{
    private $_name;
    private $_officeTelephone;

    public function __construct()
    {
        $this->_officeTelephone = new TelephoneNumber2();
    }

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

    public function getTelephoneNumber()
    {
        return $this->_officeTelephone->getTelephoneNumber();
    }

    public function getOfficeNumber()
    {
        $this->_officeTelephone->getNumber();
    }

    public function setOfficeNumber($arg)
    {
        $this->_officeTelephone->setNumber($arg);
    }

    public function setOfficeAreaCode($arg)
    {
        $this->_officeTelephone->setAreaCode($arg);
    }

    public function getOfficeAreaCode()
    {
        return $this->_officeTelephone->getAreaCode();
    }
}

$p = new Person2();
$p->setOfficeAreaCode('AreaCode');
$p->setOfficeNumber('xxxxx-xxxx-xxxx');

echo $p->getTelephoneNumber() . "\n";