2011-01-24 4 views

ответ

1

В шаблоне MVC модель должна манипулировать только данными, хранящимися в базе данных, и всем поведением, связанным с ней. Итак:

  • если у вас есть действие (часть слоя контроллера), что делает много манипуляции объекта, попробуйте переместить такое поведение метода или группы методов так Обслуживающей логики данных остается в слое модели, оставляя как можно более простым контроллером (он должен обрабатывать только отношения между данными и видом)
  • То же, что и выше, представление должно только заботиться о том, чтобы показать информацию, не обрабатывающую его!

Теперь процесс рефакторинга я обычно применяю это:

  1. Найдите код, который кажется связанной
  2. Пытаться создать функцию, которая может представлять его поведение (ищите параметров возможностей). Иногда вы получите такие вещи, как Template Method DesignPattern (Здесь вы должны проверить свой код, чтобы узнать, что он делает)
  3. Замените исходный код на вызов функции (или в этом случае вызов экземпляра/статического метода определенный класс) (проверьте еще раз для функциональности)

Этот процесс в любой другой слой с некоторыми отличиями:

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

Реальный пример: У вас есть запрос, который будет проверять на наличие какой-либо записи с заданным «именем» значение поля, и вы хотите использовать его во всем, то:

  1. чек какой тип информации вы обрабатываете. В этом случае это PeerStructure, которая каким-то образом должна фильтровать результат таблицы в зависимости от значения таблицы. Если вы проверите, я сказал: «Peer ...», «Table» дважды, поэтому я думаю о создании статического метода в классе Peer, который обрабатывает значения, которые я хочу фильтровать, скажем, ApplicationUser.
  2. Теперь, когда я знаю, что собираюсь строить, проверьте параметры, которые могут быть или не быть. В этом случае «имя» является возможным параметром (он также может быть критерием). Также вы должны подумать о том, какие ценности вы собираетесь вернуть. И поскольку мы говорим о статическом методе для однорангового класса, я предполагаю, что существуют два возможных значения: Критерии или ResultSet (с этим я подразумеваю набор результатов, а не структуру).
  3. Наконец, создайте статический метод.

    public static function countUsername ($ username) { $ c = new Критерии(); $ c-> add (ApplicationUserPeer :: NAME, $ name, Criteria :: EQUAL); return ApplicationUserPeer :: doCount ($ c); }

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

public function executeCreateUser(sfWebRequest $request) 
{ 
    [...] 
    $c = new Criteria(); 
    $c->add(ApplicationUserPeer::NAME,$request->getParameter('username'),Criteria::EQUAL); 
    ; 
    if(ApplicationUserPeer::doCount($c) == 0) 
    { 
    //Then do some stuff that saves 
    } 
    [...] 
} 

После использования функции вашего кода может выглядеть следующим образом:

public function executeCreateUser(sfWebRequest $request) 
{ 
    [...] 
    if(ApplicationUserPeer::countUsername($request->getParameter('username')) == 0) 
    { 
    //Then do some stuff that saves 
    } 
    [...] 
} 

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

+0

Можете ли вы более подробно рассказать о том, как перегруппировать аналогичные запросы в модели? Например, у меня есть запрос, который будет проверять наличие конкретной записи с заданным значением поля «имя» (createQuery ('table_name') -> где (table_name.name =?, $ Value). чтобы эта функциональность делилась между двумя отдельными моделями.Что такое хороший способ сделать это? – whamsicore

+0

Уверенная вещь, дайте мне немного времени, чтобы получить некоторые примеры, и я отредактирую это! – guiman

+0

Это для хорошего жеста, когда вы планируете что редактирование, хотя?: D – whamsicore

Смежные вопросы