https://github.com/FinancierJava/telegramBot_Hangman
Ревьюю от Ageev Maxim
Из хорошего можно выделить:
- Понятный нейминг функций, переменных
- Активно используются тайпхинты
- В целом более менее адекватное разделение на функции
- Использование плейсхолдеров для подстановки значений в запросы
- Деплой полноценного приложения в systemd
- Достаточно большой и багатый функционал, но к коду конечно есть вопросы.
- Использование логирование
- Четкая точка входа - main
Недостатки (то что я бы не допускал в будущих проектах):
- Неяваное создание базы данных при импорте модуля db.py - В идеале импорты не должны нести никаких побочных эфектов. Вынести в функции, функцию запускать при старте приложения - https://github.com/FinancierJava/telegramBot_Hangman/blob/master/app/db.py#L4
- В этом же файле у тебя cursor как глобальная переменная, которой пользуется все функции в этом файле - неявано. Коннект и курсор либо создаем внутри функции и там используем, либо передаем из вне используя DI.
- Функции имеет большу вложенность - подумать как убрать или вынести вложенные блоки - https://github.com/FinancierJava/telegramBot_Hangman/blob/master/app/db.py#L56
- Функция save_word возвращает 1 или 0 в зависмости от успеха или не успеха, в Python так не носят (возможно в Go делают похожим образом). В случае неудачной операции можно кинуть ошибку например: WordAlreadyExistError
- Не понял, зачем у тебя все функции в db.py асинхронные, когда это не нужно (они не используют в себе await, async for, async with) - тут почитать и разобраться как с этим работать
- requiremets.txt или аналог - должен быть в репозитории, также как и readme.md - минимальное оформление проекта + плюс описание как это все запустить. Также можно указать версию python
- Не знаю, какую версию python ты используешь, но вместо List, Optional, Tuple - можно использовать built in классы python - list, tuple, str | None - эквивалент - Optional[str], это были временные заглушки в python, которые с версии 3.9 уже можно не использовать в дальнейших версиях их удалят
- Некотороые роутеры можно было разделить на отдельные - нр: https://github.com/FinancierJava/telegramBot_Hangman/blob/master/app/handlers.py#L111 - можно было заменить на тот который обрабатывает повторную игру и тот который обрабатывает no_play_again
- https://github.com/FinancierJava/telegramBot_Hangman/blob/master/app/oxford_api.py#L6 - достаточно большая функция, которая выполняет много действий - делает, запрос , парсит результать, почему-то нет хинтов тут, и в целом тут так как ты используешь асинхронный фреймворк нужно использовать и асинхронные библиотеки для запросов типа - aiohttp или httpx, это позволит не блокировать весь event_loop во время ожидания ответа от oxfordlearnersdictionaries.com
- server_logs - пустой файл - зачем от тут)
- utils.py - название поменять
- HangmanGame - очень большой класс, много полей и методов, много ответсвенности - шлет сообщения пользователю и содержит игровую логику. В идеале у нас должен быть класс/классы игровой логики, в которых нет зависимости от фреймвроков, базы данных и информации о том как производится ввод вывод.
- Есть какой-то файл config.py, который содержит глобальные переменные, можно сделать какой-то шаблон - как должны выглядеть настройки. В идеале настройки подгружать в функции main и передавать в нужные части приложения (тут совсем легко - всего одна переменная) - почитать про конфигурирование.
- Про импорты - лучше не использовать import *- https://github.com/FinancierJava/telegramBot_Hangman/blob/master/app/keyboards.py#L3 - писать конкретные имена, которые ты хочешь импортировать - https://peps.python.org/pep-0008/#imports Также принято разделять библиотеки на три разные группы - стандартная библиотека пайтон, внешние зависимости, твои пакеты приложения