問い合わせと更新の分離 (リファクタリング-p279)
リファクタリング
Published: 2019-03-02

目的

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

今回は「問い合わせと更新の分離」について書きます。

「問い合わせと更新の分離」 について

値を返す関数は観測可能な副作用を持っていなければ、非常に価値があります。

ここで従うべき良いルールは、値を返すメソッドはすべて、観測可能な副作用を持たないと決めてしまうことです。

変更前

<?php

class Sample
{
    public function foundMiscreant($people)
    {
        for ($i = 0; $i < count($people); $i++) {
            if ($people[$i] === 'Don') {
                $this->sendAlert();
                return 'Don';
            }
            if ($people[$i] === 'John') {
                $this->sendAlert();
                return 'John';
            }
        }

        return '';
    }

    public function checkSecurity($people)
    {
        $found = $this->foundMiscreant($people);
        $this->someLaterCode($found);
    }

    private function sendAlert()
    {
        echo 'sendAlert' . "\n";
    }

    private function someLaterCode($found)
    {
        echo 'found: ' . $found . "\n";
    }
}
$people = [
    'BBB' , 'John', 'CCC',
];
$s = new Sample();
$s->checkSecurity($people);

$people = [
    'BBB' , 'CCC',
];
$s->checkSecurity($people);

変更後

<?php

class Sample2
{
    public function foundPerson($people)
    {
        for ($i = 0; $i < count($people); $i++) {
            if ($people[$i] === 'Don') {
                return 'Don';
            }
            if ($people[$i] === 'John') {
                return 'John';
            }
        }

        return '';
    }

    public function sendAlertTarget($people)
    {
        if ($this->foundPerson($people) !== '') {
            $this->sendAlert();
        }
    }

    public function checkSecurity($people)
    {
        $this->sendAlertTarget($people);
        $found = $this->foundPerson($people);
        $this->someLaterCode($found);
    }

    private function sendAlert()
    {
        echo 'sendAlert' . "\n";
    }

    private function someLaterCode($found)
    {
        echo 'found: ' . $found . "\n";
    }
}
$people = [
    'BBB' , 'John', 'CCC',
];
$s = new Sample2();
$s->checkSecurity($people);

$people = [
    'BBB' , 'CCC',
];
$s->checkSecurity($people);