❌ Ошибка 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: