застрял в колее, нужна помощь, чтобы прорваться на следующий уровень - PullRequest
8 голосов
/ 28 июля 2010

Я работаю над скромным веб-сайтом с моими посредственными, самообучаемыми навыками 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 - это одно из решений? Но мне трудно понять, как пройти отсюда туда ...

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

Ответы [ 3 ]

5 голосов
/ 28 июля 2010

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

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

$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.

4 голосов
/ 28 июля 2010

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

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

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

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

  • Стратегия.
  • Command.
  • Factory.

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

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

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

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

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

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

0 голосов
/ 28 июля 2010

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

...