制御フラグの削除 (リファクタリング-p245)
リファクタリング
Published: 2019-02-13

目的

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

今回は「制御フラグの削除」について書きます。

「制御フラグの削除」 について

一連の論理型の式に対して制御フラグとして機能する1つの変数がある。

代わりにbreakかreturnを使う。

変更前

<?php

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

function checkSecurity($people)
{
    $found = false;
    for ($i = 0; $i < count($people); $i++) {
        if (!$found) {
            if ($people[$i] === 'Don') {
                sendAlert();
                $found = true;
            }
            if ($people[$i] === 'John') {
                sendAlert();
                $found = true;
            }
        }
    }
}

$people = [
    'BBB' , 'John', 'CCC', 'Don',
];
checkSecurity($people);

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

変更後 (breakによる簡単な制御フラグの置き換え)

<?php

function checkSecurity2($people)
{
    for ($i = 0; $i < count($people); $i++) {
        if ($people[$i] === 'Don') {
            sendAlert();
            break;
        }
        if ($people[$i] === 'John') {
            sendAlert();
            break;
        }
    }
}

$people = [
    'BBB' , 'John', 'CCC', 'Don',
];
checkSecurity2($people);

$people = [
    'BBB' , 'CCC',
];
checkSecurity2($people);

変更後 (制御フラグの結果を伴うreturnの使用)

<?php

function checkSecurity3($people)
{
    $found = foundMiscreant3($people);

    // someLaterCode($found);
}

function foundMiscreant3($people)
{
    for ($i = 0; $i < count($people); $i++) {
        if ($people[$i] === 'Don') {
            sendAlert();
            return 'Don';
        }
        if ($people[$i] === 'John') {
            sendAlert();
            return 'John';
        }
    }

    return '';
}

$people = [
    'BBB' , 'John', 'CCC', 'Don',
];
checkSecurity3($people);

$people = [
    'BBB' , 'CCC',
];
checkSecurity3($people);