自己カプセル化フィールド (リファクタリング-p171)
リファクタリング
Published: 2018-12-02

目的

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

今回は「自己カプセル化フィールド」について書きます。

「自己カプセル化フィールド」 について

フィールドのアクセス方法には2つの流派があります。 1つは、その変数を定義しているクラス内の範囲内なら自由にアクセスしてよいとする派です。 もう1つは、クラス内であっても必ずアクセサを使うべきであるとする派です。

「自己カプセル化フィールド」を行う最も重要なタイミングは、スーパークラスのフィールドをアクセスしていて、その変数アクセスをサブクラス内の計算値で置き換えたいと思ったときです。

変更前

<?php

class IntRange
{
    private $_low;
    private $_high;

    public function __construct($low, $high)
    {
        $this->_low = $low;
        $this->_high = $high;
    }

    public function includes($arg)
    {
        return $arg >= $this->_low && $arg <= $this->_high;
    }

    public function grow($factor)
    {
        $this->_high = $this->_high * $factor;
    }
}

$ir = new IntRange(20, 30);
echo (int)$ir->includes(21) . "\n";

変更後

<?php

class IntRange2
{
    private $_low;
    private $_high;

    public function __construct($low, $high)
    {
        $this->initialize($low, $high);
    }

    private function initialize($low, $high)
    {
        $this->_low = $low;
        $this->_high = $high;
    }

    public function getLow()
    {
        return $this->_low;
    }

    public function getHigh()
    {
        return $this->_high;
    }

    public function setLow($arg)
    {
        $this->_low = $arg;
    }

    public function setHigh($arg)
    {
        $this->_high = $arg;
    }

    public function includes($arg)
    {
        return $arg >= $this->getLow() && $arg <= $this->getHigh();
    }

    public function grow($factor)
    {
        $this->setHigh($this->getHigh() * $factor);
    }
}

$ir = new IntRange2(20, 30);
echo (int)$ir->includes(21) . "\n";