Перейти к содержанию

LegacyShop — учебный проект «с запахами»

Маленький работающий интернет-магазин на C#. Собирается, запускается, честно считает заказы и печатает чек. И при этом написан так, как пишут, когда фичи нужны были «на вчера», а рефакторинг всё время откладывали.

Зачем он здесь

Разбирать запахи кода на своём проекте плохо тем, что каждый разбирает своё: у одного код на 100 строк без единого запаха, у другого — на 5000 и не понять, с чего начать. Сравнивать такие работы между собой невозможно, обсуждать на занятии — тоже.

Поэтому здесь лежит один общий проект для всех. В нём заранее заложено больше двадцати запахов из каталога лекции 2 — все пять групп представлены. Задача студента — найти их и назвать.

Проект намеренно небольшой (около 1200 строк): его реально прочитать целиком за вечер, а значит, «не нашёл» здесь означает «не увидел», а не «не успел».

Что это за магазин

Консольное приложение проходит два сценария:

  1. обычный покупатель, доставка курьером, оплата картой, купон на скидку;
  2. VIP-покупатель, наличные курьеру, часть товара на складе кончилась.

По дороге считаются скидки и стоимость доставки, резервируется товар, уходят уведомления на почту и в SMS, печатаются чек и два отчёта, делается выгрузка в CSV.

Структура

Папка / файл Что внутри
Program.cs демонстрационный сценарий, точка входа
Model/ сущности: товар, категория, покупатель, корзина, заказ, строка заказа
Payments/ способы оплаты и их проверки
Services/ вся логика: оформление заказа, склад, отчёты, уведомления, хранилище

Как запустить

cd OOP/examples/LegacyShop
dotnet run

Нужен .NET SDK 8.0 или новее. Если стоит только .NET 9/10, запуск всё равно сработает:

DOTNET_ROLL_FORWARD=LatestMajor dotnet run

Ничего устанавливать и настраивать больше не нужно: ни базы, ни интернета — письма и SMS просто печатаются в консоль.

Как с ним работать

  • Читайте код, а не только запускайте. Запахи не видны в выводе программы: она работает. В этом и смысл — запах не ошибка, а обещание боли в будущем.
  • Называйте запахи по каталогу из лекции. «Тут некрасиво» — не ответ, «Feature Envy, ReportBuilder.FormatCustomer, строки 55–68» — ответ.
  • Один и тот же кусок кода может пахнуть двумя запахами сразу. Это нормально, но в таблице это две строки с разным обоснованием, а не одна.
  • Не всё подозрительное — запах. Если считаете, что здесь длинный метод оправдан, так и напишите: это тоже разбор.

Одно правило. Ответы не спрятаны в истории коммитов, в ветках и в issue репозитория — искать их там бессмысленно. Список запахов существует только у преподавателя, и на защите вопрос будет один: почему это запах и чем он обернётся через полгода.

Дальше

Найденное нужно не только выписать, но и починить — часть работы состоит в том, чтобы применить приёмы рефакторинга под тестами, ничего не сломав. Условие — в задании, которое пришло вам в issue.