Устранение дублирования кода при выполнении запроса к БД


Исходный код

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 строк кода ...
}

Обрати внимание, что в функцию был извлечён вовсе не дублирующийся код, а тот, который содержит «второстепенное» знание по отношению к улучшаемому фрагменту кода.

Теория