Zend Framework. MVC. Как правильно кодить 'жирные' модели?

Сегодня в одном старом отложенном проекте столкнулся с тем, что у меня в мейн моделях проекта от 5 до 10 тысяч строчек кода. И очень больно стало что то изменять, поддерживать, и дописывать новый функционал.
Мне такое чувство что бест практик говорит чушь по поводу толстых моделей.
Объясняю подробнее.
В моделях есть некоторые методы которые громоздкие, используют и манипулируют с данными, но используются всего лишь один раз в проекте. Например метод регистрации пользователя. 400 строк кода. Используется только в RegisterController. Например методы для вывода заявок и объявлений в зависимости от типа авторизированного пользователя и доступа к данным. 500 строк кода. Используется строго один раз в AdvertisementController. И так далее
Есть сущность Model_Advertisement.
В которой визуально я увидел следующую картинку. Тяжелые методы использующееся один раз разделяются визуально на Создание / Смена статуса / Вывод.
Плохо ли будет если я сделаю так.
- Model_Advertisement_Core- методы которые используются много кратно
- Model_Advertisement_Fetcher - методы которые используются один раз для вывода данных
- Model_Advertisement_Changer - методы которые -//- для изменения данных
- Model_Advertisement_Creator - методы которые -//- для создание заявок

Да.... Получается что я тяжелый CRUD разбиваю на логические компоненты в модели

Кто что может сказать или посоветовать по этому поводу?
  • Вопрос задан
  • 3134 просмотра
Пригласить эксперта
Ответы на вопрос 3
fornit1917
@fornit1917
Я использую не Zend, а Yii, но суть та же. И я между моделью и контроллером делаю еще один слой абстракции - слой сервисов. Это просто классы, методы которых выполняют некоторые логические транзакции, манипулируя моделями и другими сервисами. Удобно переиспользовать, удобно тестировать, нет проблемы с огромными файлами.
Ответ написан
Комментировать
@Rumzik Автор вопроса
То-есть Можно просто создать класс
class Service_Advertisement{
   public static function action1(){ /**Здесь манипулируем моделями и параметрами запроса**/   }
   public static function action2(){  /**--//--**/  }
}

а в контроллере

class AdvertisementController extend Zend_Controller_Action
{
  public function createAction(){
       //render in view or render in json format (auto detected context)
       return Service_Advertisement::action1($this->_getParams());
  }
}


Кстати у вас в Yii вижу концепция статических методов в моделях. Это удобно по сути. Но это правильно или нет ????
В зенде плохо, так как обертка ядра, не в статике и адаптер пдо инитится в конструкторе при создании обьекта
и приходится каждый раз писать
$model = new Model_Advertisement();
$advertisementObj = $model->findRow($id);
$model = new Model_Users();
$userObj = $model->findRow($user_id);
$model = new Model_Stat();
$model->calculateStatisticInformation($advertisementObj,$userObj);

На Статике это бы проще выглядело мне кажется .
Ответ написан
cawakharkov
@cawakharkov
никаких "жирных" моделей или контроллеров быть не должно, кстати часто встречал это у уйй разработчиков(не в обиду сказано будет).
Используйте сервисы и SOA архитектуру vk.com/wall-175_45236
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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