🐛 Типичные ошибки

⚡ Частые ошибки

  • Хранить код в публичном атрибуте вместо приватного.
  • Дублировать проверку кода в unlock и change_code.
  • Забыть сбросить счётчик неудач после успешной операции.
  • Использовать print вместо raise в задании 4.
  • Сравнивать timedelta с числом вместо datetime.

❌ Ошибка 1: код доступа хранится в публичном атрибуте

# Неправильно
class Door:
    def __init__(self, code: str) -> None:
        self.code = code  # любой может изменить снаружи

Почему плохо: внешний код может написать door.code = "0000" и обойти защиту.

✅ Исправление

class Door:
    def __init__(self, code: str) -> None:
        self.__code = code  # приватный атрибут

❌ Ошибка 2: дублирование проверки кода

# Неправильно
class Door:
    def unlock(self, code: str) -> bool:
        if code == self.__code:
            ...

    def change_code(self, old_code: str, new_code: str) -> None:
        if old_code == self.__code:
            ...

Почему плохо: если правило проверки изменится, придётся искать все места с == self.__code.

✅ Исправление

def __is_valid_code(self, code: str) -> bool:
    return code == self.__code

❌ Ошибка 3: не сбрасывается счётчик неудач

# Неправильно
if self.__is_valid_code(code):
    print("Access granted.")
    return True
print("Access denied.")
self.__handle_failed_attempt()

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

✅ Исправление

if self.__is_valid_code(code):
    print("Access granted.")
    self.__reset_attempts()
    return True

❌ Ошибка 4: печать сообщения вместо исключения

# Неправильно для задания 4
if self.__is_blocked():
    print("Door is blocked.")
    return False

Почему плохо: вызывающий код не узнаёт, что произошла ошибка, и не может на неё отреагировать.

✅ Исправление

if self.__is_blocked():
    raise DoorBlockedError(self.__remaining_block_time())

❌ Ошибка 5: неправильная работа со временем

# Неправильно
self.__block_until = block_minutes * 60
# или
if time.time() < self.__block_until:

Почему плохо: смешиваются понятия «количество секунд» и «момент времени». Сравнивать нужно объекты datetime.

✅ Исправление

self.__block_until = datetime.now() + timedelta(minutes=block_minutes)
if datetime.now() < self.__block_until: