Review 30.04: game logic
Проект большой, буду создавать отдельные тикеты для разных компонент. В этом ревью рассматриваю game/logic.py и game/views.py.
- Начнём с views.py. Здесь после комментария-разделителя идут функции дублирующие те, что лежат в logic.py. Нужно их удалить и заимпортить из logic. https://mks2.cs.msu.ru/-/ide/project/Sokomi/website_project/tree/main/-/lozhkosson/game/views.py/#L166
- Дебажный вывод, удаляем. И в методе confirm тоже. https://mks2.cs.msu.ru/-/ide/project/Sokomi/website_project/tree/main/-/lozhkosson/game/views.py/#L36
- А зачем тут enumerate? Вариант, представленный ниже разве не работает? https://mks2.cs.msu.ru/-/ide/project/Sokomi/website_project/tree/main/-/lozhkosson/game/views.py/#L118
for tile in avail_deck:
if tile["id"] == start_tile.id:
tile["amount"] -= 1
break
- Я ещё увидел функцию init_game в logic. Её нужно заиспользовать во views вместо дублирования.
- В чём смысл json.loads(json.dumps(...))? Выглядит странно. https://mks2.cs.msu.ru/-/ide/project/Sokomi/website_project/tree/main/-/lozhkosson/game/views.py/#L147
- Почему никак не валидируются данные, которые приходят на бекенд? Пользователь может передать всё что угодно: несуществующий айдишник, несуществующий путь к изображению и потенциально всё сломается. Правильность хода тоже нужно проверять, чтобы нельзя было "читерить". Проверок на клиенте недостаточно, самое важное — это проверки на бекенде, а проверки на клиенте могут дублировать часть из них для удобства (чтобы не делать лишних запросов в бекенд для валидации).
- У вас равновероятно выбираются типы тайлов. Хотя в реальности ведь веростность выбора тайла, которых осталось больше, должна быть выше. Сгенерируйте число от 0 до размера оставшейся колоды, пройдитесь циклом и найдите нужный тайл, тогда будет действительно правильный рандом. А ещё ведь можно было изначально при подготовке колоды весь список зашафлить и просто идти последовательно, как в настоящей настолке. https://mks2.cs.msu.ru/-/ide/project/Sokomi/website_project/tree/main/-/lozhkosson/game/logic.py/#L28
- Зачем так часто использовать конструкцию
for i in range(len(...))
? Можно же просто по объектам итерироваться. https://mks2.cs.msu.ru/-/ide/project/Sokomi/website_project/tree/main/-/lozhkosson/game/logic.py/#L28 - Дублирование кода. Нужно просто проитерироваться по списку или генератору соседних клеток, а внутри тела цикла будут эти 3 строчки, которые тут повторяются. https://mks2.cs.msu.ru/-/ide/project/Sokomi/website_project/tree/main/-/lozhkosson/game/logic.py/#L65