Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

HseBank

Функционал

Основной функционал

  • Создание, редактирование, удаление счетов (BankAccount)
  • Создание, редактирование, удаление категорий (Category)
  • Создание, откатывание (удаление) операций по счетам (Operation)
  • Автоматическое применение изменений баланса счёта при новой операции
  • Возможность перерасчёта баланса всех счетов при обнаружении несоответствия / ошибки (путём вызова соответствующей функции)
  • Хранение БД (репозиториев) локально в виде JSON файликов (может быть легко изменено в будущем)

Примечание: операции считаются неизменяемыми и не могут быть отредактированы. Откатывание операции происходит путём создания новой операции, которая отменяет предыдущую. При этом и исходная, и откатывающая операция удаляются из истории и репозитория. Для изменения операции рекомендуется откатить операцию и пересоздать её

Дополнительный функционал

  1. Аналитика по
    • доходы минус расходы (GetNetIncome)
    • группировка по категориям, все доходы минус все расходы категории (GetTotalsGrouped)
    • самая крупная категория по расходам (GetTopSpending)
    • самая крупная категория по доходам (GetTopEarning)

    вся аналитика считается по выбранному периоду (дата+время) и выбранным счетам (можно выбрать несколько)

  2. Импорт данных из Json, YAML, CSV
  3. Экспорт данных в Json, YAML, CSV

    Экспорт в CSV реализован путём экспорта трёх разных таблиц в три разных файла (с фиксированными названиями) в одной папке, путь к которой указывается приложением

  4. Статистика по времени исполнения пользовательских сценариев (команд)
  5. Кэширование данных БД в ОЗУ через прокси-обертку над основным репозиторием
  6. Абстрагирование от файловой системы через IFileAccessor, IDirectoryAccessor. Позволяет использовать, например, S3 хранилища без модификации кода

Применение SOLID и GRASP

SOLID

  1. Single Responsibility Principle
    • BankAccountFacade - только работа со счетами
    • CategoryFacade - только работа с категориями
    • OperationFacade - только работа с операциями
    • AnalyticsFacade - только аналитика по счетам/категориям/операциям, не изменяет ничего из перечисленного
    • IRepositoryCrud и его реализации - хранение данных (счета, категории, операции)
    • IFileAccessor и IDirectoryAccessor - взаимодействие с файловыми системами (необязательно локальными, можно и с S3, облачными хранилищами)
  2. Open Closed Principle
    • легко добавить новый формат экспорта данных (новый IExportVisitor) без редактирования остального кода
    • легко добавить новый формат импорта (новый наследник BankSystemImporter) без редактирования остального кода
    • новая аналитика - новая стратегия аналитики IAnalyticStrategy
    • можно добавить реализацию для любого интерфейса, не меняя его код (и код тех, кто его использует)
  3. Liskov Substitution Principle
    • все реализации одного интерфейса взаимозаменяемы, например, JsonExportVisitor, YamlExportVisitor могут быть использованы там, где ожидается IExportVisitor. то же самое и с наследниками BankSystemImporter, CachedRepository и JsonFileRepository и т.д.
  4. Interface Segregation Principle
    • IEntity, IRepositoryCrud, IExportVisitor, IBankSystemFactory - все эти интерфейсы раздельны, классы могут использовать (или реализовывать) только нужные
    • интерфейсы узкоспециализированы
  5. Dependency Inversion Principle
    • код зависит от абстракций (IRepositoryCrud, IBankSystemFactory, ICommand), а не от реализаций
    • зависимости внедряются через конструкторы
    • консольное приложение использует DI контейнер (из Microsoft.Extensions.DependencyInjection) для управления зависимостями, их сроками жизни

GRASP

  1. Controller
    • Фасады (BankAccountFacade, CategoryFacade, OperationFacade и т.д.) и команды (реализации ICommand) являются контроллерами разных уровней (фасады для прикладного, команды для пользовательских сценариев)
  2. Creator
    • Создание сущностей и валидация параметров происходит через фабрики (реализации IBankSystemFactory)
  3. High Cohesion
    • Storage - отвечает за хранение данных (репозитории, хранилища основанные на файлах - FileBased)
    • Domain/Model - доменные сущности
    • Service - фасады с бизнес логикой, используют репозитории и фабрики
  4. Low Coupling
    • Компоненты связаны через интерфейсы, а не через реализации
    • Для управления зависимостями используется DI контейнер
    • Хранилище изолировано от основного кода (может быть использована любая БД)
  5. Pure Fabrication
    • Команды (реализации ICommand)
    • Строитель операций (OperationBuilder)

Паттерны GOF

  1. Фасад
    • Где: BankAccountFacade, CategoryFacade, OperationFacade, AnalyticsFacade
    • Зачем: Единый интерфейс для группы похожих операций, сокрытие внутренней логики
  2. Фабрика
    • Где: BankSystemFactory
    • Зачем: Централизация создания объектов, валидация параметров, корректность состояния объектов, инкапсулирует логику создания случайного ID (через Guid.NewGuid())
  3. Команда
    • Где: ICommand и его реализации в Command/
    • Зачем: Инкапсулировать действия (пользовательские сценарии), единый интерфейс работы с ними и выполнения, возможность подключать дополнительные метрики (время работы, логирование) через декораторы
  4. Декоратор
    • Где: TimePrintingCommandDecorator
    • Зачем: Добавить функциональность командам (вывод времени работы) без изменения основного кода
  5. Шаблонный метод
    • Где: BankSystemImporter и его наследники в Import/
    • Зачем: Основная логика процесса (сохранение импортированных данных в репозиторий и их валидация) в BankSystemImporter и вариативная часть (чтение, десериализация) в наследниках
  6. Посетитель
    • Где: IExportVisitor и его реализации в Export/
    • Зачем: Добавление новой логики классов без изменения их кода.
  7. Прокси
    • Где: CachedRepository
    • Зачем: Ускорить считывание данных из БД путём кэширования. Может работать с любым репозиторием (наследник IRepositoryCrud) без изменения его кода и кода клиентов
  8. Стратегия
    • Где: IAnalyticStrategyи его реализации, возможно, некоторые другие интерфейсы
    • Зачем: Семейство взаимозаменяемых алгоритмов со схожим интерфейсом. Стратегии аналитики использует AnalyticsFacade, использует нужную стратегию, может их комбинировать
  9. Строитель
    • Где: OperationBuilder
    • Зачем: Более удобное и поэтапное создание операций (у них много аргументов). Есть удобные вариации некоторых шагов (например, RightNow() автоматически проставит текущую дату/время, не нужно самому её передавать)

Не GOF, но тоже паттерн

  1. Repository
  • Где: IRepositoryCrud и его реализации: JsonFileRepository, CachedRepository
  • Зачем: Отделить домен от способов хранения данных, абстракция доступа к ним

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

  1. Клонировать репозиторий проекта
  2. Запустить dotnet build
  3. Скопировать папку import из корня в папку, в которой находится исполняемый файл (.exe). Необходимо для показа импорта в демке
  4. Запустить dotnet run --project HseBank

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages