Какой из них верен для этой композиции?

#uml #associations #relationship #composition #class-diagram

#uml #ассоциации #взаимосвязь #композиция #диаграмма классов

Вопрос:

Я отвечаю на эту картинку композицией Car 0.1 — Engine 1.1. Это правда? Может кто-нибудь объяснить об отношении Car и Engine?

введите описание изображения здесь

Ответ №1:

Вопрос несколько сбивает с толку, поскольку в названии упоминается композиция, но не вопрос, на который вы пытаетесь ответить в синем поле.

Мы можем сделать вывод из утверждения в синем поле:

  • «A Car имеет ровно один Engine » означает 1 ..1 в Engine конце ассоциации.

  • Тот факт, что a Car имеет Engine и не является Engine , исключает вариант (c), поскольку обобщение представляет собой отношение is-a.

  • «An Engine имеет не более одного Car » означает 0 ..1 в Car конце ассоциации.

  • Но «максимум» подразумевает, что оно может быть меньше, поэтому, другими словами, вы можете иметь Engine значение с no Car . Это делает вариант (b) несколько двусмысленным, поскольку 1) композиция подразумевает, что она Engine принадлежит a, Car который отвечает за ее существование и хранение; 2) тем не менее UML позволяет удалять часть из композита и сохранять ее независимо (см. Примечание на стр. 110, разъясняющее этот момент); 3) носимвол композиции может ввести читателей в заблуждение относительно обязанностей в отношении отдельных частей.

Это оставляет нам варианты (a) и (d):

  • вариант (a) технически соответствует требованиям: композиция на этой диаграмме говорит, что Car не может существовать без an Engine , но Engine может существовать без a Car . Однако семантика композиции UML говорит, что это отношение часть-целое, где тогда Engine было бы целое и Car часть. Это бессмыслица, которая исключает вариант (a)
  • опция (d) технически соответствует требованиям: это нормальная 0..1 / 1..1 ассоциация. Открытая стрелка говорит о том , что по этой ассоциации можно перемещаться от точки Car к точке Engine . Остается неопределенным, можно ли перемещаться по ассоциации в противоположном направлении. Навигация — это дополнительная информация, которой нет в описании, но она не противоречит ему.

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

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

Комментарии:

1. Я не думаю, что утверждение, поскольку эта композиция требует, чтобы двигатель всегда принадлежал автомобилю. верно. Допустимо, чтобы UML имел кратность [0 ..1] на всем конце.

2. Тогда @GeertBellekens Мог бы, пожалуйста, объяснить, что сделало бы (d) непригодным с учетом единственного повествования в синем поле (абстрагирование от предвзятости, представленной в названии, и без ущерба для многих примеров композиции с автомобилями и двигателями, которые учитель продолжает преподавать, несмотря на то, что это не соответствует механической реальности) ?

3. Я согласен, что d) — лучший ответ, поскольку в вопросе вообще ничего не упоминается об ограничениях композиции, и я не думаю, что мы должны изобретать эти ограничения просто потому, что имена классов — это Car и Engine . Мы бы не говорили, что это должна быть композиция, если бы имена классов были Foo , и Bar все, что я говорю, это то, что причина, по которой вы исключаете b), неверна. Но, глядя на «классы» на изображении, я даже не уверен, что речь идет об UML.

4. Читая только повествование, мы также должны исключить d), поскольку нет причин включать навигацию от автомобиля к двигателю. Мы знаем только о множествах. Но я не вижу там опции «ничего из вышеперечисленного».

5. @GeertBellekens хорошо, я перепроверил композицию с 0 ..1, и действительно, вы были правы: в стандарте есть примечание, в котором говорится, что это разрешено. Я перестраховываюсь, поскольку существование такой заметки показывает, что этот особый случай может отличаться от обычно существующих ожиданий. Я соответствующим образом отредактировал свой ответ. Я все еще думаю, что (d) — лучший вариант, но я признаю, что (b) — допустимый вариант, но, возможно, не естественный выбор.