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