目的
「リファクタリング」を理解するためにサンプルコードを 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);