Акторы и обертки
Введение
Данный раздел документации предназначен для описания принципов работы с акторами (actors) и их обертками (wrappers).
Описание
Актор - минимальная неделимая функциональная единица во фреймворке SmartActors. Представляет из себя обычный Java-класс. Единственный способ взаимодействовать с актором - вызвать его хэндлер (handler), который через обертку (wrapper) получит необходимые поля из сообщения и совершит над ними определенную работу.
Основная информация о том, как работать с акторами, описана в этой главе. Здесь же описаны принципы работы с акторами и общие рекомендации.
Принципы работы и рекомендации
Наименования
При разработке следует учитывать следующие рекомендации по наименованию:
- В имени актора должно отсутствовать слово
Actor
- Имя актора должно описывать его предназначение
- Название хэндлера должно описывать само действие
- Название обертки описывает предназначение хэндлера, в котором она используется, должна содержать слово
Message
- Название поля обертки должно описывать сущность, которую она ждет
- При регистрации в IoC-контейнере в качестве ключа зависимости не должно использоваться имя актора
Пример
- Имя актора -
PageCriteriaBuilder
- В IoC-контейнере актор зарегистрирован как
"page criteria builder"
- Название хэндлера -
build
- Обертка
BuildPageCriteriaMessage
содержит следующие поля:IObject getSearchCriteria()
- тело критериев поискаInteger getPageSize()
- размер страницыInteger getPageNumber()
- номер страницыvoid setSearchCriteria(IObject)
- возвращает в сообщение тело критериев поиска с добавленным критерием по страницам
Количество хэндлеров
Количество хэндлеров в акторах может варьироваться от одного и до бесконечности, сколько необходимо актору. Но здесь надо учитывать важную деталь - если появляется второй хэндлер, то обычно это знак того, что в акторе есть какое-то состояние, которое должно использоваться в двух хэндлерах. Акторам с состояниями посвящена отдельная глава.
Если же в акторе появляется второй хэндлер, и при этом между двумя хэндлерами нет единого состояния, то второй хэндлер должен быть вынесен в отдельный актор и описан соответствующе.
Обертки для хэндлеров
Обертка - это интерфейс, через который хэндлер взаимодействует с содержимым сообщения. Несмотря на то, что одна и та же обертка может использоваться для разных хэндлеров, у каждой обертки должен быть свой хэндлер.
Т.е. ситуаций, аналогичной той, что приведена ниже, быть не должно
interface BuildObjectMessage {}
public void build(final BuildObjectMessage message)
public void buildEmpty(final BuildObjectMessage message)
Вместо этого, должна быть дописана ещё одна обертка, строго заточенная для другого хэндлера.
interface BuildObjectMessage {}
interface BuildEmptyObjectMessage {}
public void build(final BuildObjectMessage message)
public void buildEmpty(final BuildEmptyObjectMessage message)
Исключения
Исключения предназначены для того, чтобы обозначить, что во время вызова хэндлера что-то пошло не так. Это может быть отсутствие необходимого поля в обертке, некорректный тип зависимости, полученной из IOC и т.д. В общем случае одного исключения должно быть достаточно.
Но бывают случаи, когда для конкретного случая нужно выбросить отдельное исключение, чтобы его можно было обработать в цепочке. Для таких целей пишется специальное исключение, имя которого поясняет цель, по которой было выброшено исключение. Например, если в хэндлере актора происходит проверка на пустоту списка пользователей, то исключение может выглядеть как EmptyUserListException
.