Рефакторинг кода контроллера MVC модели? Здравствуйте товарищи! Я долго пытался понять как избавится от обилия условных операторов в коде, они изрядно заставляют глаза побегать и снижают читаемость кода. Подскажите пожалуйста, как без создания новых методов класса избавится от обилия условных операторов, ниже пример кода метода класса контроллера: //вывод запрашиваемой статьи из базы function getAction() { $fc=FrontController::get(); $url=$fc->getParams(); $view=new View(); //возваращаем запрашиваемую статью из базы в виде ассоциативного массива $view->content=Articles::get()->getArticle((int)$url['id']); //выборка комментариев к статье $view->comments=Articles::get()->getComments((int)$url['id']);
if($_SERVER['REQUEST_METHOD']=='POST' and isset($_POST['addcomment'])) { if($_SESSION['captcha']==crypt($_POST['captcha'],'x)p_q1')) { if(!empty($_POST['comment_txt']) and !empty($_POST['name'])) { if($_POST['article_id']==(int)$url['id']) { $check=Articles::get()->checkComment($_POST['article_id'], $_POST['comment_txt'], $_POST['name']); if($check=='0') { $view->comments=Articles::get()->addComment($_POST['article_id'], $_POST['comment_txt'], $_POST['name']); ($view->comments) ? $view->comments='Ваш комментарий успешно добавлен!' : $view->comments='Ошибка при вставке комментария!'; } else $view->comments='Данный комментарий уже добавлен!'; }
else $view->comments='Вы пытаетесь вставить комментарий не в ту статью!'; } else $view->comments='Поля не должны содержать пустых значений!'; } else { $view->comments='Вы ввели символы с картинки некорректно!'; }
} else { //проверка на наличие пришедших данных ($view->comments==false) ? $view->comments='Комментариев к статье еще нет!': $view->comments; }
Для упрощения кода и уменьшения количества условных операторов в вашем контроллере, можно использовать ранние возвраты из функции и оптимизировать логику условий. Вот пример рефакторинга вашего метода getAction():
function getAction() { $fc=FrontController::get(); $url=$fc->getParams(); $view=new View(); //возваращаем запрашиваемую статью из базы в виде ассоциативного массива $view->content=Articles::get()->getArticle((int)$url['id']); //выборка комментариев к статье $view->comments=Articles::get()->getComments((int)$url['id']); if($_SERVER['REQUEST_METHOD']!='POST' || !isset($_POST['addcomment'])) { ($view->comments) ? $view->comments='Комментариев к статье еще нет!' : ''; $view->title = empty($view->content['title']) ? 'Такой статьи нет' : $view->content['title']; $view->keywords = empty($view->content['meta_key']) ? '' : $view->content['meta_key']; $view->description = empty($view->content['meta_description']) ? '' : $view->content['meta_description']; $result=$view->render('../views/article.php'); $fc->setBody($result); return; } if($_SESSION['captcha'] != crypt($_POST['captcha'],'x)p_q1')) { $view->comments='Вы ввели символы с картинки некорректно!'; $result=$view->render('../views/article.php'); $fc->setBody($result); return; } if(empty($_POST['comment_txt']) || empty($_POST['name'])) { $view->comments='Поля не должны содержать пустых значений!'; $result=$view->render('../views/article.php'); $fc->setBody($result); return; } if($_POST['article_id'] != (int)$url['id']) { $view->comments='Вы пытаетесь вставить комментарий не в ту статью!'; $result=$view->render('../views/article.php'); $fc->setBody($result); return; } $check=Articles::get()->checkComment($_POST['article_id'], $_POST['comment_txt'], $_POST['name']); if($check=='0') { $view->comments=Articles::get()->addComment($_POST['article_id'], $_POST['comment_txt'], $_POST['name']); ($view->comments) ? $view->comments='Ваш комментарий успешно добавлен!' : $view->comments='Ошибка при вставке комментария!'; } else { $view->comments='Данный комментарий уже добавлен!'; } $result=$view->render('../views/article.php'); $fc->setBody($result); }
Этот рефакторинг убирает лишние вложенные условия, что делает код более читаемым и поддерживаемым. Помните, что всегда стоит стремиться к минимизации сложности кода и избегать избыточных конструкций.
Для упрощения кода и уменьшения количества условных операторов в вашем контроллере, можно использовать ранние возвраты из функции и оптимизировать логику условий. Вот пример рефакторинга вашего метода getAction():
function getAction(){
$fc=FrontController::get();
$url=$fc->getParams();
$view=new View();
//возваращаем запрашиваемую статью из базы в виде ассоциативного массива
$view->content=Articles::get()->getArticle((int)$url['id']);
//выборка комментариев к статье
$view->comments=Articles::get()->getComments((int)$url['id']);
if($_SERVER['REQUEST_METHOD']!='POST' || !isset($_POST['addcomment']))
{
($view->comments) ? $view->comments='Комментариев к статье еще нет!' : '';
$view->title = empty($view->content['title']) ? 'Такой статьи нет' : $view->content['title'];
$view->keywords = empty($view->content['meta_key']) ? '' : $view->content['meta_key'];
$view->description = empty($view->content['meta_description']) ? '' : $view->content['meta_description'];
$result=$view->render('../views/article.php');
$fc->setBody($result);
return;
}
if($_SESSION['captcha'] != crypt($_POST['captcha'],'x)p_q1'))
{
$view->comments='Вы ввели символы с картинки некорректно!';
$result=$view->render('../views/article.php');
$fc->setBody($result);
return;
}
if(empty($_POST['comment_txt']) || empty($_POST['name']))
{
$view->comments='Поля не должны содержать пустых значений!';
$result=$view->render('../views/article.php');
$fc->setBody($result);
return;
}
if($_POST['article_id'] != (int)$url['id'])
{
$view->comments='Вы пытаетесь вставить комментарий не в ту статью!';
$result=$view->render('../views/article.php');
$fc->setBody($result);
return;
}
$check=Articles::get()->checkComment($_POST['article_id'], $_POST['comment_txt'], $_POST['name']);
if($check=='0')
{
$view->comments=Articles::get()->addComment($_POST['article_id'], $_POST['comment_txt'], $_POST['name']);
($view->comments) ? $view->comments='Ваш комментарий успешно добавлен!' :
$view->comments='Ошибка при вставке комментария!';
}
else
{
$view->comments='Данный комментарий уже добавлен!';
}
$result=$view->render('../views/article.php');
$fc->setBody($result);
}
Этот рефакторинг убирает лишние вложенные условия, что делает код более читаемым и поддерживаемым. Помните, что всегда стоит стремиться к минимизации сложности кода и избегать избыточных конструкций.