или, может быть, да, я не знаю

Общее состояние - отстой

Взгляните на этот пример:

Этот код отстой по многим причинам. Например, заметили ли вы ошибку в has_enough_symbols методе? Он есть, и причина в общем состоянии.

Теперь каждый метод может использовать все четыре общие переменные. Более того, методы могут изменять значения переменных или добавлять другие переменные! Звучит безумно, но в реальных проектах можно увидеть множество подобных случаев.

У этого класса есть несколько проблем. Теперь я хочу поговорить о сути каждого класса: его общем состоянии. Он есть, он изменяемый и делает код более ошибочным, менее читаемым и поддерживаемым. Иногда общее состояние жизненно важно, но не в этом случае. Мы можем исправить класс, удалив класс:

Теперь нет общего состояния, и код намного легче читать, изменять и поддерживать. Хороший.

Вот еще один пример:

Что здесь не так? Глобальное состояние. Теперь он находится в переменной BANNER_USERS_IDS. Каждый может получить к нему доступ, не добавляя его в аргументы. Будет ли get_user вернуть пользователя или None, если его забанят? Может get_current_user вернуть None, если его забанят? Что произойдет с многопоточными / многопроцессорными функциями? Одна глобальная переменная снижает ремонтопригодность всего проекта.

Чтобы исправить ситуацию, нам нужно удалить глобальную переменную и явно передать запрещенные идентификаторы каждому методу.

Иногда общее состояние не требуется, поэтому постарайтесь обойтись без него. Не пиши класс. Не создавайте глобальную переменную. Не используйте Redis или базу данных для общего состояния.

Иногда приходится, но в большинстве случаев нет. Таким образом, вы можете значительно повысить ремонтопригодность вашего кода, не создавая глобального состояния.

Чистые функции rulez

Функция, которая не использует общее состояние, имеет имя: чистая функция. На самом деле это более сложная вещь, подробнее читайте в Википедии или этой статье.

Итак, мой совет: как можно чаще используйте чистые функции. Это ограничивает вас, но делает ваш код более читабельным.

Есть несколько способов проверить, является ли ваша функция чистой: deal имеет для этого декоратор (@deal.pure), и есть пакет mr_proper, который может проверять чистоту с помощью статического анализа.

NamedTuples тоже крутые

Что ж, иногда нам нужно общее состояние, но нам не нужно его менять. Как и переменная пароля в приведенном выше примере. Еще один типичный пример того API-клиента: у вас обычно есть токен, базовый URL и множество методов, которые их используют. Есть способ не передавать их в каждом методе:

Теперь у нас есть общее состояние, но оно неизменяемо. Код по-прежнему относительно легко читать и поддерживать, а также его удобно писать и использовать.

Вместо того, чтобы писать класс, сначала подумайте о написании функции. Нет? Может быть, именованный кортеж подойдет? Нет? Что ж, тогда вам нужно написать класс.

Только не забывайте, что есть и другие варианты.