Что такое «постоянство невежества»?

Непонимание постоянства обычно определяется как способность сохранять и извлекать стандартные объекты .NET (или POCOs, если вы действительно настаиваете на предоставлении им имени). И, казалось бы, хорошо принятое определение стандартного объекта .NET :

«… обычные classы, где вы сосредоточены на проблемах бизнеса, не добавляя вещи по причинам, связанным с инфраструктурой …»

Тем не менее, я вижу, что люди, описывающие NHibernate в качестве структуры, которая позволяет игнорировать постоянство, и тем не менее это структура, которая не может работать ни на одном стандартном объекте .NET, только стандартные объекты .NET, которые придерживаются определенных требований к дизайну, например ( источник ):

  • Все classы должны иметь конструктор по умолчанию
  • Некоторые функции не работают, если classы не вскрыты, а все члены являются виртуальными
  • Идентификация объекта не работает должным образом, если вы не злоупотребляете Equals / GetHashCode

(Кроме того: прежде чем кто-либо расстраивается, я не собираюсь выбирать NHibernate здесь, это просто часто цитируемый пример структуры, которая якобы допускает незнание незнания. Я уверен, что аналогичные аргументы могут быть применены к другим ORM, которые утверждают, что те же .)

Теперь, хотя class сам по себе не имеет каких-либо атрибутов или базовых classов, связанных с сохранением структуры, для меня это на самом деле не является «упорством невежественным», потому что он должен следовать набору руководящих принципов проектирования, чтобы облегчить использование выбранной каркасом сохранения. Вы должны проектировать и внедрять class с учетом требований постоянной структуры; если вы не знаете об этом, class может не работать с ним.

Там, где у меня возникают проблемы с определением «persistence ignorance» / «POCO», я не вижу, как это принципиально отличается от добавления таких атрибутов, как [Serializable] или [DataContract] или [XmlType] или любые другие annotations, относящиеся к сохранению, которые облегчают сохранение и извлечение объекта, использующего эту структуру.

Итак, что же такое «постоянство невежества»?

Понятно, что определение его как способного выдерживать «обычные classы» является ошибкой, потому что NHibernate являются только обычными, поскольку не ссылаются на classы, специфичные для каркаса, тогда как они необычайны, поскольку они требуют необычных вариантов дизайна, таких как конструкторы по умолчанию и все -виртуальные элементы и реализации Equals / GetHashCode на изменяемых типах.

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

Я бы сказал, что, как и большинство вещей, это скользящая шкала. Есть вещи, которые мы делаем, которые хотят иметь свойство настойчивости. На одном конце шкалы находится эта вещь, имеющая все кишки, зависимости и код, которые созданы на заказ, чтобы сохранить только одну вещь в своем конкретном ключе. На другом конце шкалы – это что-то, что просто волшебным образом происходит, без нашего использования гораздо больше, чем добавление маркера или установка свойства где-то, что заставляет эту вещь «просто упорствовать». Чтобы добраться до магической стороны шкалы, существуют frameworks, руководящие принципы проектирования, соглашения и т. Д., Которые помогают магии в происходящем. Я думаю, вы могли бы утверждать, что может быть создан инструмент, который имел бы меньше требований и ограничений, чем NHibernate, но преследовал ту же цель; что гипотетический инструмент будет дальше по нашему масштабу.

Я не знаю, что мне так нравится термин «постоянство невежества»; его действительно о том, что объект не осведомлен о реализации, резервном хранилище, кеше, что-то вроде того, что объект обычно знает о том, является ли он постоянным. Но это всего лишь семантика.

Я не верю, что ваше понимание (или определение) «Persistence Ingorance» неверно.

Реальная проблема заключается в протекающих абстракциях . Проще говоря, существующая технология очень затрудняет реализацию настоящего PI.

Я согласен с Mikeb – «незнание стойкости» является скользящей шкалой, а не истинной / ложной собственностью данного ORM.

Мое определение истинного 100% PI было бы в том, что вы могли бы сохранить ЛЮБОЙ возможный class POCO, независимо от того, насколько он был запутан и связан с другими classами, никоим образом не изменяя class.

Добавление полей ИИ, декорирование с помощью атрибутов, наследование из classов ORM, необходимость разработки ваших classов, чтобы они хорошо отображались в базовых таблицах в RDB – все это уменьшает «показатель PI» ниже 100%.

Это говорит о том, что я выбрал использование Fluent NHibernate Automapping, потому что он, по-видимому, имеет самую высокую оценку PI любого из вариантов ORM, на которые я смотрел.

Я бы согласился с вашим определением:

Поэтому разумно ли говорить, что «незнание персистентности» истинно, когда объекты облегчают использование структуры персистентности, но сами не выполняют какую-либо логику сохранения?

Код (в отличие от атрибутов) в ваших classах не имеет признаков, присущих персистентности. Конструкторы по умолчанию могут потребоваться для сохранения, но не имеют кода, который на самом деле выполняет постоянство. Уровень персистентности можно было бы существенно изменить, можно было бы использовать различные базы данных, и бизнес-логика осталась бы неизменной.

Постоянный неосведомленный class – это class, который не привязан к структуре упорства.

То есть, class абсолютно не знает, что существует инфраструктура persistancy, она не наследуется от classа, который определен этой структурой, и не реализует интерфейс, который необходим для этой инфраструктуры persistance для работы.

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

Хотя class в вашей модели домена (прозрачно сохраняющийся с NHibernate) должен иметь конструктор без аргументов, чтобы его можно было построить «динамически», не обязательно иметь определенный базовый class, продиктованный структурой, и не требуется или переопределить определенные определенные инфраструктурой методы.

На мой взгляд, «постоянство невежества» – это свойство вашей модели (модель домена, бизнес-модель или все, что вы можете называть ее). Модель является непротиворечивой, поскольку она извлекает экземпляры сущностей, содержащихся в абстракциях (иногда называемых репозиториями). Эти абстракции могут быть реализованы с использованием ORM напрямую, но, как вы сами заявляете, это иногда может добавить требования к объектам, которые, естественно, не принадлежат вашей модели. Поэтому я бы не сказал, что модель, которая придерживается некоторых требований конкретной ORM, остается на 100% неoutlookируемой.

вы можете реализовать несовместимость persisrtence с помощью classа для домена или вашего приложения и classа POCO в сохранении, когда вы собираетесь сохранить карту объекта домена в свой class персистентности и использовать объект persistence для хранения с помощью nhibernate o другой структуры

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

эти правила персистентности могут быть в вашем classе персистентности.

Давайте будем гением компьютера.