Рефакторинг на примере класса

mus

Новичок
Рефакторинг на примере класса

Господа, как бы вы упростили (сгруппировали) следующий код.
Имеется класс для сбора пользовательских ошибок (не заполнены все поля, логин занят и т.д.), у него есть три метода, исходный код которых очень похож. По мне следует провести рефакторинг кода, но в данном случае в голову ничего не приходит

PHP:
function getErrors()
{
        $tmp = array();
        $args = func_get_args();
        list($chap,$isCritical) = $args;
        for($i = 1; $i <= $this->cnt;$i++) {
            if(($chap === NULL || $this->Errors[$i]['chap'] === $chap) &&
               ($isCritical === NULL || $this->Errors[$i]['isCritical'] === $isCritical)) {
                       $tmp[] = $this->Errors[$i];
               }
        }
        return $tmp;
}
function isEmpty()
{
        $args = func_get_args();
        list($chap,$isCritical) = $args;
        for($i = 1; $i <= $this->cnt;$i++) {
            if(($chap === NULL || $this->Errors[$i]['chap'] === $chap) &&
               ($isCritical === NULL || $this->Errors[$i]['isCritical'] === $isCritical)) {
                       return false;
               }
        }
        return true;
}
function Count() {
        $count = 0;
        $args = func_get_args();
        list($chap,$isCritical) = $args;
        for($i = 1; $i <= $this->cnt;$i++) {
            if(($chap === NULL || $this->Errors[$i]['chap'] === $chap) &&
               ($isCritical === NULL || $this->Errors[$i]['isCritical'] === $isCritical)) {
                       $count++;
               }
        }
        return $count;
}
Три метода - фишка в том, что сей класс имеет подразделения - это раздел, в котором произошла ошибка (на странице может быть несколько разделов, как то аутентификация и регистрация) и критична ли ошибка, как то если пароль меньше 6 символов - разрешить регистрацию, но вывести предупреждение, что пасс конечно )(еpоват, но если, скажем, вбиваемый логин в базе существует, то тут регистрацию следует запретить.
 

svetasmirnova

маленький монстрик
>Господа, как бы вы упростили (сгруппировали) следующий код.
Если эти ф-ии используются во многих местах, не стала бы упрощать из-за сокращения кода на 2 строчки. А если можно избавиться от func_get_args() - непонятно зачем используется для постоянного числа аргументов, - то:
PHP:
function getErrors($chap,$isCritical) {
//остальное оставляем как было
}
function isEmpty()
{
return !empty($this->getErrors($chap,$isCritical));
}
function Count() { 
return count($this->getErrors($chap,$isCritical));
}
 

denver

?>Скриптер
Насколько я понял этот бред (больше по коду чем объяснениям) то здесь нужна только метод getErrors()

PHP:
function isEmpty() {
  return is_empty($this->getErrors();
}

function count() {
  return count($this->getErrors();
}
-~{}~ 25.06.06 02:15:

svetasmirnova тоже в курсе :)

-~{}~ 25.06.06 02:17:

рефакторинг кода... гы
 

mus

Новичок
Методы могут принимать следующие параметры
$error->getErrors(); // Вывести все ошибки всех разделов
$error->getErrors("News"); // Вывести все ошибки раздела новости
$error->getErrors("News",true); // Вывести лишь критические ошибки раздела новости
$error->getErrors("News",false); // Вывести НЕ критические ошибки раздела новости
$error->getErrors("News", NULL); // аналог $error->getErrors("News");
$error->getErrors(NULL, true); // Вывести лишь критические ошибки всех разделов
$error->getErrors(NULL, false); // Вывести не критические ошибки всех разделов
$error->getErrors(NULL, NULL); // аналог $error->getErrors();

Ваши способы явно не подходят, иначе я могу сделать вообще так

return $this->cnt == 0; // на пустоту
return $this->cnt; // на количество

func_get_args здесь зачем, думаю, уже понятно...
 

mus

Новичок
скажем так. понятно, что ты не знаешь о значениях по умолчанию
Скажем так, предыдущий вариант этого обработчика выглядел так
PHP:
function getErrors($chap="x",$isSystem="x", $isCritical="x")
{
        $tmp=array();
        for ($i=1;$i<=($this->cnt);$i++)
        if(($chap=="x" || $this->Errors[$i]['chap']===$chap) &&
         ($isSystem=="x" || $this->Errors[$i]['isSystem']===$isSystem) &&
         ($isCritical=="x" || $this->Errors[$i]['isCritical']===$isCritical))
        $tmp[]=$this->Errors[$i];
        return $tmp;
}
В остальном я не прав, тему можно закрывать.
 

svetasmirnova

маленький монстрик
>func_get_args здесь зачем, думаю, уже понятно...
>list($chap,$isCritical) = $args;
NOTICES включать надо
 
Сверху