5. Слой бизнес логики - MaxCiv/LibraryArchitecture GitHub Wiki

В качестве решения организации бизнес-логики была выбрана модель предметной области (Domain Model). Была создана сеть взаимосвязанных объектов, где каждый объект наделён функциями, соответствующими его природе. Это даёт следующие преимущества:

  • логика распределяется между объектами;
  • сложность алгоритмов перетекает в связи между объектами;
  • система становится масштабируемой.

Стоит отметить, что к минусам данной модели относится то, что множество связей затрудняют понимание принципа работы системы, такую систему сложнее реализовать, нужны определённые навыки работы с объектно-ориентированным программированием.

Объекты в такой системе предоставляют сервисы (методы) другим объектам и создаются во время исполнения программы на основе определения классов объектов. Объекты скрывают информацию о представлении состояний и, следовательно, ограничивают к ним доступ.

Бизнес-логика в данном проекте представлена в пакете businesslogic. Здесь присутствуют такие объекты предметной области, представленные следующими классами:

  • Librarian — библиотекарь;
  • Reader — читатель;
  • Supplier — поставщик;
  • Book — книга;
  • BookBorrow — выдача книги на время читателю;
  • BookExchange — обмен книгами между читателями;
  • BookOrder — заказ книги поставщику.

Рассмотрим эти классы подробнее.

Пакет businesslogic.entities.users

Диаграмма классов пакета:

  • Интерфейс User определяет базовые методы для всех пользователей:

    • Boolean logIn(String realPassword) — выполнение входа в систему;
    • Role getRole() — получение роли пользователя;
    • void encryptAndSetPassword(String realPassword) — получить реальный пароль, получить хэш SHA-1 этого значения и записать пользователю в поле пароля;
    • getId(), setId(int id), getLogin(), setLogin(String login), getPassword(), setPassword(String password), getName(), setName(String name) — геттеры и сеттеры полей пользователя.
  • Абстрактный класс AbstractUser реализует базовые методы всех пользователей и определяет следующие поля:

    • int id — идентификатор пользователя;
    • String login — логин;
    • String password — хэш SHA-1 реального пароля пользователя;
    • String name — имя.
  • Класс Librarian библиотекаря содержит следующие методы:

    • Book addNewBook(Repository repository, String title, String author, String publisher, int publishYear, int statusInt, int ownerId) — добавление новой книги в базу библиотеки;
    • User addNewUser(Repository repository, String login, String password, String name, String role) — добавление нового пользователя в базу данных библиотеки;
    • BookOrder openNewOrder(Repository repository, int bookId, int supplierId) — создание нового заказа на книгу;
    • BookBorrow confirmBorrowing(Repository repository, Object bookBorrow) — выдача книги читателю;
    • BookBorrow closeBorrowing(Repository repository, Object bookBorrow) — возвращение библиотечной книги в библиотеку;
    • BookExchange confirmExchange(Repository repository, Object bookExchange) — выдача книги по обмену читателю;
    • BookExchange closeExchange(Repository repository, Object bookExchange) — возвращение книги по обмену в библиотеку.
  • Класс Reader содержит следующие методы:

    • BookBorrow borrowBook(Repository repository, Object book) — запросить книгу в библиотеке;
    • BookExchange getBookByExchange(Repository repository, Object bookExchange) — запросить книгу по обмену в библиотеке;
    • BookExchange openExchange(Repository repository, Object bookExchange) — выставить свою книгу на обмен в библиотеке;
    • BookExchange closeExchangeAndTakeBook(Repository repository, Object bookExchange) — закрыть обмен и забрать книгу из библиотеки;
    • int getCountAvailableExchangeBook() — получить оставшееся количество книг, которые можно взять по обмену.
  • Класс Supplier содержит следующие методы:

    • BookOrder finishOrder(Repository repository, Object bookOrder) — успешно завершить поставку и передать книгу в библиотеку;
    • BookOrder denyOrder(Repository repository, Object bookOrder) — отказаться от заказа.

Пакет businesslogic.entities

  • В данном пакете содержится один класс объекта книги — Book. Класс содержит следующие поля:
    • int id — идентификатор книги;
    • String title — название;
    • String author — авторы;
    • String publisher — издатель;
    • int publishYear — год издания;
    • Status status — статус книги (библиотечная, на обмене, на поставке);
    • Condition condition — состояние книги (в библиотеке, у читателя, недоступна, возвращена владельцу, книга на обмене и ждёт читателя, книга заказана поставщику).

Пакет businesslogic.entities.libraryrecords

Диаграмма классов пакета:

  • Интерфейс BookRecord содержит объявление базовых методов всех действий с книгами:

    • getId(), setId(int id) — получить/установить идентификатор;
    • getBook(), setBook(Book book) — получить/установить книгу, над которой проводится действие;
    • getStartDate(), setStartDate(Date startDate) — получить/установить дату начала действия;
    • getEndDate(), setEndDate(Date endDate) — получить/установить дату окончания действия.
  • Абстрактный класс AbstractBookRecord реализует базовые методы всех действий над книгами и определяет следующие поля:

    • int id — идентификатор;
    • Book book — книга, над которой проводится действие;
    • Date startDate — дата начала действия;
    • Date endDate — дата окончания действия.
  • Класс BookBorrow описывает действие "Выдача книги читателю" и содержит дополнительное поле читателя Reader reader.

  • Класс BookExchange описывает действие "Обмен книг между читателями" и содержит следующие дополнительные поля:

    • Reader owner — владелец книги;
    • Date openExchangeDate — дата, когда владелец выставляет книгу на обмен;
    • Reader reader — читатель, который берёт книгу.
  • Класс BookOrder описывает действие "Заказ на поставку книги" и содержит дополнительное поле поставщика Supplier supplier.

Для тестирования бизнес-логики были написаны JUnit тесты (находятся в модуле test, пакете businesslogic.entities.users):

  • LibrarianTest — класс для проверки методов библиотекаря;
  • ReaderTest — класс для проверки методов читателя;
  • SupplierTest — класс для проверки методов поставщика.

<< 4. Диаграммы последовательности | 6. Слой источников данных >>