Паттерны распределенной обработки данных (Distribution Patterns) PoEAA
Интерфейс удаленного доступа (Remote Facade)
Предоставляет интерфейс с низкой степенью детализации для доступа к объектам, имеющим интерфейс с высокой степенью детализации, в целях повышения эффективности работы в сети.
Паттерн Remote Facade в объектно-ориентированной модели улучшает работу с маленькими объектами, у которых маленькие методы. Маленькие методы открывают большие возможности для контроля и изменения поведения, а также для улучшения понимания клиентом работы приложения. Одно из последствий такого "мелко-молотого" поведения в том, что обычно происходит много взаимодействий между объектами с вызовом множества методов.
Принцип действия
Интерфейс удаленного доступа решает проблему распределенной обработки данных путем применения стандартного подхода объектно-ориентированного программирования, предполагающего разделение разных обязанностей между различными объектами.
В простых случаях, например для объекта, представляющего почтовый адрес, интерфейс удаленного доступа заменяет обычные get- и set-методы объекта одним get-методом и одним set-методом, известными как функции массового доступа (bulk accessors). Когда удаленный клиент вызывает такой set-метод, Remote Facade считывает параметры, переданные этому методу, после чего последовательно вызывает отдельные, "настоящие" set-методы объекта Address (см. картинку ниже)
Важно помнить, одна из грубейших ошибок, которые допускают архитекторы и разработчики при реализации интерфейса удаленного доступа (Remote facade), — это помещение в него логики домена. Запомните: интерфейс удаленного доступа не содержит логики домена. Как и любой другой интерфейс, он должен представлять собой всего лишь простую оболочку с минимальным количеством функций.
Назначение
Remote facade целесообразно применять во всех случаях, касающихся предоставления удаленного доступа к объектам с высокой степенью детализации. Это позволит оптимизировать скорость работы в сети, что присуще объектам с низкой степенью детализации, и в то же время сохранит все преимущества объектов с высокой степенью детализации. Таким образом, вы получаете все самое лучшее, что есть и у тех и у других.
В большинстве случаев описанные ситуации возникают при работе с процессами, запущенными на разных машинах. Между тем расходы на межпроцессный вызов в пределах одного компьютера также весьма велики. Поэтому интерфейс с низкой степенью детализации необходимо использовать для всех межпроцессных взаимодействий, независимо от того, где запущены эти процессы.
Объект переноса данных (Data Transfer Object)
Шаблон Data Transfer Object применяется для переноса данных между процессами в целях уменьшения количества вызовов.
При работе с удалённым интерфейсом, таким как, например: Remote Facade, каждый запрос к нему достаточно затратен. В результате, приходится уменьшать количество вызовов, что означает необходимость передачи большего количества данных за один вызов. Чтобы реализовать это, как вариант, можно использовать множество параметров. Однако, при этом зачастую код получается неуклюжим и неудобным. Также это часто невозможно в таких языках, как Java, которые возвращают лишь одно значение.
Решением здесь является паттерн Data Transfer Object, который может хранить всю необходимую для вызова информацию. Он должен быть сериализуемым для удобной передачи по сети.
Современному разработчику сложно представить код без DTO'шек. Но сам концепт DTO был придуман еще в далеких 2000х.