Link Search Menu Expand Document

Акторы и обертки

Введение

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