Гигантская цепочка elseif, гигантский переключатель или крошечный переключатель с функциями? - PullRequest
3 голосов
/ 21 февраля 2011

У меня есть PHP-файл с 9000 строками, который состоит из примерно 30 отдельных областей, в которых отображаются переменные $_POST. Так что можно быть ...

elseif (isset($_POST['view_user']) 
     || isset($_POST['edit_user']) 
     || isset($_POST['process_user_status']))

... и так далее. Вероятно, у меня есть около 75 точек входа в эти тридцать областей, все из которых обрабатываются длинными цепочками других типов, как указано выше.

Я думал об изменении этого на что-то более вменяемое. Идеи, которые я придумала до сих пор:

1) Сложите сообщения до логического значения и используйте их в цепочке elseif. Таким образом, вышеприведенное будет сводиться к elseif ($area_user), при этом $area_user будет установлено на true, если будет установлен какой-либо из $_POST выше. Но на самом деле это не решает проблему сложности.

2) Варианты использования вместо elseif. Таким образом, вышесказанное станет ...

case (isset($_POST['view_user'])):
case (isset($_POST['edit_user'])):
case (isset($_POST['process_user_status'])):
    do stuff;
    break;

Но, опять же, хотя он и удаляет синтаксис elseif, он просто заменяет его чем-то, что, хотя и немного более управляемым, может все еще скрывать истинную проблему.

3) Используйте функции. Так что в верхней части страницы у меня есть похожий оператор switch, но вместо того, чтобы быть в середине страницы, идущей прямо в область скрипта, он вызывает функцию, поэтому вместо «делать вещи» он может вызвать UserArea($_POST['whatever']). Преимущество этого заключается в перемещении всех $_POST переменных за пределы сценария и их концентрации в навигации и вызовах функций. Однако для этого потребуется множество объявлений глобальных функций, которые в данный момент мне не нужны, поскольку ветви elseif находятся в глобальной области видимости.

4) Рефакторинг полностью с полным разделением MVC, шаблонами и т. Д. Хотелось бы, но не вариант в данный момент. Просто будьте счастливы, что у меня откололась модель, но на данный момент вид и контроллер должны сосуществовать.

Поскольку я писал это, я все больше убеждаю себя в 3, но я хотел посмотреть, что думают вы, добрые люди. Какой должна быть лучшая практика навигации в такой ситуации?

1 Ответ

2 голосов
/ 21 февраля 2011

Еще один вариант для вас: словарь функций-обработчиков.

Поместите все свои потенциал $ _POST ключи ('view_user' и т. Д.) В ассоциативный массив, указывающий на функцию (имя), который обрабатывает их.Затем вместо цепочки ifelse итерируйте действительные ключи $ _POST, пока не найдете совпадение в массиве и не вызовите связанную функцию.

Теперь вы можете перемещать функции-обработчики вдругие файлы безболезненно, хотя вам может потребоваться добавить некоторые параметры для этого динамического вызова функции.Этот тип диспетчеризации используется большинством сред MVC (против шаблонов в пути, а не данных формы или строки запроса).

// Untested, but something like this
$handlers = array(
  'view_user' => 'UserArea',
  'edit_user' => 'UserArea',
  'view_document' => 'DocManagement', // for example
  // etc...
);
foreach ($_POST as $key => $value) {
  if(array_key_exists($key, $handlers)){
    call_user_func($handlers[$key]);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...