コンストラクタ本体の引き上げ (リファクタリング-p325)
リファクタリング
Published: 2019-03-15

目的

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

今回は「コンストラクタ本体の引き上げ」について書きます。

「コンストラクタ本体の引き上げ」 について

複数のサブクラスに内容がほとんど同一のコンストラクタがある。

しかしコンストラクタでは、この共通の振る舞いがしばしば生成処理なのです。

変更前

<?php

class Employee
{
    protected $_name;
    protected $_id;
}

class Manager extends Employee
{
    private $_grade;

    public function __construct($name, $id, $grade)
    {
        $this->_name = $name;
        $this->_id = $id;
        $this->_grade = $grade;
    }

    public function getGrade()
    {
        return $this->_grade;
    }
}
$m = new Manager('name', 456, 20);
echo $m->getGrade() . "\n";

変更後

<?php

class Employee2
{
    protected $_name;
    protected $_id;

    protected function __construct($name, $id)
    {
        $this->_name = $name;
        $this->_id = $id;
    }
}

class Manager2 extends Employee2
{
    private $_grade;

    public function __construct($name, $id, $grade)
    {
        parent::__construct($name, $id);
        $this->_grade = $grade;
    }

    public function getGrade()
    {
        return $this->_grade;
    }
}
$m = new Manager2('name', 456, 20);
echo $m->getGrade() . "\n";