всунутый колея, нуждайтесь в помощи, прорываясь к следующему уровню

Я работаю над скромным веб-сайтом со своими посредственными, навыками PHP-самоучками, и текущая интерфейсная структура похожа на это:

<?php
  if (A) {
    $output = someFunc(A);
  } else if (B) {
    $output = anotherFunc(B);
  } else if (C) {
    $output = yetAnotherFunc(C);
  } else {
    $output = 'default stuff';
  }
?>
<html template top half>

<?php echo $output; ?>

</html template bottom half>

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

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

У меня есть чувство, что MVC является одним решением? Но мне нелегко схватывать, как пойти отсюда дотуда...

Я приношу извинения за любые головные боли или неприятные памяти, которые, возможно, запросил вышеупомянутый код. Спасибо за Ваше время.

8
задан Drew 28 July 2010 в 00:55
поделиться

3 ответа

Похоже, вы начали с того, что делают многие люди, с большого оператора if и / или case, который продолжает расти. Все эти проверки «если» могут потребовать времени. MVC - определенно отличный способ, но есть много способов его реализовать. Я бы порекомендовал также взглянуть на шаблон проектирования Front Controller, который обычно используется с MVC.

Один из способов изменить то, как вы что-то делаете, - это переключиться на определенный список «действий» с использованием ассоциативного массива. И измените свои функции на include. Тогда у вас может быть несколько функций, переменных и другого кода обработки.

$actions = array(
'A'=>'action1.php',
'B'=>'action2.php',
'C'=>'action3.php',
'default'=>'action_default.php'
);
if ( isset( $actions[ $_GET['action'] ] ) ) {
    include( $actions[ $_GET['action'] ] );
} else {
    include( $actions['default'] );
}

Тогда ваш "индексный" файл - это просто инструмент маршрутизации, что в значительной степени является концепцией Front Controller.

5
ответ дан 5 December 2019 в 18:55
поделиться

Общее предложение: Вы смотрели Smarty ? Я обнаружил, что это довольно полезный шаблонизатор. Это, вероятно, требует некоторого обучения, но в конечном итоге оно того стоит.

0
ответ дан 5 December 2019 в 18:55
поделиться

В любом объектно-ориентированном коде всякий раз, когда вы видите серию операторов if / else или case, они часто лучше обрабатываются иерархией объектов, а не группой if / else / else.

В вашем конкретном случае вместо этого у вас может быть 3 разных класса для A, B и C. И просто вызвать один метод $ obj-> doit (). У A, B и C будут разные реализации метода doit ().

Если вы хотите выйти из своей колеи, я рекомендую прочитать книгу о шаблонах проектирования. Вот несколько примеров шаблонов проектирования в PHP: http://www.fluffycat.com/PHP-Design-Patterns/

Шаблоны, которые могут представлять для вас особый интерес для этого конкретного типа проблемы:

  • Стратегия.
  • Команда.
  • Завод.

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

Я обычно обычно использую три из них вместе, чтобы аккуратно организовать код в ситуациях, похожих или идентичных тем, что вы описываете. Работает это так: - Стратегия. Это как форма для печенья или стиль Mad Libs. Вы устанавливаете основы, необходимые для выполнения функции. Пользователь (программист, использующий базовый класс) может при необходимости переопределить определенные вещи, но основы для выполнения работы уже есть. Пример: нам нужно выполнить бизнес-процесс. Обычно это включает в себя запуск транзакции, выполнение «основной части» работы, затем выполнение очистки и ведения журнала. Может показаться излишним использование здесь шаблона Stragegy / cookie-cutter, но часто это не так: вам нужно не забыть выполнить очистку, даже если в «самом мясе» кода возникла ошибка или исключение. Используя шаблон «Стратегия / резак для печенья», вы можете сделать все это с помощью минимального шаблонного / повторяющегося кода.

  • Команда: В сочетании с идеями паттерна Стратегия, о котором я упоминал выше, у вас меньше шаблонного кода в ваших функциях, которые выполняют фактическую работу.

  • Завод. Вы используете фабричный метод для генерации команды, соответствующей ситуации, с которой вы столкнулись.

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

Машка ниже рекомендуется использовать Smarty, что является разумной идеей. Лучшей идеей, в зависимости от вашего приложения, может быть использование инфраструктуры MVC. Если вы привержены идее придерживаться PHP, я рекомендую CakePHP и добился большого успеха с ним.Это поможет вам очень хорошо изложить ваш код и избавит вас от неприятностей.

4
ответ дан 5 December 2019 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: