Этот проект представляет собой консольное приложение для управления личными финансами. Приложение позволяет управлять счетами, категориями доходов и расходов, а также финансовыми операциями.
- Управление сущностями: Создание и удаление банковских счетов, категорий и операций.
- Импорт данных: Поддержка импорта данных из файлов формата
CSV,JSONиYAML. - Экспорт данных: Поддержка экспорта всех данных в файлы формата
CSV,JSONиYAML. - Статистика: Автоматическое измерение времени выполнения ключевых пользовательских сценариев (команд).
- Консольный интерфейс: Простое и понятное меню для взаимодействия с пользователем.
-
SRP (Single Responsibility Principle): Каждый класс имеет одну, четко определенную зону ответственности.
Models(BankAccount,Category,Operation) отвечают только за хранение данных и базовую валидацию.Factories(BankFactory) отвечает за создание и валидацию объектов.Facades(BankAccountFacadeи др.) предоставляют упрощенный интерфейс для работы с бизнес-логикой.Commands(CreateBankAccountCommandи др.) инкапсулируют логику выполнения конкретных действий.Importers/Exportersотвечают исключительно за логику преобразования данных.
-
OCP (Open/Closed Principle): Система спроектирована так, чтобы ее можно было легко расширять, не изменяя существующий код. Например, для добавления нового формата импорта/экспорта достаточно создать новый класс-наследник
FileImporterили реализовать интерфейсIExporterVisitor. -
DIP (Dependency Inversion Principle): Зависимости между компонентами управляются через DI-контейнер (
Microsoft.Extensions.DependencyInjection). Классы зависят от абстракций (ICommand), а не от конкретных реализаций, что делает систему гибкой и тестируемой. -
High Cohesion & Low Coupling (GRASP): Компоненты системы обладают высокой сплоченностью (выполняют одну задачу) и низкой связанностью (минимально зависят друг от друга).
Для решения поставленных задач были применены следующие паттерны проектирования:
-
Фабрика (Factory)
- Реализация:
BankHSE/Factories/BankFactory.cs - Обоснование: Паттерн используется для централизации процесса создания доменных объектов (
BankAccount,Category,Operation). Это гарантирует, что все объекты создаются в одном месте и проходят необходимую валидацию (например, запрет создания операции с отрицательной суммой).
- Реализация:
-
Фасад (Facade)
- Реализация:
BankHSE/Facade/ - Обоснование: Фасады предоставляют единую, упрощенную точку входа для работы с подсистемами счетов, категорий и операций. Они скрывают внутреннюю логику хранения и управления данными, делая код более чистым и понятным.
- Реализация:
-
Команда (Command)
- Реализация:
BankHSE/Command/ - Обоснование: Каждое действие пользователя (создание счета, удаление категории и т.д.) инкапсулировано в отдельный объект-команду. Это позволяет отделить инициатора запроса от его исполнителя и открывает возможности для дальнейшего расширения (например, для реализации отмены/повтора действий).
- Реализация:
-
Декоратор (Decorator)
- Реализация:
BankHSE/Decorators/TimingCommandDecorator.cs - Обоснование: Декоратор используется для добавления новой функциональности к командам без изменения их исходного кода. В данном проекте он "оборачивает" команды для замера времени их выполнения, что решает задачу сбора статистики производительности.
- Реализация:
-
Шаблонный метод (Template Method)
- Реализация:
BankHSE/Import/FileImporter.cs - Обоснование: Паттерн идеально подошел для реализации импорта данных. Абстрактный класс
FileImporterопределяет общий алгоритм импорта (открытие файла, парсинг, завершение), в то время как конкретные шаги (парсингCSV,JSONилиYAML) делегируются классам-наследникам.
- Реализация:
-
Посетитель (Visitor)
- Реализация:
BankHSE/Export/ - Обоснование: Паттерн позволяет добавлять новые операции к объектам, не изменяя их классы. В проекте он используется для экспорта данных. Доменные модели (
BankAccountи др.) имеют методAccept, который принимает "посетителя" (IExporterVisitor). Конкретные посетители (CsvExporter,JsonExporter) реализуют логику сохранения моделей в нужный формат.
- Реализация:
- Склонируйте репозиторий:
git clone https://github.com/IvanForze/BankHSE
- Запустите приложение: Нажмите
F5или выполните команду:dotnet run --project BankHSE/BankHSE.csproj