Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 20.04.2009
Сообщений: 11
1

Диаграмма классов

11.12.2012, 14:26. Показов 3149. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Занимался обычным программированием (начинал с Pascal, потом Delphi, также программировал на PHP, JavaScript) и решил попробовать создать более серьезный в реализации проект для конкретной платформы.
Так вот, перед программированием более или менее серьезного проекта необходимо все-таки предварительно иметь набросок диаграммы классов и знать какие функции они выполняют.
Итак имеется карточная игра наподобие Magic: The Gathering. Опыта в создании проектов нет. Пока что есть наработки (пока пользовательского интерфейса в представлении нет):
Классы - Card (содержит данные по картам), Deck(содержит данные по колоде карт), Player (содержит данные игрока - параметры здоровья, очков призыва и т.п.), Action (содержит действия, которые могут происходить - призыв карты, атака, защита, использование заклинаний), Exception (обработка корректности действий игроков), Table (который в принципе и описывает все действия с картами, просчеты, комбинации карт и т.п.).
Возникают подозрения, о том, что я все-таки упускаю моменты уже в текущей модели, и в классе Table содержится огромное количество методов, поэтому необходимо его разбивать.
Уважаемые форумчане, прошу помощи как раз в этом вопросе.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.12.2012, 14:26
Ответы с готовыми решениями:

Диаграмма классов
Всем доброго времени суток. Прошу прощения, но проблема тупая(( не могу составить грамотную...

Отличие классов в python от классов в c++
Чем отличаются классы в python от классов в c++? (На сколько я знаю, это областью видимости и...

Диаграмма классов
Помогите сделать диаграмму классов, никак не въеду как правильно

Диаграмма классов
Всем привет! Помогите правильно составить диаграмму классов.Есть Зал,Актер,Концерт. Я сделал...

15
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
12.12.2012, 09:54 2
А за что именно отвечает твой класс Table? Какое такое "огромное количество методов" он содержит? Они могут быть разбиты на функциональные группы? Какие?
0
0 / 0 / 0
Регистрация: 20.04.2009
Сообщений: 11
12.12.2012, 10:52  [ТС] 3
Ну если смотреть на данную модель, то все перечисленные классы до Table и Exception, хранят только данные.
Exception как я говорил будет "фильтром" корректности передаваемых данных (ну мало ли игра сетевая будет).
А на Table сваливается все остальное по обработке данных. Действия с колодами каждого игрока, переходы из колоды в руку, с руки на призыв, с призыва - останется ли карта или умирает, получение количества очков защиты, атаки в данный ход, изменение параметров игрока (отнимает здоровье при успешно проведенной атаке, количество очков призыва при изъятии карты из руки на игровое поле), тасовка колоды, удаление "мертвых" карт из текущей игры, сохранение т.д.
У меня в этом и заключается проблема правильно разбить данный класс на другие классы, чтобы каждый отвечал за свои функции. Опыт таковой отсутствует.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
12.12.2012, 12:09 4
Ага. Мда, у тебя этот самый Table получается как антипаттерн "God Object" (Божественный Объект или Универсальный Всемогутер). Попробуй выделить функционально ограниченные группы действий в отдельные классы (например, PlayerLogic, GameLogic могут отвечать за логику отдельного игрока и игры в целом, GameLoader может отвечать за загрузку/сохранение игры на диске... и так далее, - к сожалению, я не знаком с игрой и не могу сказать конкретнее). Поможет анализ предметной области (правил игры?).

Руководствуйся принципом: каждый класс должен быть небольшим и отвечать за четко определенный функционал, причем функционал различных классов не должен пересекаться (т.е. не должно быть ситуации, когда за одно и то же действие отвечают два разных класса - здесь обязательно рано или поздно возникнет конфликт).
1
0 / 0 / 0
Регистрация: 20.04.2009
Сообщений: 11
12.12.2012, 12:49  [ТС] 5
Спасибо за помощь и подсказки. Все-таки хочется потому что делать "по науке", а не как придется (как зачастую приходилось во время учебы). Анализируя и обучаясь на каждом этапе разработки. Буду двигаться и развивать идеи. Спасибо еще раз.
0
Модератор
2904 / 1763 / 179
Регистрация: 19.02.2011
Сообщений: 6,477
12.12.2012, 14:21 6
Ryote, если не в курсе, почитай про SOLID - должно пригодиться.
1
0 / 0 / 0
Регистрация: 20.04.2009
Сообщений: 11
12.12.2012, 15:04  [ТС] 7
Спасибо большое, почитаю.
0
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
14.12.2012, 10:37 8
А вы попробуйте подробно описать в текстовом виде как игра происходит в жизни без компьютера. (или возьмите готовое описание)
И внимательно посмотрите все ли сущности вы определили правильно
Например эти сущности у меня сомнений не вызывают
Карта
Игрок

Колода? может это просто массив карт и такая сущность нам не нужна?
Table? первая ассоциация с этим словом это стол. А стол это как бы игровое поле. Может так и обозначить его
GameField тогда эта сущность описанная в предметной области становиться классом на диаграмме классов.

Собственно можно и нарисовать первичную диаграмму классов, на которой показаны сущности предметной области( без классов программы). Это может стать ключем к решению вопроса архитектуры приложения. На такой диаграмме должны присутствовать отношения между сущностями.

Добавлено через 30 минут
Цитата Сообщение от Ryote Посмотреть сообщение
Все-таки хочется потому что делать "по науке", а не как придется (как зачастую приходилось во время учебы). Анализируя и обучаясь на каждом этапе разработки. Буду двигаться и развивать идеи. Спасибо еще раз.
думаю, что четкой науки тут не получиться. Это просто некоторые методы основанные на догадках создателей ООП. Которые как бы предлагают: "Попробуйте описывать сущности реального мира, как программные единицы".

подход RUP скорее всего больше подходит к желанию "сначала всё продумать, потом начинать делать"
XP же направлен на более быстрое получение рабочего прототипа.
0
0 / 0 / 0
Регистрация: 20.04.2009
Сообщений: 11
14.12.2012, 10:59  [ТС] 9
Сейчас у меня получатся так:
Card (параметры карты, тип карты (по правилам их всего 5 типов))
Deck (массив карт)
Player (параметры игрока)
Action (список действий, реализуемых в рамках правил)
Error (класс для обработки ошибок)
Filter (класс проверки корректности полученных данных)
PlayerLogic (отвечает за изменение данных игрока, его параметров)
GameLogic (отвечает за правила ведения игры)
ActionLogic (описана логика действий соответствующим правилам, описанным в GameLogic)
Естественно ActionLogic все равно оказывается антипаттерном. Поэтому класс разбивать следует на отдельные действия в соответствии с текущими правилами. Т.е. имеются этапы хода - начало игры, призыв существ, атака/защита, конец хода. И по ним выстроить отдельные классы.
0
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
14.12.2012, 11:41 10
если не рассуждать о предметной области и изобразить часть диаграммы классов то я бы сделал так
(люблю называть классы во множественном числе)
Код
GameFields <>---- Rules
          <>---- Cards
типа две агрегации, показывающее связь Fields(игровые поля) с Rules(правилами игры) и Cards(Карты)

Думаю конечная цель это упрощение логики, уменьшение количества кода, и уменьшение вероятности полного рефакторинга

Всё таки классы типа ActionLogic я бы привязывал к сущностям предметной области( поэтому так важно их определять на первом этапе)

Поэтому не ActionLogic
а PlayerActions
и ComputerActions(хотя тут компьютер это тоже в сущности игрок, поэтому можно ограничиться PlayerActions)
то есть некий класс которые выделяет методы действий из класса Players в отдельный класс для повторного использования.

Добавлено через 7 минут
Хотя мы имеем полное право описать все в классе Players (а может лучше назвать его Users, или сделать потомком Users - в будующем может пригодиться)

Добавлено через 2 минуты
Error (класс для обработки ошибок)
может в реальной жизни в игре есть судья?
тогда разумно ввести класс Arbiters
0
0 / 0 / 0
Регистрация: 20.04.2009
Сообщений: 11
14.12.2012, 11:46  [ТС] 11
Даже если и существует PlayerAction - все равно он будет очень большим классов по сравнению с остальными и в итоге придется разбивать на классы - StartGameAction, SummonAction, AttackAction, ProtectAction, EndGameAction, т.к. правила каждого из компонентов могут быть изменены, но при этом игровой логике наплевать в принципе, что внутри каждого компонента действий находится, ему просто нужно его вызвать в соответствии с правилами ведения игры. А сваливать все действия в PlayerAction тоже неправильно, т.к. при добавлении нового действия в правиле игры, придется добавлять вызов не только в GameLogic , но и в PlayerAction. Поэтому я думаю все-таки для каждого нового действа писать отдельный класс.

Цель все-таки максимально правильно представить модель "по учебникам". Поэтому и возникают такие классы, как Error, которые обрабатывают ошибки.
0
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
14.12.2012, 11:56 12
ещё пришло в голову выделить класс PlayerFields - которые символизируют руки игрока в которых он держит карты.
тогда Players связан с PlayerFields отношением композиции(руки не могут существовать без игрока, или всё таки могут? надо проверить отрубанием )

Добавлено через 3 минуты
правильного не существует, даже на форуме мнение экспертов по предметной области разные. Я просто стараюсь придерживаться Коберна, Фаулера, RUP, материалов собранных на сайте www.uml2.ru

Я не могу с вами спорить мне неизвестна предметная область(как и правила игры)
0
0 / 0 / 0
Регистрация: 20.04.2009
Сообщений: 11
14.12.2012, 11:58  [ТС] 13
Была такая же идея, но все-таки она неверная. Делить карты. Не важно, где карты находятся, проще просто в данных прописывать в каком статусе находится карта в данный момент (ожидание, призвана, защита/атака, умерла/удалена).

Фаулера я читал, но все-таки опыта никакого. Поэтому получается "учимся плавать, кинув себя в центр глубокого озера".
0
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
14.12.2012, 12:12 14
цитата из вики по вашей ссылке Magic: The Gathering
Каждая игра представляет собой поединок между могучими волшебниками, также называемыми "planeswalkers", которые, с помощью использования магических ресурсов, призывают заклинания, артефакты, чары и существ,
Честное слово я бы не удержался и сделал бы классы
PowerWizards(или PlanesWalkers)
MagicResources
Spells
Artifactes
и т д

Код становиться фэнтазийным и интересным и пофиг на учебники

Добавлено через 5 минут
Нарисовали бы диаграмму объектов предметной области, которая отражает сущности предметной области. Или диаграмму классов (если не хочется тратить время на первую). Визуальную картинку интереснее изучать.
0
0 / 0 / 0
Регистрация: 20.04.2009
Сообщений: 11
14.12.2012, 12:12  [ТС] 15
Ну я все-таки для начала упростил, выкинув из правил пока что заклинания и лишние параметры. Оставив у существ показатели атаки/защиты/кол-во очков призыва. А ход делится на начало хода, призыв, фаза атаки - атакующий игрок выбирает атакующих существ, защищающийся игрок выбирает защищающихся существ, конец хода.

Да я тоже так думаю, по диаграмме классов расписать как происходит игра и кто к кому обращается, но к сожалению это во внерабочее только время
0
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
14.12.2012, 15:23 16
http://www.uml2.ru/index.php?o... &Itemid=50
как происходит игра и кто к кому обращается
я про то что на диаграмме классов показать это нельзя

Добавлено через 9 минут
Но это можно показать на диаграмме бизнес объектов, которая отражает сущности предметной области. И рисуется в нотации диаграммы классов.

Добавлено через 2 часа 23 минуты
То есть с помощью диаграммы объектов сущностей предметной области можно рассмотреть игру, без проектирования вашей программы и без компьютера.

И на связях как раз можно показывать взаимодействие этих объектов, например рисуем сущности Арбитер и Карта.
на линии отношения можно указать "раздаёт" и направление отношения. Тогда по диаграмме будет видно что арбитер раздаёт карты.
Как это может помочь архитектуре?
Да можно сразу создавать класс Arbiters и метод distributeCards ("раздать карты")
тогда если мы правильно описали взаимодействие на диаграмме бизнес объектов, то такая архитектура не измениться до конца жизни проекта.

если понять как взаимодействуют объекты в предметной области ( например как взаимодействуют игроки с картами и с другими игроками), то архитектура программы будет очевидной.
0
14.12.2012, 15:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.12.2012, 15:23
Помогаю со студенческими работами здесь

Диаграмма классов
Нужно сделать диаграмму классов для курсовой, собственно вот не большой кусок кода где используются...

Диаграмма классов
Доброго времени суток. На протяжении 3ей недели пытаюсь сдать преподователю диаграмму класса...

Диаграмма Классов
Объясните, пожалуйста, чайнику. Что такое класс контроллер и в каком виде он должен быть реализован...

Диаграмма классов
Подготовить диаграмму классов, описывающую группу классов. Добавить в классы атрибуты и операции, в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru