Акторы и обертки
Введение
Данный раздел документации предназначен для описания принципов работы с акторами (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.