С Новым годом! Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/16: Рейтинг темы: голосов - 16, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 28.01.2014
Сообщений: 10

ViewModel. Обертки поверх Domain Model для передачи в пользовательский интерфейс. Best practice

23.03.2019, 04:18. Показов 3281. Ответов 2

Студворк — интернет-сервис помощи студентам
Вопрос знатокам проектирования 3-layer и n-layer приложений. Встал вопрос о передачи не самой модели в пользовательский интерфейс, а передача оберток поверх данной модели. А именно проблема в следующем. Предположим есть класс доменной модели EntrantApplication.

C#
1
2
3
4
5
6
7
8
9
10
11
namespace EntrantWEB.DomainModel.EntrantApplication
{
    public abstract class EntrantApplication
    {
        public long? ID { get; set; }
        public long PersonID { get; set; }
        public RegNumber RegNumber { get; set; }
        public CompetiveGroup CompGroup { get; set; }
 
    }
}
У данного примерочного класса будут наследники. Сам класс внутри будет очень сложным ( Данных будет не счесть. Кроме всего прочего некоторые объекты внутри этого класса должны создаваться сложным образом. Например при создании объекта RegNumber придется обратиться к БД). Кроме всего прочего будет создана Абстрактная фабрика отвечающая за создание конкретного экземпляра данного типа. Так как потом обязательно пойдет параллельная иерархия классов. То есть перед нами появляется семейство объектов.

Хорошо когда сам объект уже загружен из БД и его можно отдать пользовательскому представлению. Но, что если форма редактирования данного объекта была открыта на создание данного объекта класса EntrantApplication. При этом мне необходимо соблюдать все бизнес правила по созданию и содержанию этого объекта (ага, Domain Drive Design). То есть сам объект создается только через фабрику так как есть необходимость в поддержании всех необходимых сложных бизнес правил.
Как вариант можно написать оберточный класс прокси, который будет замещать реальный объект. Поиск по интернету натолкнул на такую вещь как ViewModel классы.
Необходимо решить следующие вопросы:
  1. Представление классов замещающие реальные объекты
  2. Best practice подобных классов
  3. ViewModel классы со сложной логикой отображения. Например реагирование на сложные события.
  4. Какой слой приложения возьмет на себя обязанности по конвертации из модели в обертку и кто возьмет на себя обязанность по сложным манипуляциям пользователя.
  5. Проблема распухания списка параметров передаваемых в фабрику.
  6. Проблема распухания проекта из-за похожих друг на друга классов
  7. Целесообразность и трудозатраты по содержанию параллельной иерархии подобных классов

В общем все вопросы сводятся к одному: Проблема ПРЕДСТАВЛЕНИЯ и МОДЕЛИ и их взаимодействие .
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.03.2019, 04:18
Ответы с готовыми решениями:

Model или ViewModel?
Скажите пожалуйста если класс не используется в качестве DataContext-а ни в одном представлении, но во ViewModel-и есть коллекция объектов...

Пользовательский интерфейс для БД
Доброго времени суток. Имеется БД MYSQL. К ней необходимо разработать 2 вида пользовательского интерфейса: оконный(Windows) и Web. ...

Уведомления ViewModel при изменении Model
Простейшая программка в аттаче. Вопрос: если свойство во VM завязано так: private DataModel DM; public string SomeText { get { return...

2
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
23.03.2019, 15:31
Цитата Сообщение от regeditx86 Посмотреть сообщение
Предположим есть класс доменной модели EntrantApplication.
Я не понял назначения этого класса. Если он описывает некую сущность, то почему он должен быть очень сложным? Разве класс "компьютер" должен содержать описание технологии штамповки корпуса?

Цитата Сообщение от regeditx86 Посмотреть сообщение
Но, что если форма редактирования данного объекта была открыта на создание данного объекта класса EntrantApplication.
Форма редактирования должна соответствовать тому, что пользователь видит на экране, а не тому, что хранится в БД. За конвертацию отвечает контроллер или презентер и т.п.

Цитата Сообщение от regeditx86 Посмотреть сообщение
Кроме всего прочего будет создана Абстрактная фабрика отвечающая за создание конкретного экземпляра данного типа. Так как потом обязательно пойдет параллельная иерархия классов.
Шаблон "абстрактная фабрика" не предполагает параллельной иерархии. Иерархия конкретных фабрик независима от иерархии создаваемых объектов (это иерархия семейств). Если я правильно понял Вашу задачу, Вам фабрика не нужна (у Вас нет различных семейств объектов).
0
Эксперт .NET
 Аватар для Usaga
14103 / 9320 / 1349
Регистрация: 21.01.2016
Сообщений: 35,015
25.03.2019, 21:00
regeditx86, описанный класс не выглядит моделью предметной области. Это галимая структура хранения, от которой веет Entity Framework'ом. Оттуда и видимость мнимой "доменности".

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

Я вам рекомендую оставить структуры хранения в первозданном виде, максимально простыми и близкими к тому, как оно выглядит в БД.

Я вам рекомендую завести настоящую модель предметной области. Не анемичные огрызки с фабриками сбоку, а нормальную модель - с данными и методами работы с ними. С этими же моделями, очень часто, представления вполне могут работать напрямую, ибо модели сразу предоставляют бизнес-логику, которую представления рисуют пользователю в UI.

ViewModel'и заводить имеет смысл, если нужно какую логику уровня представления изолировать в отдельном месте и когда с моделью напрямую работать не совсем удобно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.03.2019, 21:00
Помогаю со студенческими работами здесь

Паттерн Domain Model
Есть у кого нибудь нормальное описание и рабочие примеры данного паттерна? На C#

Как правильно изменять свойства Model из ViewModel?
Есть модель с 10 свойствами. Есть VM так же с 10 свойствами, дублирующими модель. Есть (некое) хранилище модели, откуда можно её получить...

Пользовательский интерфейс для программы в Delphi 7
Привет, всем форумчанам есть не большая просьба помогите сделать пользовательский интерфейс для программы т.е развернуть свернуть...

Пользовательский интерфейс на C# для sql server 2008
Делаю пользовательский интерфейс для MS sql на C#. создал базу на MS sql server 2008, в C# зашёл в данные -> новый источник данных всё...

Пользовательский интерфейс для работы с типизированным файлом
Подскажите идею пользовательского интерфейса для работы с типизированным файлом. Функции: Открывать, Изменять, Сохранять.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru