3. Проектирование программного обеспечения

Учебный кейс: «Система аренды спортивного инвентаря» (.NET 6/8, C#)

3.1. Описание структуры программы

Программный продукт реализуется как модульное приложение на языке C# (.NET 6/8), сочетающее структурный и объектно-ориентированный подходы. Основные уровни:

Уровень Назначение Примеры классов/модулей
Данные (Data Layer) Хранение и доступ к локальным JSON-файлам DataStorage, FileRepository
Бизнес-логика (Business Logic) Операции аренды, расчёт тарифов, управление статусами RentalService, TariffCalculator, MaintenanceService
Представление (UI Layer) Взаимодействие с пользователем (меню или формы) Program, ConsoleUI, FormMain
Модели (Domain Entities) Классы предметной области (объекты учёта) Customer, InventoryItem, Rental, Tariff, MaintenanceRecord

3.2. Основной алгоритм (flowchart)

Блок-схема основного сценария: оформление аренды и возврат инвентаря.

flowchart TD
  A[Начало]
  B[Меню: выбрать действие]
  C{Создать новую аренду?}
  D[Выбор клиента]
  E[Выбор инвентаря]
  F{Инвентарь доступен?}
  G[Выбор тарифа]
  H[Расчёт стоимости]
  I[Создание договора аренды status = open]
  J[Сохранение в файл rentals.json]
  K[Вывод подтверждения]
  L{Возврат инвентаря?}
  M[Поиск договора по ID]
  N[Ввод фактического времени]
  O[Перерасчёт суммы и штрафов]
  P[Изменение статуса на closed]
  Q[Обновление статуса инвентаря на доступен]
  R[Формирование отчёта]
  Z[Конец]

  A --> B
  B --> C
  C -->|Да| D
  D --> E
  E --> F
  F -->|Да| G
  F -->|Нет| B
  G --> H --> I --> J --> K --> B
  C -->|Нет| L
  L -->|Да| M --> N --> O --> P --> Q --> R --> B
  L -->|Нет| Z
      

3.3. UML-диаграмма классов

classDiagram
direction LR

class Customer {
  +Guid Id
  +string FullName
  +string Phone
  +string DocumentId
}

class InventoryItem {
  +Guid Id
  +string InvNumber
  +string Category
  +string Condition
  +string Status
  +DateTime LastServiceAt
  +void ChangeStatus(string newStatus)
}

class Tariff {
  +Guid Id
  +string Name
  +string Mode  // hour/day/package
  +decimal Rate
  +string RoundRule
}

class Rental {
  +Guid Id
  +Customer Customer
  +InventoryItem Item
  +Tariff Tariff
  +DateTime StartAt
  +DateTime? EndAt
  +decimal BaseAmount
  +decimal Discount
  +decimal Penalty
  +decimal Total
  +string Status
  +void CloseRental(DateTime endAt)
}

class MaintenanceRecord {
  +Guid Id
  +InventoryItem Item
  +DateTime Date
  +string Work
  +string Note
}

class TariffCalculator {
  +decimal Calculate(Tariff t, DateTime start, DateTime end)
}

class DataStorage {
  +List~Customer~ Customers
  +List~InventoryItem~ Items
  +List~Tariff~ Tariffs
  +List~Rental~ Rentals
  +List~MaintenanceRecord~ Maintenances
  +void LoadAll()
  +void SaveAll()
}

class RentalService {
  +void OpenRental(Customer c, InventoryItem i, Tariff t)
  +void CloseRental(Guid rentalId)
  +List~Rental~ GetActiveRentals()
}

Customer "1" --> "0..*" Rental : оформляет
InventoryItem "1" --> "0..*" Rental : участвует
InventoryItem "1" --> "0..*" MaintenanceRecord : проходит ТО
Tariff "1" --> "0..*" Rental : применяется
RentalService --> DataStorage : использует
Rental --> TariffCalculator : расчёт
      

Краткое описание классов:

3.4. Схема взаимодействия модулей

sequenceDiagram
  participant U as Пользователь
  participant UI as Интерфейс
  participant RS as RentalService
  participant DS as DataStorage
  participant TC as TariffCalculator

  U->>UI: Выбрать "Создать аренду"
  UI->>RS: Запрос создания аренды (данные клиента, инвентаря, тарифа)
  RS->>DS: Проверить доступность инвентаря
  DS-->>RS: Статус "доступен"
  RS->>TC: Рассчитать стоимость (startAt, tariff)
  TC-->>RS: Возврат суммы
  RS->>DS: Сохранить договор в rentals.json
  DS-->>RS: Подтверждение
  RS-->>UI: Успешно создан договор
  UI-->>U: Отображение информации и сумма аренды
      

3.5. Особенности архитектуры и проектных решений