Исходный код
if (!$ncat) {
$sql="select * from articles_cat where status=1 order by `name` ASC limit 0,1";
$res = m_qr($sql);
if (m_rows($res)) {
while ($row = m_arr2($res)) {
$ncat=$row[id];
... 10 строк кода ...
}
}
} else {
$sql="select * from articles_cat where id='$ncat'";
$res = m_qr($sql);
if (m_rows($res)) {
while ($row = m_arr2($res)) {
$ncat=$row[id];
... те же 10 строк кода ...
}
}
}
Как избавиться от дублирования кода
Поскольку условие if (!$ncat)
влияет только на вид запроса к БД, но не влияет на обработку результатов запроса, второе можно «вынести за скобки».
Кроме дублирования в этом фрагменте содержится два знания: как сформировать запрос и как обработать результаты запроса. В идеале тут следует применить рефакторинг «извлечение функции».
Я бы убрал проверку if (m_rows($res))
, так как следующий за ней цикл и так обеспечивает ноль итераций при отсутствии строк в ответе от БД.
function articlesCatQuery($ncat)
{
if ($ncat) {
return "select * from articles_cat where id='" . mysql_real_escape_string($ncat) . "'";
}
else {
return "select * from articles_cat where status=1 order by `name` ASC limit 0,1";
}
}
$res = m_qr(articlesCatQuery($ncat));
while ($row = m_arr2($res)) {
$ncat = $row[id];
... 10 строк кода ...
}
Обрати внимание, что в функцию был извлечён вовсе не дублирующийся код, а тот, который содержит «второстепенное» знание по отношению к улучшаемому фрагменту кода.
Теория
- Принцип единственной реализации
- Принцип единственного знания
- Рефакторинг «извлечение метода»