moevm / oop

Object-oriented programming course
29 stars 225 forks source link

[8381] Pochaev Nikita LR2 #633

Closed po4yka closed 4 years ago

po4yka commented 4 years ago

При необходимости объяснить какие-то части кода, готов это сделать через:

Замечания к работе:

po4yka commented 4 years ago
  1. В последующих лабораторных предполагается, что будет режим нескольких игроков, так что баз на поле будет 2+, учитывая же, что один игрок может создать их несколько, то по сути кол-во CompositeUnit на поле может быть соразмерно кол-ву баз, следовательно, хранение указателей на тех и других в классе Cell оправдано. К тому же хранить указатель на nullptr не затратно по памяти, инкапсуляция там не нарушается, но зато сохранятся единый путь (интерфейс) взаимодействия с изменяемыми объектами на поле - юнитами и базами через отправку определённого запроса к клетке поля.

  2. vector<string> ID юнитов необходим для выделения групп юнитов, которы не могут проходить по данному типу ландшафта, получают за него бонус, не могут атаковать. Таким образом, по запросу к каждому типу Landscape можно получить ответ в прокси, может ли юнит по нему пройти.

  3. Ландшафт и поле связаны посредством паттерна protection proxy. В классе GameFieldProxy реализован тот же интерфейс IGameField, что и в GameField, только перед передачей запросу полю на передвижение выполняется проверка на ландшафт, а после передвижения проверка на наличие нейтральных элементов на новой позиции юнита. Так же данный прокси функционирует, как cache proxy. По своей сути элементы ландшафта и нейтральные элементы являются неизменяемыми и на каждой клетке одинаковые, так что не имеет смысла хранить по указателю на отдельный экземпляр в каждой клетке, так же не имеет смысла вкладывать их логику в GameField и Cell, так они включаются в работу только при одновременной работе медиаторов передвижения и атаки и, как следствие, прокси поля. Поэтому они хранятся в единственном экземпляре в GameFieldProxy, а также в нём находится словарь: координата клетки - указатель на ландшафт. Таким образом экономим память и уменьшаем связность. В некотором роде это похоже на работу паттерна Flyweight.

  4. Да, у Unit есть два подписчика: база и прокси поля. Первая отвечает только за собственный учёт доступных юнитов, а второй за своевременную очистку клетки после смерти юнита.

Ksenox commented 4 years ago

2) Почему именно используется string? Почему бы не использовать вектор из typeinfo? Так как сейчас необходимо делать жествую зависимость между юнитов и его строковым представлением.

po4yka commented 4 years ago

Переписал код с использование Enum. Также добавил его использование для идентификации юнитов у баз.

Ksenox commented 4 years ago

20 баллов