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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Какой код лучше соответствует ООП ? 
:(
    Опции темы
ivanoop
Дата 10.12.2013, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет!
Пишу игру-стрелялку. 
Player - класс игрока,  Point - класс точки в которой находится игрок.
Как лучше оформить метод перемещения игрока в точку: поместить в класс игрока или сделать класс менеджера перемещения или реализовать оба способа?

Код

Player player;
Point point;
player.Move(point);

Manager manager; 
manager.Move(player,point);


Это сообщение отредактировал(а) ivanoop - 10.12.2013, 11:33
PM MAIL   Вверх
bsa
Дата 10.12.2013, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 63
Всего: 196



ivanoop, первый вариант выглядит более естественно.
PM   Вверх
ivanoop
Дата 10.12.2013, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А чем плохо сделать Move без класса?
Код

Move(player,point);

В чём преимущества
Код

player.Move(point);


Это сообщение отредактировал(а) ivanoop - 10.12.2013, 12:16
PM MAIL   Вверх
vinter
Дата 10.12.2013, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Ну вот представь, что ты Игрок. Вариант 1: ты берешь себя защкирку и перемещаешь. Это выглядит для тебя правильным? Move не должен быть методом Player.


--------------------
Мой блог
PM MAIL WWW   Вверх
ivanoop
Дата 10.12.2013, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(vinter @ 10.12.2013,  12:36)
Ну вот представь, что ты Игрок. Вариант 1: ты берешь себя защкирку и перемещаешь. Это выглядит для тебя правильным? Move не должен быть методом Player.

А что неправильного? 
Вот ты идёшь куда-то пешком. Кто тебя перемещает?
PM MAIL   Вверх
vinter
Дата 10.12.2013, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(ivanoop @  10.12.2013,  13:55 Найти цитируемый пост)
Вот ты идёшь куда-то пешком. Кто тебя перемещает?

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


--------------------
Мой блог
PM MAIL WWW   Вверх
xvr
Дата 10.12.2013, 13:13 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(ivanoop @  10.12.2013,  12:15 Найти цитируемый пост)
А чем плохо сделать Move без класса?

Player должен предоставлять интерфейс (причем минимальный) для изменения своего состояния. Что у Player'а будет в этом интерфейсе для изменения позиции? Если он умеет только перемещаться из точки в точку (без каких либо дополнительных атрибутов, типа траектории или в крайнем случае просто скорости), то Move и будет таким интерфейсом. Сделать Move не членом класса это значит открыть этой самой функции Move внутренности Player'а, что бы она могла изменить позицию (которая хранится где то внутри Player'а), что является явным нарушением принципа инкапсуляции.

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

3й вариант - Player хранит позицию, но перемещение описывается какой то сложной траекторией. В таком случае у Player'а есть примитив - переместится по заданному вектору (короткому), а собственно перемещением занимается внешний класс TrackPath (например). В таком случае метод Move будет и у Player'а и у TrackPath'а, и 2й будет использовать 1й для реального перемещения

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


Эксперт
****


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

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



Цитата(vinter @  10.12.2013,  13:04 Найти цитируемый пост)
Move должен быть внешней сущностью на мой взгляд

тогда он должен быть в курсе внутренней реализации, это плохо.

Добавлено через 18 секунд
xvr написал уже...
PM MAIL   Вверх
vinter
Дата 10.12.2013, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(baldina @  10.12.2013,  14:34 Найти цитируемый пост)
тогда он должен быть в курсе внутренней реализации, это плохо.

вовсе не обязательно, достаточно иметь setPosition или что-то схожее.


--------------------
Мой блог
PM MAIL WWW   Вверх
baldina
Дата 10.12.2013, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(vinter @  10.12.2013,  14:22 Найти цитируемый пост)
достаточно иметь setPosition

и чем это от move отличается кроме названия?  smile

Добавлено через 1 минуту и 32 секунды
Цитата(xvr @  10.12.2013,  13:13 Найти цитируемый пост)
 Player хранит позицию, но перемещение описывается какой то сложной траекторией. В таком случае у Player'а есть примитив - переместится по заданному вектору (короткому), а собственно перемещением занимается внешний класс


Добавлено через 6 минут и 23 секунды
вобщем все зависит от понятия "перемещения игрока в точку". 
у объекта всяко должен быть атрибут "позиция" и метод её изменения.
если это просто смена позиции, этого метода достаточно. если это процесс, то осуществляется в зависимости от задачи либо самим объектом, либо менеджером путем вызова упомянутого метода.
PM MAIL   Вверх
ZeusAtVingrad
Дата 11.12.2013, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А почему player'а кто-то перемещает или даёт команду переместиться?
Разве он не сам решает и стремится куда-то попасть? Под влиянием своих внутренних алгоритмов (ну или решения игрока-человека).
PM MAIL   Вверх
kolobok0
  Дата 13.12.2013, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(ivanoop @ 10.12.2013,  11:33)
..Как лучше оформить метод перемещения игрока в точку...

Для начала надо подчерпнуть инфы из класики - как это по уму. А потом уже пытаться понимать прочитанное, потом играться на своих кошках и лишь потом программировать.

Если взять труды одного из основоположников ООА и ООП - Гради Буча, то в данной методологии есть основной принцип. Идти от задачи, от жизни. 

В жизни у Вас что и кто умеет перемещать или перемещаться?

Давайте поразмышляем. Человек может перемещаться? Да. Его может, кто то перемещать? Да. Но это уже будет свойством другой(!) сущности. У человека могут быть доп. условия перемещения? Да. инвалид, только прыгает(ну типа мозгами поехал), ползёт(типа кругом война), произошёл взрыв гранаты рядом(воздействие на объект, вектора воздействия и силу имеем. а вот повреждения - опять же задача не ударной волны и не гранаты!!! smile ) и т.д.. Т.е. способ перемещения будет у человека зависить от его внутрених текущих задач, от текущей обстановки, и от его возможностей. Кстати говоря он может принять решение пожертвовать собой и из положения лёжа, броситься на пули...по какой-то своей логике...

Есть ещё "пару" правил:
- не надо программировать ради программирования(только от задачи).
- не надо резать будущие возможности(читай потребности объекта) в угоду оптимизации или другой своей внутренней потребности(обращаю внимание ВАШЕЙ потребности, а не бизнес задачи!).
- не надо додумывать как программист на этапе ООА и ООП (типа а вот так будет круче, быстрее, правильнее и прочая ересь с точки зрения ОО)
- после нахождения сущностей от жизни, проигрывания сценариев по юзанью найденных сущностей и их интерфейсов(динамическая модель) - можно просчитать те объекты которые уже необходимы для оптимизационных дел. Например, при сканировании бд не имеет смысла тащить на уровне сущностей все данные из таблиц. Вы же делаете операцию поиска в таблицах(к примеру) или там сканирования - вот и необходимо уже на этапе осмысления с точки зрения оптимальности по скорости работать с "коллекциями", а не со списками объектов. 
- И т.д... smile

читайте лучше класику - там многое чаво подчерпнёте грамотного. только нуна думать конечно же и осязать всё, что прочтёте.

удачи вам
(круглый)

Это сообщение отредактировал(а) kolobok0 - 13.12.2013, 00:03
PM MAIL   Вверх
ivanoop
Дата 13.12.2013, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(kolobok0 @ 13.12.2013,  00:00)
Давайте поразмышляем. Человек может перемещаться? Да. Его может, кто то перемещать? Да. 

Если игрок сам захотел переместиться, то пишем строку
Код

player.Move(point);

Если игрока поместили в автомобиль и перемещают, пишем строку
Код

car.Move(player,point);
Но надо как-то изменить положение игрока записанное в самом игроке. 
Поэтому в  реализации метода car.Move придется вызвать метод player.Move.
То есть опять игрок перемещается сам.

Это сообщение отредактировал(а) ivanoop - 13.12.2013, 09:19
PM MAIL   Вверх
vinter
Дата 13.12.2013, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(ivanoop @  13.12.2013,  10:17 Найти цитируемый пост)
То есть опять игрок перемещается сам.

Поэтому надо не метод Move иметь а свойство Position, которое простейшим образом реализуется через setPosition()/position()


--------------------
Мой блог
PM MAIL WWW   Вверх
baldina
Дата 13.12.2013, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ivanoop @  13.12.2013,  09:17 Найти цитируемый пост)
Если игрока поместили в автомобиль и перемещают

налицо более одной системы координат

Добавлено через 1 минуту и 36 секунд
я к тому, что перемещают только автомобиль. игрок перемещается как следствие (т.к. его локальная СК связана не с глобальной, а с СК авто)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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