Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2015, 16:37   #1
LukiDuki1980
 
Регистрация: 19.04.2015
Сообщений: 5
По умолчанию Теоретический вопрос о моделях в MVC фреймворках и способе возврата вычисляемых данных

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

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

Раньше, скажем в PHP, это решалось просто, к возвращенному массиву просто добавляли новые значения и возвращали весь список, а как решать эту проблему на уровне текущих абстракций фреймворков? В класс (отражающий таблицу) добавлять дополнительные поля? Или же создать отдельный класс, который включает как вычисляемые данные, так и объект с БД?
LukiDuki1980 вне форума Ответить с цитированием
Старый 19.04.2015, 17:04   #2
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

модель это не таблица в общем случае, что вас конкретно интересует?
lomastr_ вне форума Ответить с цитированием
Старый 19.04.2015, 17:21   #3
LukiDuki1980
 
Регистрация: 19.04.2015
Сообщений: 5
По умолчанию

Цитата:
Сообщение от lomastr_ Посмотреть сообщение
модель это не таблица в общем случае, что вас конкретно интересует?
ну собственно вопрос я написал, в каком виде (ООП) возвращать данные, в ситуации когда нужно вернуть больше чем объект с данными из таблицы БД, в условиях фрейворков (не видел не одного примера подобного рода, всегда возвращают "объекты с БД")
LukiDuki1980 вне форума Ответить с цитированием
Старый 19.04.2015, 17:28   #4
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от LukiDuki1980 Посмотреть сообщение
когда нужно вернуть больше чем объект с данными из таблицы БД
«больше чем объект с данными из таблицы» – это что именно имеется в виду?
Конкретный пример таких данных.
Andkorol вне форума Ответить с цитированием
Старый 19.04.2015, 17:33   #5
LukiDuki1980
 
Регистрация: 19.04.2015
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
«больше чем объект с данными из таблицы» – это что именно имеется в виду?
Конкретный пример таких данных.
Любые данные которые вычисляются в модели.
То есть в процессе работы модели генерируются еще данные, и получается что нужно вернуть как данные из таблицы, так и вычисленные данные, как это сделать правильно в рамках фрейворков. Расширить класс таблицы или же поместить в другую?
LukiDuki1980 вне форума Ответить с цитированием
Старый 19.04.2015, 17:33   #6
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

ооп это объекты, пишите класс возвращаете объект этого класса
так и не понимаю в чем у вас вопрос
напишите в запросе так select t1.col1, t2.col2, t1 col1/t2.col2 from t1, t2 where t1.id=t2.id
какой "объект бд" тут получаете? это просто набор данных, остальное не важно, также модель может быть вовсе не связанна с бд
хотите в логику класса всунуть еще что-то? кто мешает?
просто говоря модель подразумевают чисто данные (без бизнес логики), но это не догма, а просто отделение мух от котлет
lomastr_ вне форума Ответить с цитированием
Старый 19.04.2015, 17:40   #7
LukiDuki1980
 
Регистрация: 19.04.2015
Сообщений: 5
По умолчанию

вот пример некого абстрактного фреймворка (на псевдоязыке, надеюсь смысл понятен):
есть класс Post таблицы бд "post_user"

обычно пишут так
$data = model->getPost(34);// в ответе содержится объект Post с номером поста 34


Но в процессе работы getPost вычисляются еще данные, запихнуть в Post я не могу, так как он отражает таблицу в бд.


PS я прекрастно знаю как сделать, вопрос как правильно с точки зрения дизайна.

Расширить Post
или создать класс выше типа

class WiderPost {
$post = Post;
$data = ... // other data
}

и уже использовать так
$data = model->getPost(34);// в ответе содержится объект WiderPost с Post(34) и другими данными
LukiDuki1980 вне форума Ответить с цитированием
Старый 19.04.2015, 21:35   #8
Gorychev
Участник клуба
 
Аватар для Gorychev
 
Регистрация: 08.03.2008
Сообщений: 1,537
По умолчанию

Цитата:
запихнуть в Post я не могу, так как он отражает таблицу в бд.
В смысле отражает? Это типа ORM что-ли?
Цитата:
вычисляются еще данные
Что за данные?
Цитата:
$data = model->getPost(34);// в ответе содержится объект...
Да, классу где вызывается эта строка кода, должно быть фиолетово, что творится под капотом. Вы говорите, дайте мне всю инфу для поста с таким айди и все. А внутри, нужно разбивать на небольшие не связанные друг с другом классы, каждый из которых отдает свою долю информации если она слабо связанная или не связанная.

Последний раз редактировалось Gorychev; 19.04.2015 в 23:36.
Gorychev вне форума Ответить с цитированием
Старый 20.04.2015, 16:34   #9
LukiDuki1980
 
Регистрация: 19.04.2015
Сообщений: 5
По умолчанию

Версия вопроса 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 и с точки зрения нынешнего стиля фреймворков?
LukiDuki1980 вне форума Ответить с цитированием
Старый 21.04.2015, 18:02   #10
Gorychev
Участник клуба
 
Аватар для Gorychev
 
Регистрация: 08.03.2008
Сообщений: 1,537
По умолчанию

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
теоретический вопрос с предмета базы данных (есть варианты ответа) программирование Помощь студентам 0 20.09.2013 00:46
теоретический вопрос по базам данных (есть варианты ответа) программирование Помощь студентам 0 20.09.2013 00:30
Чисто теоретический вопрос strannick Microsoft Office Excel 5 17.11.2012 13:19
Вопрос о способе обмена сообщениями Beyounder Общие вопросы .NET 2 02.08.2009 00:40