Теоретический вопрос о моделях в MVC фреймворках и способе возврата вычисляемых данны

Обсуждение серверного программирования.

Модераторы: Duncon, Yurich

Ответить
LukiDuki1980
Сообщения: 2
Зарегистрирован: 19 апр 2015, 17:05

19 апр 2015, 17:06

Вопрос у меня не конкретно к какому-то фреймворку, а в целом, так скажем по теории.

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

Раньше, скажем в PHP, это решалось просто, к возвращенному массиву просто добавляли новые значения и возвращали весь список, а как решать эту проблему на уровне текущих абстракций фреймворков? В класс (отражающий таблицу) добавлять дополнительные поля? Или же создать отдельный класс, который включает как вычисляемые данные, так и объект с БД?
LukiDuki1980
Сообщения: 2
Зарегистрирован: 19 апр 2015, 17:05

20 апр 2015, 16:36

Версия вопроса 2.0 (с кодом).
Условие, после обработки из БД формируется результат в виде некого объекта класса Post, в котором описаны поля таблиц (ORM иди ActiveRecord не важно).
Вопрос.
Как с точки зрения ООП дизайна поступить, то есть что вернуть контроллеру?


1) Просто вернуть массив, где одно значение это объект Post (результат из БД), а второй вычисленные данные.

Код: Выделить всё

class Model {

public function getData(){
  $query = "Query";
  $post = $store->get($query);
  $result = [
    'post' => $post,
    'smthParams' => $this->calculateSmth()
  ];
  
  return $result;
}
...
}
2) Создать какой-то выше по уровню класс типа OverPost, которые бы включал в себя объект (результат из БД), и вычисленные данные (по сути тот же массив только в обертке ООП со всеми плюшками).

Код: Выделить всё

class Model {

public function getData(){
  $query = "Query";
  $post = $store->get($query);
  $result = new OverPost()
  $result->setPostData($post);
  $result->setSmthParam($this->calculateSmth())
  
  return $result;
}
...
}

3) Заранее расширить класс Post, чтобы он содержал данные не только с таблиц БД, а так же вычисляемые данные.

Код: Выделить всё

class Model {

public function getData(){
  $query = "Query";
  $post = $store->get($query);
  $post->setSmthParam($this->calculateSmth());
  return $post;
}
...
}
В общем какой вариант будет правильней, с точки зрения дизайна кода, с точки зрения MVC и с точки зрения нынешнего стиля фреймворков?
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

22 апр 2015, 01:00

LukiDuki1980 писал(а):с точки зрения MVC
С точки зрения MVC расклад такой.
Model - это то, что складывается в хранилище. Этот набор сообщений на форуме хранится в одной таблице. То есть модель одна.
View - это способ отображения данных. Тут их минимум 4 варианта: версия для печати, линейный, древовидный и комбинированный способ отображения ветки.
Control - это способ связи View c Model'ю. В нем осуществляются все функции ограничения доступа.


То есть. Модель - хранит всё, что в неё положат. Представление - показывает всё, что ему предложат. А контроллер осуществляет контроль над тем, что можно положить в модель и над тем, что можно показать в представлении в зависимости от роли пользователя.


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

Соответственно расширять нужно не модель, а контроллер :)
Даже самый дурацкий замысел можно воплотить мастерски
Ответить