Чи розглядається точка на полотні, що є об'єктом у проекті, керованому доменом?

Я читаю на DDD і зустрічаю цей уривок:

Розглянемо програму для малювання. Користувачеві подається полотно і він може малювати будь-які точки і лінії будь-якої товщини, стилю і кольору. Корисно створити клас об'єкта з іменем Point, і програма може створити екземпляр цього класу для кожної точки на полотні. Така точка міститиме два атрибути, пов'язані з координатами екрану або полотна. Чи треба вважати кожну точку такою, що має ідентичність? Чи є у нього безперервність? Здається, що для такого об'єкта має значення тільки його координати.

Тепер я заплутався, питання

Чи потрібно вважати кожну точку такою? Чи є це безперервність?

Очевидно, що це питання не схвалення, тобто ми не можемо розглядати клас точок, клас сутності. Але до мого розуміння DDD, будь-який об'єкт з унікальною ідентичністю (в даному випадку координати точки) вважається сутністю.

The excerpt from "domain driven design quickly" book

2
Я намагаюся придумати корисну відповідь тут, але не виникає питання. Для точки в просторі її координати - це ідентичність. Якщо ви просто хочете зрозуміти, що робить автор (не потрібний каламбур), я думаю, що для цього немає достатнього контексту.
додано Автор JimmyJames, джерело
Думаю, він цього не робить. Я, напевно, не хотів би, але я не найкраща людина, щоб запитати про формальне визначення речей. З точки зору корисності, я б не розглядав точку об'єктної сутності, якщо ваша модель домену не має поняття точки. Зазвичай подібні речі використовуються для представлення вашої сутності, але не є однією в собі. Я вважаю, що модель домену є дуже абстрактною. Спроба розробити ваші доменні сутності, на основі яких об'єкти мають ідентичність, здається повністю назад.
додано Автор JimmyJames, джерело
Я не думаю, що автор вважає, що цей пункт є класом сутності.
додано Автор David Nathan, джерело

5 Відповіді

Сутність має концепцію ідентичності, яка не залежить від її вартості.

Для поняття Point знаходяться два окремі точки-точки Point (x: 1, y: 2) і Point (x: 1, y: 2) ) вважається таким самим?

  • Якщо вони сутності , то точки можуть мати різні ідентичності, а потім будуть різними.
  • На практиці точка, ймовірно, буде ідентифікована його координатами. Тоді дві точки будуть рівними. Справа є тип значення , а не право.

Тепер ми можемо використовувати інше подання. Точки не містять координат, але зберігаються в певній координаті, наприклад. raster [1] [2] = Точка() . Чи розглядаються два точкових об'єкта Point() і Point() ?

  • Кожен екземпляр точки може тепер представляти іншу координату, тому вони можуть бути різними.
  • Якщо вони були типами значення, всі вони будуть однаковими, оскільки вони порожні.

Отже, чи концепція моделюється як сутність або тип значення, залежить від контексту, а іноді й від решти моделі.

Суб'єктам часто дають (синтетичний) ідентифікатор, щоб відстежувати їх. На мові програмування це може бути розташування пам'яті об'єкта, але це лише ідентифікатор перехідних процесів. Найчастіше генерується явний ідентифікатор, наприклад, для використання в якості первинного ключа в базі даних - хоча концепція бази даних “сутностей” дещо відрізняється.

8
додано

На перший погляд здавалося, що це дуже очевидна відповідь. Але найбільш очевидні речі іноді найважче пояснити :-)

Приведемо ваш приклад програмного забезпечення для малювання. Припустимо, у вас є дві форми: червоне коло (C) і синя лінія (L) , яка перетинається, і уявіть, що Point матиме ідентичність, яка однозначно визначається його координатами:

  • First consider that Point has no other attributes than its coordinates:

    If there are no other attributes, and the coordinates are the identity, then there is no continuity of the identity, because whatever you change on a Point, you'd loose the identity.

  • Then, take one of the two intersection points of (C) and (L) and call it M:

    The identity of M should define the other attributes of Point such as for example Color. But what would the unique Color of M be: red because (C) was drawn first ? blue because the (L) was drawn last ? purple because it's the addition of red and blue ? Or does the color associated to the point depend of the shape you consider the point in ? In the first case, the point seems to have a fuzzy identity. In the later case the point would have several identities (id would require more than the coordinates).

  • Then, let's have a second look on the continuity of the identity:

    The red circle has it's own identity: it is defined by its name, (C). And beside it's center and radius, it is also composed of a set of points that satisfy a mathematical relationship. What happens if we move (C) ? Its identity has not changed, so it's the same circle, just with another center. As it's the same circle and its points have an identity, and as we have a whole/part relationship we would expect to keep the same set of points and just move them, shouldn't we ? But every point we move looses its identity !

Все це показує нам, що якщо б точки мали ідентичність, ми мали б пару суперечностей і невідповідностей (або принаймні контр-інтуїтивних ситуацій). Саме тому краще розглядати пункти як ціннісні об'єкти в цьому прикладі. Ось визначення:

ENTITY Об'єкт, який визначається не своїми атрибутами, а a   нитка безперервності та ідентичності.

     

ОБ'ЄКТ ЗНАЧЕННЯ Об'єкт, який описує деяку характеристику або атрибут   але не має поняття ідентичності.

     

- Ерік Еванс

3
додано

Це залежить від вашої моделі.

Припустимо, що програма для малювання подібна до MS Paint. Тоді у вас буде документ, який є растровим. Пікселі в бітовій карті пофарбовані відповідно до дій користувача. Немає точкових об'єктів, є лише одна растрова карта, яка змінюється, коли користувач виконує свої малювання.

Тепер припустимо, що програма для малювання схожа на Scribble. Ви, можливо, не знаєте Scribble, в каракулі документ - це серія штрихів. Один штрих складається з серії точок.

У другій моделі у вас будуть точки "об'єкти". Хоча ви можете реалізувати їх як типи значень, ви будете стежити за окремими точками, і вони будуть зберігатися як точки, пункти будуть (де) серіалізовані. Точки з різних мазків можуть мати однакові координати, але вони будуть різні окремі об'єкти.

У моделі Paint розташування пера може бути об'єктом, тоді як кольоровий піксель не може бути представлений об'єктом. Все залежить від контексту (хто піклується про цей об'єкт, чи буде він мати мету?). Ви можете розпізнати об'єкт в кожній деталі, але в якийсь момент ви повинні припинити моделювання, тому що ваша проблема вирішена, а висунення дизайну OO більше не є метою. Потім вона може навіть погіршити застосування програми через надмірне використання ресурсів або проблеми з продуктивністю.

1
додано

Вибір створення об'єкта типу об'єднання або типу значення повністю довільний.

Очевидно, ви могли б мати додаток для малювання, де ви перетягуєте точки навколо і потрібно мати дві різні точки з однаковою координатою.

Або «здогадайтеся», коли дві «люди» з однаковими властивостями є однією людиною.

Типи значень і сутностей є реальними речами в коді, але ви не можете сказати з цього виду короткого опису вимог, який був би кращим вибором для різних дієслів

1
додано

You can "identify" value objects by their values!  However, they are immutable.  Two identical value objects are the same value.  If you want another value you just create it — you don't have to tell anyone.  In and of themselves, values are not captured authoritatively; they don't represent system state.

We generally don't catalog mere values on their own in a database (table), because such a value's key/identity would be all its attributes.  (And also because what would you put in the table: all possible values?)  Using such a value from another table would just repeat the whole thing in the foreign key.

Сутність, з іншого боку, є (як правило, змінна) асоціацією стабільного ідентифікатора і інших значень (та/або інших об'єктів, наприклад, їх ідентифікаційних значень).

Values don't mean anything on their own, whereas entities make assertions or statements of fact on the record, that there is this thing that currently is recorded to have these particular attributes.  Such statements are collected and captured and compose into system state.

Taking a point as an example, let's expand it to include a color.  Now we can look at one such colored point as a mere value in the space of all possible colored points — treated as such that makes a colored point a value.

Or, we can look at a colored point as a point identity associated with a particular color — as a matter of record — as a matter of captured system state — that is captured by a designated authority.

Повноваження, такі як конкретна таблиця в конкретній базі даних, або колекція в пам'яті або інша структура даних, призначена для цього захоплення, наприклад, полотна.

Різниця полягає в тому, чи ми авторитетно фіксуємо таку кольорову точку як виписку запису, що означає, що якщо я кажу, що ця точка 1,2 має цей колір, синій, то будь-який інший колір для цієї конкретної точки повинен вважатися неправдивим, або вимагати зміни у стані системи запису.

Treated this way, the colored point is an entity — because we are capturing the current value of the entity.  Given an authority, we can ask: what is the current color of 1,2?  We can't do that with mere values alone — there is no authority to ask!

Крім того, інший колір для цієї самої точки не може одночасно співіснувати, тому призначення іншого кольору цьому об'єкту вимагає формального (транзакційного) оновлення формально захопленого, авторитетного стану системи.

Коротше кажучи, кольорова точка - це лише значення, якщо воно не знаходиться в контексті повноважень, що фіксує поточний колір одиниць точки.

Чи розглядається точка на полотні, яка розглядається як об'єкт у проекті, керованому доменом?

Так, якщо ви розглядаєте полотно як авторитет і систему запису, що, з точки зору DDD, спілкується зі світом за межами обмеженого контексту щодо ідентичностей точок, як їх власний сукупний корінь у загальному полотні, або як прикріплені кілька полотен до інших сукупних коренів.

Each point is conceptually an entity on the canvas — but that doesn't necessarily mean that each point needs to be manifest as its own object instance: there are lots of possible (better) implementations.

0
додано