Files
Dmitry Belan ee235ece10
CI Check / lint-and-check (push) Failing after 9s
feat: implement legacy shop management system and add task documentation files
2026-07-18 12:25:32 +03:00

79 lines
8.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### Задача 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` в корне проекта:
```bash
flake8 shop/
```
---
**Критерии оценки:**
1. **Работоспособность**: после рефакторинга весь функционал приложения (от регистрации до админских отчетов) должен работать точно так же, как в исходном файле.
2. **Чистота кода**: отсутствие дублирования логики (DRY), понятные имена переменных и методов. **Команда `flake8 shop/` не должна выводить никаких предупреждений или ошибок.**
3. **Качество ООП**: грамотное распределение ответственности между классами, использование инкапсуляции (скрытие внутренних данных), осмысленное применение ООП.
4. **Модульность**: логичное разделение кода по файлам в папке `shop/`.