MVC: полностью заполненные модели или частично заполненные модели?

10

Этот преследовал меня так долго. Когда вы занимаетесь программированием MVC, что вы считаете лучшей практикой программирования? Следует ли использовать полностью заполненные модели или частично заполненные, особенно когда я знаю, что для этой конкретной задачи мне понадобятся только 2 поля из объекта модели, который имеет 5 других?

Иногда кажется просто преступным заполнять список из 20 объектов модели всеми значениями из базы данных, когда вы знаете, что вам понадобятся только некоторые из них.

Конечно, частичная модель означает, что вам придется написать еще один метод в вашем DAO, кроме того, который выбирает все. Что означает больше кода для поддержки?

С другой стороны, извлечение всего из БД с полностью заполненными моделями означает, что один метод обслуживает все, но это, очевидно, приведет к снижению производительности.

Я вижу, что ORM (например, Hibernate или ActiveRecord of Rails) одобряет тенденции в программировании MVC, а базы данных, такие как полные модели Google BigTable, является принятой тенденцией. Но что, если вы все еще используете старый добрый JDBC?

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

Притам Бархате
источник
1
«С другой стороны, извлечение всего из БД с полностью заполненными моделями означает, что один метод обслуживает все, но это, очевидно, приведет к некоторому снижению производительности». Правда? Вы измерили какие-либо издержки производительности от этой практики?
S.Lott
>> На самом деле? Вы измерили какие-либо издержки производительности от этой практики? << - Я ожидал этого. Нет, не имею Но было бы интересно измерить и быть доказанным неправильно в противном случае.
Притам Бархате
Трудно доказать, что накладных расходов не существует. Вы можете легко расспросить множество деталей, утверждая, что измерения не подходят для некоторой ситуации. Гораздо приятнее, если вы используете свою «типичную» настройку базы данных, язык приложения и т. Д. И профилируете предпочитаемую конфигурацию, чтобы показать, каковы фактические издержки, чтобы нам не приходилось спорить с различными факторами, которые мы оставили в наших измерениях. ,
С.Лотт
1
Я нашел отличную статью, в которой рассматривается вопрос о том, как разоблачить модель вашего домена и отправить DTO, по адресу msdn.microsoft.com/en-us/magazine/ee236638.aspx .
Майо

Ответы:

3

У вас есть два варианта:

1) Оставьте некоторые поля в модели незаполненными

2) Создайте дополнительную «облегченную» модель для вашей конкретной ситуации

Какой из них выбрать, снова зависит от двух вещей:

а) Сколько полей "полной" модели будут игнорироваться

б) Как часто эта «облегченная» модель будет создаваться

Если есть только пара или более полей, которые могут быть незаполнены, можно перейти к 1).

Если b) является исключительно исключительной индивидуальной ситуацией, возможно, нет смысла создавать дополнительную модель только для одного варианта использования.

Другой подход заключается в определении «облегченной» модели и наследовании от нее «полной» модели.


источник
Спасибо за ответ. Имеет смысл сделать облегченную модель в зависимости от необходимости. Но иногда мне интересно, не создаст ли такая стратегия слишком много модельных классов? Особенно, если я делаю модели, специфичные для представлений, а не модели, специфичные для бизнес-логики.
Притам Бархате
3

Если вашему представлению нужны только 2 свойства из модели, то у вас (вероятно) неправильная модель для этого варианта использования! Я хотел бы создать модель, соответствующую виду, сохранить дополнительные поиски в БД и заполнить только те данные, которые вам нужны. Если последующее представление требует более подробной информации, то вам нужно спросить, получить ли я дополнительные данные позже, или я должен получить все это заранее ...

В качестве альтернативы вы можете взглянуть на какую-то ленивую оценку, поэтому значения заполняются, когда они вам нужны. Это может хорошо работать, но, очевидно, требует больше работы и может привести к многократным обращениям к БД, что не очень хорошо, если вы в конечном итоге делаете это много.

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

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

Стив
источник
2
>> Если вашему виду нужны только 2 свойства из модели, значит, у вас неправильная модель! << - Не нужно беспокоиться всегда. Типичный случай показывает список результатов поиска в бизнес-приложениях. Например, в CRM - клиенте - в основном одно будет показывать только имя и одно или 2 важных поля в списке поиска. Но у CRM будет довольно много других областей, связанных с этим клиентом.
Притам Бархате
1
Вопрос говорит, что в этом случае нужны только 2 свойства.
Стив
-2

Модель не является DAO.

И еще: если вы скажете, что у вас 20 моделей (по вашему примеру, клиенты), то это не модель MVC. Модель предметной области не отображается напрямую в одну строку таблицы. Вместо этого он должен нести ответственность за все операции, выполняемые с вашими «клиентами».

В вашем примере «Клиент» - это не модель предметной области, а просто объект внутри модели.

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

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