Skip to content

Instantly share code, notes, and snippets.

@Asenim
Created June 28, 2024 12:46
Show Gist options
  • Save Asenim/2079b291621fc81e683c8b60e5758219 to your computer and use it in GitHub Desktop.
Save Asenim/2079b291621fc81e683c8b60e5758219 to your computer and use it in GitHub Desktop.

https://github.com/FinancierJava/telegramBot_Hangman
Ревьюю от Ageev Maxim

Из хорошего можно выделить:

  1. Понятный нейминг функций, переменных
  2. Активно используются тайпхинты
  3. В целом более менее адекватное разделение на функции
  4. Использование плейсхолдеров для подстановки значений в запросы
  5. Деплой полноценного приложения в systemd
  6. Достаточно большой и багатый функционал, но к коду конечно есть вопросы.
  7. Использование логирование
  8. Четкая точка входа - main

Недостатки (то что я бы не допускал в будущих проектах):

  1. Неяваное создание базы данных при импорте модуля db.py - В идеале импорты не должны нести никаких побочных эфектов. Вынести в функции, функцию запускать при старте приложения - https://github.com/FinancierJava/telegramBot_Hangman/blob/master/app/db.py#L4
  2. В этом же файле у тебя cursor как глобальная переменная, которой пользуется все функции в этом файле - неявано. Коннект и курсор либо создаем внутри функции и там используем, либо передаем из вне используя DI.
  3. Функции имеет большу вложенность - подумать как убрать или вынести вложенные блоки - https://github.com/FinancierJava/telegramBot_Hangman/blob/master/app/db.py#L56
  4. Функция save_word возвращает 1 или 0 в зависмости от успеха или не успеха, в Python так не носят (возможно в Go делают похожим образом). В случае неудачной операции можно кинуть ошибку например: WordAlreadyExistError
  5. Не понял, зачем у тебя все функции в db.py асинхронные, когда это не нужно (они не используют в себе await, async for, async with) - тут почитать и разобраться как с этим работать
  6. requiremets.txt или аналог - должен быть в репозитории, также как и readme.md - минимальное оформление проекта + плюс описание как это все запустить. Также можно указать версию python
  7. Не знаю, какую версию python ты используешь, но вместо List, Optional, Tuple - можно использовать built in классы python - list, tuple, str | None - эквивалент - Optional[str], это были временные заглушки в python, которые с версии 3.9 уже можно не использовать в дальнейших версиях их удалят
  8. Некотороые роутеры можно было разделить на отдельные - нр: https://github.com/FinancierJava/telegramBot_Hangman/blob/master/app/handlers.py#L111 - можно было заменить на тот который обрабатывает повторную игру и тот который обрабатывает no_play_again
  9. https://github.com/FinancierJava/telegramBot_Hangman/blob/master/app/oxford_api.py#L6 - достаточно большая функция, которая выполняет много действий - делает, запрос , парсит результать, почему-то нет хинтов тут, и в целом тут так как ты используешь асинхронный фреймворк нужно использовать и асинхронные библиотеки для запросов типа - aiohttp или httpx, это позволит не блокировать весь event_loop во время ожидания ответа от oxfordlearnersdictionaries.com
  10. server_logs - пустой файл - зачем от тут)
  11. utils.py - название поменять
  12. HangmanGame - очень большой класс, много полей и методов, много ответсвенности - шлет сообщения пользователю и содержит игровую логику. В идеале у нас должен быть класс/классы игровой логики, в которых нет зависимости от фреймвроков, базы данных и информации о том как производится ввод вывод.
  13. Есть какой-то файл config.py, который содержит глобальные переменные, можно сделать какой-то шаблон - как должны выглядеть настройки. В идеале настройки подгружать в функции main и передавать в нужные части приложения (тут совсем легко - всего одна переменная) - почитать про конфигурирование.
  14. Про импорты - лучше не использовать import *- https://github.com/FinancierJava/telegramBot_Hangman/blob/master/app/keyboards.py#L3 - писать конкретные имена, которые ты хочешь импортировать - https://peps.python.org/pep-0008/#imports Также принято разделять библиотеки на три разные группы - стандартная библиотека пайтон, внешние зависимости, твои пакеты приложения
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment