Бинарная ассоциация класса(Прочитано 6324 раз)
У меня из-за нее изучение UML остановилось и закралась крамольная мысль: UML сознательно основан на противоречивых концепциях. Весь вопрос состоит в бинарной ассоциации класса с самим собой. Чем больше я думаю над этим, тем менее понятным вопрос становится. Пока додумался до того, что ассоциация на одном классе отличается от ассоциации между двумя классами как небо от земли.

Я изучаю UML по книге Рамбо, Блаха "UML 2.0 Объектно-ориентированное моделирование и разработка" 2е издание. В ней авторам все настолько ясно с ассоциациями на одном классе, что они вообще на этом не запинаются и рассказывают походя, как о само собой разумеющеемся понятии, просто как об обычной ассоциации. Я же не могу никак ответить на простые вопросы касающиеся таких самоассоциаций. Для ассоциаций между двумя классами я нахожу ответы на все эти вопросы без проблем, а для самоассоциаций не могу. Вопросы такие:

1) Авторы книги прямо указывают: "Имена полюсов ассоциации обязательны для установления ассоциаций между двумя объектами одного и того же класса". Значит каждый объект участвующий в ассоциации должен иметь 2 полюса? или 1? если 1 то какой именно, если один обозначить именем "A", а другой именем "В"? или может 0 полюсов?

2) Возможно ли представить (нарисовать) структуру самоассоциации с кратностями 1-2
3) Если моделировать дерево самоассоциацией, то объекты верхнего уровня будут иметь 1 полюс (скажем для определенности "А"), объекты в середине иерархии будут иметь 2 полюса ("A" и "B"), а объекты листья только полюс "В", а впрочем, может полюс "A", а не "В". Это нормально? Так ли это?

4) Обязательно ли ставить кратность 0 с одного полюса самоассоциации, чтобы объект мог иметь 1 полюс для связи? А если переместить 0 в кратности с одного полюса на другой что изменится?

5) Я не могу решить упражнение 3.1 из книги (которое позиционируется как легкое). У меня получается 2 разных ответа в предположении, что добавляя к кратности 0 можно уменьшать число полюсов у объекта. И 2 других варианта ответа, в предположении, что не указывая 0 можно у некоторых объектов подразумевать 1 только полюс и 2 у других. Обратной проверкой убеждаюсь, что все 4 варианта ответов приводят к правильному воссозданию исходной картинки этого упражнения. Значит все решения верные.
Шиза в общем. Рисунок с задачей прилагается.

6) Может это не класс имеет полюс ассоциации, а ассоциация связывает свой полюс с классом (связь соответственно с объектом), однако все вопросы остаются, достаточно поменять слова.

7) Как пользуются такими самоассоциациями люди ведущие UML проект? Что имеют ввиду когда указывают кратности? Какие объекты хорошо подходят под такое понятие?

8) Вообще, существует ли точное понятие этих штук или нет и неоднозначности нельзя избежать? Если нельзя, зачем применять? Если можно, то как?

в моем тексте: самоассоциация == бинарная ассоциация на одном классе
« Последнее редактирование: 28 Февраля 2009, 00:44:31 от Денис Бесков »



Думаю, следует считать, что полюс ассоциации относится именно к ассоциации, а не к классу или объекту. Т.е., говорить 'объект такой-то имеет полюс такой-то' вряд ли верно. Более правильно - объект А связан с объектом В.
Вашими словами:
Цитировать
не класс имеет полюс ассоциации, а ассоциация связывает свой полюс с классом
Цитировать
все вопросы остаются
Почему остаются? 1 и 3 уходят сразу.
М.б., более наглядный пример в той же книге, рис. 12.13. (прошу прощения, приводить здесь сейчас не буду - рисовать некогда)



1)Авторы книги прямо указывают: "Имена полюсов ассоциации обязательны для установления ассоциаций между двумя объектами одного и того же класса". Значит каждый объект участвующий в ассоциации должен иметь 2 полюса? или 1? если 1 то какой именно, если один обозначить именем "A", а другой именем "В"? или может 0 полюсов?
Присоединяюсь к тому, что Вам уже написали что полюса относятся к ассоциации, не к объектам. Замечание из книги следует понимать так, что имена полюсов позволят различить, кто есть кто. Скажем, если у нас класс -- звено списка, то полюса укажут какое звено предыдущее, а какое следующее.

2)Возможно ли представить (нарисовать) структуру самоассоциации с кратностями 1-2
Возможно (хотя, на мой взгляд, говорить "структура самоассоциации" неправильно). Допустим, класс называется ВершинаГрафа, с указанными кратностями мы опишем подвид графов, у которых из каждой вершины выходит (и в каждую вершину входит) 1-2 дуги. Если я правильно понял, что кратность вы приписали обоим полюсам.

3)Если моделировать дерево самоассоциацией, то объекты верхнего уровня будут иметь 1 полюс (скажем для определенности "А"), объекты в середине иерархии будут иметь 2 полюса ("A" и "B"), а объекты листья только полюс "В", а впрочем, может полюс "A", а не "В". Это нормально? Так ли это?
Дерево, видимо, бинарное? В рамках Вашей терминологии правильно все, за исключением того, что у корня нет предка, значит, полюс "предок" может иметь кратность 0, а у листа нет ни одного потомка (хотя, никто не мешает спроектировать бесконечное дерево, если его не придется реализовывать) -- значит, в конечном дереве полюс "потомок" может иметь кратность 0.

4)Обязательно ли ставить кратность 0 с одного полюса самоассоциации, чтобы объект мог иметь 1 полюс для связи? А если переместить 0 в кратности с одного полюса на другой что изменится?
Необязательно. Закольцованный список можно представить звеном с "самоассоциацией" кратности 1 с обоих полюсов. Изменится что-либо или нет от "перемещения кратности" зависит от семантики связи. Скажем, от перемены мест слагаемых результат не меняется, а если делитель поменять с делимым -- частное будет другим, в таком аспекте.

5)Я не могу решить упражнение 3.1 из книги (которое позиционируется как легкое). У меня получается 2 разных ответа в предположении, что добавляя к кратности 0 можно уменьшать число полюсов у объекта. И 2 других варианта ответа, в предположении, что не указывая 0 можно у некоторых объектов подразумевать 1 только полюс и 2 у других. Обратной проверкой убеждаюсь, что все 4 варианта ответов приводят к правильному воссозданию исходной картинки этого упражнения. Значит все решения верные. Шиза в общем. Рисунок с задачей прилагается.
Вы подходите к решению слишком буквально. Я бы дал ответ, в котором любая страна граничит с 0..* странами и с любой страной граничит 0..* стран. Как знать, к чему приведет глобализация, рост ЕС, НАТО и проч. :)

6)Может это не класс имеет полюс ассоциации, а ассоциация связывает свой полюс с классом (связь соответственно с объектом), однако все вопросы остаются, достаточно поменять слова.
Хрен редьки... Ассоциация связывает классы. Полюса позволяют различать между собой связанные экземпляры классов.

7)Как пользуются такими самоассоциациями люди ведущие UML проект? Что имеют ввиду когда указывают кратности? Какие объекты хорошо подходят под такое понятие?
В книжке Рамбо все сказано, прочтите внимательно.

8)Вообще, существует ли точное понятие этих штук или нет и неоднозначности нельзя избежать? Если нельзя, зачем применять? Если можно, то как?
Все будет хорошо! ;)




 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19