Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Диаграмма классов. Нужен совет. 
:(
    Опции темы
TGrey
Дата 29.12.2010, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: нет
Всего: 1



Добрый день, нужен совет по разработке Диграммы классов. Я ее сделал, но преподаватель выразил свое не согласие, нужно исправить, хочу уточнить, как будет правильнее.
user posted image
Вот моя диаграмма.
Выходит, что класс CMap. Отвечает и за саму карту и за ее отрисовку. Тут нужно создать новый класс, который будет рисовать. Вопрос такой, этот класс лучше сделать частью формы с отношением Композиция. Либо частью класса CMap тоже композицией. Или его еще куда можно засунуть?
Тут возникает следующий вопрос на моей диаграмма видно, что класса Enemy и Player так же через композицию относятся к классу CMap. Это как бы по своей сути верно, но у меня оно реализовано так, что функция которая проверяет может ли игрок походить в случае если может, то изменяет этот массив, который находится в классе CMap. Поэтому, как он мне сказал, туже композицию надо провести от Player к CMap и так же от Enemy. И выходит, что тут получается обратная связь, а он говорит, что нижние классы ничего не должны знать о верхних и ничего не должны менять.
Поэтому возвращаясь к новому классу Который должен рисовать карту, то он же тоже будет получать массив из СMap, чтобы что-то нарисовать, хотя он же ничего не изменяет поэтому тут будет просто Ассоциация?

Вот собственно и все, что хочу уточнить.
Спасибо.
PM MAIL   Вверх
Cheloveck
Дата 30.12.2010, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



я бы так сделал, наверное
user posted image


--------------------
user posted image
PM Jabber   Вверх
TGrey
Дата 30.12.2010, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: нет
Всего: 1



Это все через Агрегацию?
Хорошо даже если и так, то Игрок должен ходить как-то, функции ходьбы у меня в классе Игрока, но для перехода ему нужно знать, где можно походить, потому я и посылаю из класса Карты ему массив с картой и тот его изменяет, а так нельзя сказали. В данном примере, я тоже не вижу возможности как таковой ходить игроку не зная куда.
К стати вот еще по этому поводу, поскольку игрок должен быть сам по себе и не зависеть от класса Карты, то выходит, что мне нужно будет переместить функции перехода в другой класс, а именно сказали, что каждый класс должен отвечать только за свои действия, то в класс Карты помещать не стоит и нужно будет еще сделать 1 класс Перехода, который будет отвечать только за переход. При этом выходит, что он тоже должен знать, массив с картой, чтобы проверять можно ли перейти... Тогда функции перехода все будут в этом классе, а в классе игрока ничего и не остается. smile  Вот вроде выходит, что должны быть классы CMap, Drawer, Player, Enemy, Walker.
Как бы теперь правильно связи расставить...
Игрок и Враг явно зависят от Карты через Композицию.
Дровер получает массив с картой из класса Карты т.к. ему нужно знать что рисовать.(Ассоциация?)
Волкер... даже не знаю куда его лучше всунуть, поскольку он вроде как зависит от Карты при этом ему нужно будет изменять координаты всех на карте...
Есть идеи?
PM MAIL   Вверх
baldina
Дата 30.12.2010, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Вся наша жисть - игра...
Мы в ней игроки. Действуем на поле Земля.
Отсюда - отношения:
1. Игра содержит землю и игроков, передавая ход
2. Игроки знают о Земле (карте), на которой идут действия
3. Игроки знают и о других игроках (возможно, посредством анализа карты)
4. Карта содержит текущее положение - что/кто где находится

Итак, Game агрегирует Map и Player, являясь связующим звеном в передаче информации и управляющая процессом
Player знает о Map (имеет ссылку)
Map независима, имеет методы, позволяющие изменить/получить текущее состояние
PM MAIL   Вверх
TGrey
Дата 30.12.2010, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: нет
Всего: 1



Так это по сути,то что у меня есть сейчас, за исключением обобщенного класса Гейм.
У меня сейчас так все и расставлено, Карта содержит Игроков, Игрок знает о карте(внутри указатель инициализирующийся через Конструктор).
Вот только, преподавателю необходима структура следующего вида.
Если посмотреть на мою диаграмму:
Форма - ничего не знает о том, кто ее вызывает, но знает, что содержит она.
Класс Карты - не важно ему, где он находится, важно только, то что он содержит.
Класс Игрок\Враг - им не важно куда они подключены, важно только, что ниже.

Вот и выходит, что не должно быть обратной связи от Игрока к Карте, потому, что Игрок в идее не знает, какой класс находится выше него. И поэтому действия нужно выполнять, где-то выше и потом какими либо методами, сообщать игроку, что у него что-то изменилось. А поскольку условие стоит так, что один класс отвечает только за себя, то класс Карты не может выполнять обработку Ходьбы. Как я написал придется добавлять еще 1 класс, который после обработки будет в низ(Игрокам) отправлять сообщение, что изменились координаты и т.п.
Хотя лично я, не вижу почему ему не подошел мой вариант, либо те что вы предложили.
PM MAIL   Вверх
baldina
Дата 30.12.2010, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(TGrey @  30.12.2010,  13:05 Найти цитируемый пост)
Карта содержит Игроков

неправильно это.

Цитата(TGrey @  30.12.2010,  13:05 Найти цитируемый пост)
преподавателю необходима структура следующего вида.
Если посмотреть на мою диаграмму:
Форма - ничего не знает о том, кто ее вызывает, но знает, что содержит она.
Класс Карты - не важно ему, где он находится, важно только, то что он содержит.
Класс Игрок\Враг - им не важно куда они подключены, важно только, что ниже.

Цитата

Карты не может выполнять обработку Ходьбы

тут нет "выше/ниже", тут кооператив. для его организации и нужен Game. А карта лишь имеет состояние, умеет сообщать о нем, менять его и (возможно) рисовать себя.
Цитата(TGrey @  30.12.2010,  13:05 Найти цитируемый пост)
Так это по сути,то что у меня есть сейчас, за исключением обобщенного класса Гейм.

Нет. Game имеет принципиальное значение.

Добавлено через 2 минуты и 52 секунды
вот тут основная ошибка:
Цитата(TGrey @  30.12.2010,  12:07 Найти цитируемый пост)
Игрок и Враг явно зависят от Карты через Композицию

не зависят.
PM MAIL   Вверх
TGrey
Дата 30.12.2010, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: нет
Всего: 1



Хорошо, вопрос, почему класс Гейм агрегирует Карту и Игрока? Это же значит, что Карта и Игрок должны быть созданы, где-то в другом месте и не зависеть от Гейма.
И вопрос остается, перемещение же тогда так и останется, Игроку нужно будет знать о карте. Тогда выходит, что я принесу тоже самое переделанное на 1 новый класс.
PM MAIL   Вверх
Cheloveck
Дата 30.12.2010, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



Цитата(TGrey @  30.12.2010,  14:14 Найти цитируемый пост)
Хорошо, вопрос, почему класс Гейм агрегирует Карту и Игрока? Это же значит, что Карта и Игрок должны быть созданы, где-то в другом месте и не зависеть от Гейма.

Это когда же на агрегацию такие ограничения наложили?

Цитата(TGrey @  30.12.2010,  14:14 Найти цитируемый пост)
Игроку нужно будет знать о карте

Игрок имеет ссылку на карту, но уже не является частью карты. Ты же знаешь о Земле, а ей плевать на тебя (образно говоря).


--------------------
user posted image
PM Jabber   Вверх
TGrey
Дата 30.12.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: нет
Всего: 1



Ах да это верно, я продолжил думать, что Игрок остается частью Карты.

На счет агрегации, из Википедии
Цитата

Агрегация встречается, когда один класс является коллекцией или контейнером других. Причём по умолчанию, агрегацией называют агрегацию по ссылке, т.е. когда время существования содержащихся классов не зависит от времени существования содержащего их класса. Если контейнер будет уничтожен, то его содержимое — нет.

Ну вот я и предполагаю, что раз Гейм это контейнер и он агрегирует Карту и Игрока, то они должны существовать не зависимо от Гейма?
PM MAIL   Вверх
Cheloveck
Дата 30.12.2010, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



TGrey, нельзя так строго понимать утверждение из вики, в UML помимо агрегации есть только композиция, которая накладывает больше ограничений на ассоциацию. В общем, ничего страшного не будет, если Game создаст игроков.


--------------------
user posted image
PM Jabber   Вверх
TGrey
Дата 30.12.2010, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: нет
Всего: 1



Ну я так тоже и подумал, потому и писал везде Композицию, что раз, в моем случае, карта удаляется, то и Игроки тоже, а в этом случае Гейм удаляется, то и Карта с игроками тоже. Просто мне нужно указать точную связь и это же тогда Композиция выходит?
PM MAIL   Вверх
Cheloveck
Дата 30.12.2010, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



Композиция - это ближе к наследованию реализации, в нашем случае - агрегация.


--------------------
user posted image
PM Jabber   Вверх
TGrey
Дата 30.12.2010, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: нет
Всего: 1



Хмм, а можно не большой примерчик их отличия, потому что на консультациях преподаватель лично мне сказала, что раз при удалении контейнера сносится все содержимое, то это Композиция, если нужно будет им объяснить, что тут агрегация, то что говорить то)
PM MAIL   Вверх
mes
Дата 30.12.2010, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



первое попавшееся, но вроде по сути :
http://cssblast.ru/articles/oop_concepts/


--------------------
PM MAIL WWW   Вверх
TGrey
Дата 30.12.2010, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: нет
Всего: 1



Цитата(mes @  30.12.2010,  15:05 Найти цитируемый пост)
первое попавшееся, но вроде по сути :
http://cssblast.ru/articles/oop_concepts/ 

К сожалению, там на самом интересном, статья не дописана и кода не хватает))
Но суть я понял такую:
Цитата

Композиция — это немного другой вид отношений, здесь можно сказать, что класс «составлен» из других классов. Например, стена «состоит» из кирпичей и молекула «состоит» из атомов. Ни один их данных примеров не может быть описан как наследование, т.к. утверждение «стена это кирпич» просто не является истиной. Композицию можно описать отношениями «has a» (имеет) и «uses a» (использует); стена «has a» кирпич или стена «uses a» кирпич.

Далее код и теория не соответствуют друг другу поэтому я полез в гугл найти не хватающей части, наткнулся на ту же википедию, но с довольно хорошим объяснением.
http://en.wikipedia.org/wiki/Has-a
user posted image
Цитата

In object-oriented programming this relationship can be represented with a Unified Modeling Language diagram. This has-a relationship is also known as composition. As you can see from the diagram on the right a car "has-a " carburetor, or a car is "composed of" a carburetor. When the diamond is coloured black it signifies composition, i.e. the object on the side closest to the diamond is made up of or contains the other object. While the white diamond signifies aggregation, which means that the object closest to the diamond can have or possess the other object.
Another way to distinguish between composition and aggregation in modeling the real world, is to consider the relative lifetime of the contained object. For example, if a Car object contains a Chassis object, a Chassis will most likely not be replaced during the lifetime of the CarIt will have the same lifetime as the car itself; so the relationship is one of composition. On the other hand, if the Car object contains a set of Tire objects, these Tire objects may wear out and get replaced several times. Or if the Car becomes unusable, some Tires may be salvaged and assigned to another Car. At any rate, the Tire objects have different lifetimes than the Car object; therefore the relationship is one of aggregation.
If one were to make a C++ software Class to implement the relationships described above, the Car object would contain a complete Chassis object in a data member. This Chassis object would be instantiated in the constructor of the Car class (or defined as the data type of the data member and its properties assigned in the constructor.) And since it would be a wholly contained data member of the Car class, the Chassis object would no longer exist if a Car class object was to be deleted.
On the other hand, the Car class data members that point to Tire objects would most likely be C++ pointers. Tire objects could be instantiated and deleted externally, or even assigned to data members of a different Car object. Tire objects would have an independent lifetime separate from when the Car object was deleted.

Вот.

Я не хочу утверждать, что я прав или эта статья, просто хочу разобраться, как же оно на самом деле. Вот получается, что Game has a Map, has a Player.
Игрок не меняется на протяжении всей жизни Гейма, Карта по сути изменятся только внутри, а сам объект тоже остается неизменным на протяжении всей жизни Гейма.

Кстати тогда Player получается и Агрегирует Map. Т.к. он ее не создает, а просто "имеет" ее.

Это сообщение отредактировал(а) TGrey - 30.12.2010, 16:04
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0971 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.