8.1 KiB
Задача 11. Рефакторинг системы управления интернет-магазином
Контекст
Вам достался legacy-код системы управления интернет-магазином, расположенный в файле legacy_shop.py.
Код является абсолютно монолитным: вся логика (регистрация пользователей, авторизация, корзина, оформление заказов, расчёт доставки для разных городов, применение промокодов и админ-отчёты) написана сплошным линейным потоком внутри интерактивного CLI-интерфейса. В программе нет ни одной функции и ни одного класса. При этом код содержит огромное количество дублирования логики (copy-paste), нарушает стандарты PEP 8, не имеет обработки ошибок и сложен в поддержке.
Ваша задача:
Провести полный рефакторинг этого кода, разделив его на модули, применив объектно-ориентированное программирование (ООП) и исправив стиль кодирования.
Шаг 1. Анализ и исправление стиля (PEP 8)
- Приведите весь код в соответствие со стандартами PEP 8:
- Устраните отсутствие пробелов вокруг операторов (например,
x=y+z). - Исправьте именование переменных на
snake_case. - Уберите «волшебные числа» и жестко захардкоженные пароли (например, пароль админа), вынеся их в константы или конфигурацию.
- Устраните отсутствие пробелов вокруг операторов (например,
Шаг 2. Декомпозиция логики в функции
- Найдите все повторяющиеся и логически обособленные куски кода и вынесите их в отдельные переиспользуемые функции с понятными названиями.
- Особое внимание уделите:
- Валидации полей при регистрации пользователя (сейчас проверки скопированы для каждого поля отдельно).
- Расчету стоимости доставки (уберите дублирование формул для 10+ городов, обобщите логику).
- Применению промокодов (уберите длинный
if-elifблок, заменив его на структуру данных/словарь соответствий или единую формулу). - Валидации чисел при вводе количества товаров и цен.
Шаг 3. Проектирование ООП-архитектуры
Шаг 3. Проектирование ООП-архитектуры
- Вместо хранения сырых словарей (
dict) и глобальных переменных спроектируйте систему классов. Создавайте классы там, где они действительно выгодны (например, там, где необходимо инкапсулировать состояние, защитить данные от некорректного изменения или связать данные с поведением). Подумайте, для каких сущностей достаточно простых структур данных/функций, а для каких необходимы полноценные классы:Product— модель товара (id, название, категория, цена, остаток на складе, sku, производитель).User— модель пользователя. Подумайте над наследованием: например, выделите базовый классUserи наследниковCustomer(клиент) иAdmin(администратор) с разным уровнем прав, если это упростит разграничение доступа.Cart— корзина покупателя, управляющая добавлением товаров, изменением количества и подсчетом промежуточного итога (здесь класс выгоден для управления состоянием).Order— заказ пользователя (детали доставки, примененная скидка, стоимость доставки, итоговая сумма, статус).Database— сервис для работы с файлами базы данных (users.json,products.json,orders.json). Должен инкапсулировать логику чтения и записи.Shop— центральный сервис-фасад, координирующий бизнес-логику магазина.
Шаг 4. Создание модульной файловой структуры
Разделите проект на логические части и файлы. Итоговая структура должна выглядеть следующим образом:
shop/
├── __init__.py
├── models/
│ ├── __init__.py
│ ├── product.py
│ ├── user.py
│ ├── order.py
│ └── cart.py
├── services/
│ ├── __init__.py
│ ├── shop.py
│ └── database.py
├── utils/
│ ├── __init__.py
│ └── validators.py
└── main.py
- В
main.pyдолжен остаться только запуск приложения и минималистичный интерактивный CLI-интерфейс, вызывающий методы классаShop.
Шаг 5. Качество кода и надежность
- Добавьте осмысленные docstring'и ко всем классам, методам и модулям.
- Используйте аннотации типов (type hints) для аргументов функций и возвращаемых значений.
- Добавьте обработку исключений (
try-except) в места взаимодействия с файловой системой (загрузка/сохранение БД) и при вводе некорректных данных пользователем. - Проверка стиля кода: Для проверки соответствия стандартам стиля запустите линтер
flake8в корне проекта:flake8 shop/
Критерии оценки:
- Работоспособность: после рефакторинга весь функционал приложения (от регистрации до админских отчетов) должен работать точно так же, как в исходном файле.
- Чистота кода: отсутствие дублирования логики (DRY), понятные имена переменных и методов. Команда
flake8 shop/не должна выводить никаких предупреждений или ошибок. - Качество ООП: грамотное распределение ответственности между классами, использование инкапсуляции (скрытие внутренних данных), осмысленное применение ООП.
- Модульность: логичное разделение кода по файлам в папке
shop/.