Должен ли класс даты рождения / смерти быть составом или совокупностью для отдельного класса? - PullRequest
0 голосов
/ 10 мая 2019

Сущность - это личность.
Таким образом, у сущности есть дата рождения и, возможно, уже есть дата смерти.
Но эти даты могут или не могут быть сообщены (зависит от сущности и наличия информации);таким образом, у сущности может не быть ничего из этого.

Но я чувствую, что путаюсь с количеством элементов и типом отношения.

Как мне это представить?

Я создалабстрактный класс индивидуальный .Это приводит к 2 последним классам: Person (идентифицированное лицо) или Pseudonym (анонимное лицо).
Он связан с классом Дата рождения и классом Deathdate (оба обобщены как класс Date).

[Birthdate] ---- <> [Индивидуальное] отношение:
один (необязательно) -ко-многим (0..1 - 1 .. *)
0..1: потому чтоДата рождения может быть опущена, и у индивидуума может быть только одна дата рождения.
1 .. *: Поскольку дата рождения должна касаться хотя бы одной, но может касаться нескольких индивидуумов.

[Дата смерти] ---- <> [Индивидуальное] отношение:
один (необязательно) -ко-многим (0..1 - 1 .. *)
0..1: потому что человек не умери тем не менее может умереть только один раз.
1 .. *: потому что дата смерти должна касаться, по крайней мере, одного человека, но может касаться нескольких человек.

Но поскольку, теоретически, у всех есть дата рождения (идата смерти) меня соблазнила композиция.Но некоторые могут предпочесть сохранить эти даты в секрете, и я задавался вопросом, может ли состав позволить это.
Кроме того, одна дата может соответствовать нескольким лицам, и здесь также я предполагаю, что композиция невозможна тогда, ИЛИ иначе, это я сделал путаницу между индивидуальным классом.и его экземпляры (индивидуумы), а затем и Композиция были бы возможны, но не с вышеупомянутым количеством элементов.

В настоящий момент я выбрал это:

Aggregation :
___________                 _______________
|Birthdate|0..1-----1..*< >|               |
___________                | <<Individual>>|
|Deathdate|0..1-----1..*< >|_______________|

Но я колеблюсь с этим

Composition :
___________              _______________
|Birthdate|0..1-----1<#>|               |
___________             | <<Individual>>|
|Deathdate|0..1-----1<#>|_______________|

Какой правильный ответ?Спасибо за внимание.

1 Ответ

3 голосов
/ 10 мая 2019

Существует ряд проблем с этим подходом.

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

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

Если вы настаиваете на использовании класса для дат (например, если вы хотите иметь стиль «Рожденный на дату» в стиле Википедии)/ Коллекции «Умершие в дату»), вы должны создать только один класс Date и создать ассоциации с этим классом, очень похожие на то, как вы это делали во втором подходе.В такой ситуации множественность не работает «в стиле базы данных», но является свойством самой ассоциации.В конкретной ассоциации у вас есть одна дата рождения / смерть и одна персона.По умолчанию у вас будет две ассоциации 1-0..1, по одной для каждой, но в зависимости от подхода у вас также может быть гораздо более сложный подход.

Позже я добавлю диаграммы для большей ясности.

Последнее замечание.

Не используйте << >> в качестве имени класса.Они зарезервированы для обозначения стереотипов.Если вы хотите указать, что Individual является абстрактным, либо выделите его курсивом, либо (если ваш инструмент этого не позволяет) используйте <<abstract>> стереотип.

...