Лаб.№3 Задание на проектирование и реализацию объектов.

Проект «Система оплаты и скидочных карт в компьютерном магазине»

Описание предметной области

В компьютерном магазине используется следующая система скидочных карт:

  • Ламповая скидочная карта (tube discount card) выдаётся покупателю при накоплении 5000 суммарной стоимости покупок. Эта карта даёт скидку 5%.
  • Транзисторная скидочная карта (transistor) выдаётся при накоплении 12500 (может выдаваться после ламповой карты или сразу). Эта карта даёт скидку 10%.
  • Интегральная скидочная карта (integrated) выдаётся при накоплении 25000 (может выдаваться после ламповой карты, транзисторной карты или сразу). Эта карта даёт скидку 15%.
  • Квантовая скидочная карта (quantum) выдаётся покупателям в специальные «праздничные» дни случайным образом. Она даёт скидку 20%. Если покупатель уже владел какой-то скидочной картой, она (предыдущая карта) аннулируется, если только это уже не была квантовая карта (вторая не выдаётся).
    Квантовая карта имеет ограниченный срок действия (например, полгода). После истечения срока действия клиент получает взамен циклическую карту.
  • Циклическая скидочная карта (cyclic) является накопительной. В момент выдачи она даёт скидку 5% (как ламповая) и содержит 5000 «накопительной» стоимости. При накоплении 12500 она работает как транзисторная и даёт скидку в 10%. При накоплении 25000 — 15% (как интегральная). При накоплении 50000 сумма накопления сбрасывается в 5000, и карта снова даёт скидку 5%. Покупатель при желании может аннулировать эту карту и начать накопление заново.
  • Весёлая скидочная карта (cheerful) — это единственная карта, которую можно приобрести в магазине бесплатно. Она даёт скидку 10%, но работает только 10 дней в месяц, причём покупатель не знает, какие это дни (магазин определяет эти дни в начале каждого календарного месяца).

При каждой покупке в накопительную часть идёт полная стоимость покупки. Например, если покупатель с 10%-ной картой совершает покупку на сумму 1000, он платит 900, но накопительная часть увеличивается на 1000.
Транзакция накопления — это покупка. Если накопительная часть составляет 12000 (ламповая карта, например), а покупатель делает покупку на 2000, он оплачивает покупку со скидкой 5%. И после покупки получает транзисторную карту (её накопительная часть — 14000).

Если у покупателя есть две рабочих карты (например, весёлая и ламповая), используется только с одна с большей скидкой.

Задание

Необходимо реализовать программный проект для моделирования работы «кассы» компьютерного магазина.

  • Разработайте архитектуру и коротко опишите её (в текстовом файл, например).
  • Разработайте проект на языке C++
  • Опишите UML-диаграмму основных классов и интерфейсов системы (разрешается ограничиться публичными членами классов). Редакторы: UMLet, Dia.
  • Разработайте пользовательскую документацию (по использованию системы).

Описание системы

Магазин инициализируется «с нуля». Система не знает ни одного покупателя со скидочной картой.

После запуска системы она начинает принимать команды.

  • Команды категории «A».
    1. Команда авторизации. Покупатель совершает не первую покупку в магазине. Он подходит к кассиру и называет себя, кассир находит его запись в системе.
    2. Команда регистрации. Покупатель в магазине в первый раз. Он называет своё имя, кассир добавляет его в систему. Покупателя тут же авторизуют.
      Замечание. Может быть несколько человек с одним именем, придумайте способ их различения. Не забудьте об этом и при авторизации покупателя! Нужно выбрать правильную запись в системе.
  • Команды категории «B». Доступны только для авторизованных покупателей! Авторизованный покупатель может выполнить несколько команд данной категории.
    1. Команда совершения покупки. Здесь нужно указать сумму покупки (очевидно, она не может быть отрицательной или нулевой!).
    2. Команда приобретения весёлой карты.
    3. Команда аннулирования циклической карты. Подумайте, что делать, если у покупателя нет такой карты.
    4. Команда завершения сеанса работы. Пользователь разавторизуется и уходит из кассы.
  • Команда выключения системы.

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

Пользовательский интерфейс

Необходимо реализовать два интерфейса:

  1. Интерактивный. Достаточно реализовать однопользовательский консольный интерфейс, который позволяет вводить рассмотренные выше команды в текстовой форме.
  2. Демонстрационный. Для удобства демонстрации организуйте загрузку команд из текстового файла (одна команда в одной строке). Имя файла можно передавать приложению как параметр командной строки.
    Лог работы системы (для каждой команды файла: текст команды + реакция системы на неё) можно сохранить в другом файле (второй параметр командной строки) или выводить на консоль, если файл не задан или не существует.

Требования и указания

  • Обратите внимание, что пользовательский интерфейс должен быть отделён от системы, моделирующей работу кассы магазина. Саму систему можно реализовать в виде dll-библиотеки, например. Но даже если вы не сделаете отдельную dll, позаботьтесь о независимости этой части проекта от интерфейсов.

  • Интерактивный и демонстрационный интерфейсы — два разных пользовательских интерфейса одной и той же системы.

  • Позаботьтесь об обработке исключений. Система не должна «вылетать» от неправильно набранной текстовой команды.

  • Не забывайте о правильном форматировании кода и документирующих комментариях (о комментариях — хотя бы на минимальном уровне, позже они нам ещё пригодятся).

Подсказки

  • Скидочная карта не является частью покупателя, это «часть» магазина.
  • Наследование, интерфейсы, полиморфизм.
  • Защита доступа, свойства.
  • Обобщённые коллекции, ассоциативный массив.
  • Работа со строками.
  • Обработка аргументов командной строки.
  • Обработка исключений.

Рекомендация. Начните разработку с ядра проекта, то есть системы моделирования работы кассы магазина. Когда ядро будет готово, можно приступать к разработке интерфейсов. Подумайте о формате текстовых команд и повторном использовании кода, который «парсит» эти команды.