Должна ли быть ассоциация для базового класса, когда это подразумевается? - PullRequest
2 голосов
/ 08 мая 2020

Я пытаюсь сделать диаграмму классов UML для очень простого сценария. Рассмотрим следующий код: List<Food> foods = {new Tomato(), new Pizza()}; как поле для класса A. Ясно, что класс A имеет связи между помидорами и пиццей, но должна ли он также иметь связь между едой?

Конечно, помидоры и пицца происходят от Еда :)

Ответы [ 3 ]

2 голосов
/ 08 мая 2020

Использование дженериков, таких как List<Food>, всегда является проблемой в UML, поскольку семантика дженериков не одинакова для разных языков программирования.

Здесь поле foods класса A означает, что существует навигационная ассоциация от A до Food. А Tomato и Pizza - это специализации из Food (на основе использования вами термина « расширить »):

UML class diagram

Дополнительные примечания:

  • Связь с Food , потому что тип List<Food> и нет прямой связи между A и Tomato или Pizza.

  • Имейте в виду, что диаграмма классов показывает общую картину, а - конкретный c сценарий с отдельными объектами (это было целью первого схема объекта ).

  • Использование списка сообщает, что ассоциация может быть с be 0 или более Food. Но мы не знаем, может ли один объект Food использоваться несколькими A или нет (несколько теоретически возможно, если Food будет ссылочным типом): поэтому множественность не указана на стороне A.

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

  • В зависимости от того, что вы хотите выделить в своем дизайне в ассоциации A -to- Food:

    • , вы можете предпочесть точечная нотация на конце Food, если вы хотите подчеркнуть, что ассоциация (также известная как список) принадлежит A
    • , вы можете просто использовать нотацию как на моей диаграмме, если вы меньше заботитесь о текущей реализации и просто хотите express, доступ к Food из A должен быть простым.
    • вы не можете показывать ничего из вышеперечисленного, если хотите, чтобы эти темы оставались открытыми.
1 голос
/ 08 мая 2020

Я бы сказал, что ваш ClassA имеет структурную связь (ассоциацию) с Food.

Поскольку он также вызывает конструкторы Tomato и Pizza, он имеет зависимость от этих классов.

1 голос
/ 08 мая 2020

Без подробностей это сложно.

Ваш food - это ассоциация множественности 0..n.

И Tomato, и Pizza не имеют явной связи в этом коде. Так что это просто зависимость.

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

Как сказано: все зависит от шаблона дизайна, детали из шаблона должны быть более мускулистыми .

...