Какой шаблон наиболее близко соответствует детализированному сценарию и является ли это хорошей практикой? - PullRequest
5 голосов
/ 06 марта 2011

За последние несколько лет я видел определенную модель несколько раз. Пожалуйста, позвольте мне описать это.

В пользовательском интерфейсе каждая новая запись (например, сведения о новых клиентах) сохраняется в форме без сохранения в базе данных. Это явно сделано, чтобы не загромождать базу данных и не вызывать ненужных попаданий в базу данных.

Находясь в состоянии пользовательского интерфейса, эти объекты идентифицируются с помощью Guid. Когда они сохраняются в базе данных, связанные с ними направляющие не сохраняются. Вместо этого им назначается база данных Int в качестве их первичного ключа.

Форма может справиться со смесью извлеченных элементов из базы данных (используя Int), а также тех, которые еще не были зафиксированы (используя Guid).

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

Это Хорошая практика или нет? Может кто-нибудь сказать мне имя шаблона или предложить, если он еще не назван?

Ответы [ 3 ]

4 голосов
/ 16 марта 2011

Здесь используется пара шаблонов.

Шаблон поля идентификации

Определен в P EAA как " Сохраняет поле идентификатора базы данных вобъект для сохранения идентичности между объектом в памяти и строкой базы данных."Эта часть очевидна.

Сценарий транзакции и Отображение метаданных

Как правило, элементы управления ASP.NET DataBound используют что-то вроде шаблона Transaction Script в сочетании с шаблоном Matadata Mapping .Фаулер определяет отображение метаданных как «содержащую детали объектно-реляционного отображения в метаданных».Если вы когда-либо писали элемент управления источником данных, аспект сопоставления метаданных этого шаблона кажется очевидным.

Шаблон Transaction Script"организует бизнес-логику по процедурам, где каждая процедура обрабатывает один запрос из презентации".Чтобы инкапсулировать логику поддержания как состояния представления, так и состояния данных, промежуточному объекту необходимо указать:

  1. Если запись базы данных существует
  2. Как идентифицировать бэкэндзапись данных, чтобы заполнить элемент управления UI
  3. Как идентифицировать данные и элемент управления UI, если нет текущей записи данных, так что данные презентации могут быть обновлены из хранилища данных бэкэнда.

Наличие новой записи данных клиента Guid и записи данных integer Id предоставляют адекватную информацию для определения всего этого с помощью всего одного вызова базы данных.Этого можно достичь, просто используя целые числа (и, возможно, задавая уникальное отрицательное целое число для каждого элемента данных пользовательского интерфейса без учета изменений), но, вероятно, более явно иметь два отдельных поля.

Хорошая или плохая практика?

Это зависит.ASP.NET - довольно успешный программный проект, и этот шаблон, кажется, работает последовательно.Однако этот тип веб-элемента управления ASP.NET имеет очень специфическую область применения - для инкапсуляции взаимодействия между пользовательским интерфейсом и базой данных об объектах данных с помощью простых сопоставлений .Проблемы кажутся немного размытыми, но для многих применимых сценариев это все еще будет приемлемым.Шаблон действителен везде, где Row Data Gateway будет приемлемым.Если веб-элемент управления затрагивает более одной строки базы данных, этот подход не будет работать.В этих более сложных случаях лучше подойдет реализация Active Record или комбинация Domain Model и реализация Repository .

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

0 голосов
/ 06 марта 2011

Если я не ошибаюсь, это шаблон хранилища: http://martinfowler.com/eaaCatalog/repository.html

Это хорошо описано в книге Evans Domain Driven Design и доказало свою эффективность при определенных обстоятельствах.

0 голосов
/ 06 марта 2011

Я не думаю, что для этого есть конкретная модель.

Это хорошая практика?Я так не думаю.Во-первых, он не очень объектно-ориентирован.Как насчет:

interface ICommittable
{
    /// <summary>
    /// Gets or sets a value indicating whether the entity was already committed to the database.
    /// </summary>
    bool IsCommitted;

    /// <summary>
    /// Gets or sets the ID of the entity, used either in database or generated by UI or an underlying BL.
    /// </summary>
    Guid Id;
}

Вместо этого они смешивают три отдельные записи данных в одну неочевидным образом:

  • ID
  • Другой идентификатор (почему?)
  • Факт, что объект был зафиксирован или нет.

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

Если цель состояла в том, чтобы создавать новые объекты без запроса базы данных для нового идентификатора, они могли бы использовать GUID везде: когда новый объектсоздается, вы Guid.CreateNew это ID, затем, если нужно, вы фиксируете все, этот GUID также является идентификатором в базе данных (существует небольшая вероятность столкновения между уже сохраненными GUID и новым, так что я бы не сталвсе равно).

Гораздо проще, не правда ли?

Нелегко сделать несколько вещей.Например, как вы сравниваете две сущности?Помните, что:

  • Два подтвержденных объекта с разными идентификаторами GUID не равны,
  • Два не подтвержденных объекта с разными идентификаторами не равны,
  • Подтвержденный объектможет быть равным необязательному объекту, даже если их GUID и их идентификаторы будут отличаться.

В заключение, выглядит такотсутствие рефакторинга .Вероятно, они модифицировали проект, в котором сущности уже были идентифицированы в базе данных по их уникальному ключу id (int), поэтому вместо рефакторинга они просто добавили GUID, что в целом усложнило:

  • Более сложночтобы понять,
  • Очень трудно работать и изменять в будущем.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...