汎用性の異なる処理は分割する
次の関数を見てみましょう。
function get_goods_table_list($dbh) {
// SQL生成
$sql = 'SELECT name, price FROM test_products';
try {
// SQL文を実行する準備
$stmt = $dbh->prepare($sql);
// SQLを実行
$stmt->execute();
// レコードの取得
$rows = $stmt->fetchAll();
} catch (PDOException $e) {
throw $e;
}
return $rows;
}
一見すると何も問題のなさそうな関数ですが、次の関数と見比べてみましょう。
function get_employee_table_list($dbh) {
// SQL生成
$sql = 'SELECT name, job FROM employees';
try {
// SQL文を実行する準備
$stmt = $dbh->prepare($sql);
// SQLを実行
$stmt->execute();
// レコードの取得
$rows = $stmt->fetchAll();
} catch (PDOException $e) {
throw $e;
}
return $rows;
}
よく見ると、最初のSELECT文以外は全く同じ内容であることがわかります。
ここは、DRY原則の出番です。共通している部分を関数化してみましょう
function get_as_array($dbh, $sql) {
// SQL文を実行する準備
$stmt = $dbh->prepare($sql);
// SQLを実行
$stmt->execute();
// レコードの取得
$rows = $stmt->fetchAll();
return $rows;
}
function get_goods_table_list($dbh) {
$sql = 'SELECT name, price FROM test_products';
return get_as_array($dbh, $sql);
}
function get_employee_table_list($dbh) {
$sql = 'SELECT name, job FROM employees';
return get_as_array($dbh, $sql);
}
共通部分を関数get_as_arrayにまとめることができました。 振り返って見ると、
- SELECT文を実行して配列を取得する
という汎用性の高い処理と、
- 商品(従業員)テーブルに対するSELECT文を用意する
という個別具体的な処理が混ざっていたことが問題でした。
そのため、汎用性が高い「SELECT文を実行して配列を取得する」 部分だけを取り出すことによって、処理を共通化してDRY原則を適用することができるようになりました。
このように、すでに関数化されている部分についても、汎用性の高い処理が混ざり込んでいないかよくチェックして見ると良いでしょう。