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. Слой источников данных >>