Глава 14. Типовые решения, предназначенные для представления данных в Web 399
Если в качестве представлений используются страницы сервера, для вызова представ-
ления можно применить имя соответствующей страницы. Если же представление являет-
ся классом, стоит подумать о хранении команды или строки для применения метода
отражения. И наконец, представление может быть таблицей стилей XSLT, ссылка на ко-
торую в виде строки будет храниться в контроллере приложения.
Разрабатывая контроллер приложения, необходимо подумать о том, насколько он дол-
жен быть отделен от остальной части слоя представления. При этом необходимо учесть,
зависит ли от контроллера приложения аппарат пользовательского интерфейса. Возмож-
но, контроллер напрямую осуществляет доступ к данным из HTTP-сеанса, передает
управление странице сервера или вызывает методы класса толстого клиента.
Что касается меня, то я отдаю предпочтение контроллерам приложения, не связанным
с аппаратом пользовательского интерфейса. Прежде всего это позволяет тестировать кон-
троллер приложения независимо от пользовательского интерфейса, что уже само по себе
очень удобно. Кроме того, это дает возможность использовать один и тот же контроллер
приложения с несколькими интерфейсами. В связи с этим многие разработчики рассмат-
ривают контроллер приложения как промежуточный слой между представлением и пред-
метной областью.
Приложение может иметь несколько контроллеров приложения, управляющих его
составными частями. Благодаря этому сложная логика выбора интерфейсных экранов
может быть распределена по нескольким классам. В подобных случаях я рекомендую
создавать отдельный контроллер приложения на каждую область пользовательского ин-
терфейса. Более простому приложению достаточно и одного контроллера.
Если у приложения есть несколько представлений, например Web-интерфейс, тол-
стый клиент и интерфейс для отображения на карманном компьютере, можете приме-
нить к каждому из них один и тот же контроллер приложения, но не перестарайтесь. За-
частую для получения действительно удобных интерфейсов каждому из них нужен свой
порядок отображения экранов. Впрочем, повторное использование одного и того же кон-
троллера приложения способно настолько сократить объем работы, что может вполне оп-
равдать не слишком удобный пользовательский интерфейс.
Очень часто механизм пользовательского интерфейса рассматривают как модель со-
стояний, в котором конкретные события могут инициировать различные отклики, в за-
висимости от состояния определенных объектов приложения. В этом случае для пред-
ставления управляющей логики модели состояний удобно использовать метаданные.
Эти метаданные могут задаваться средствами языка программирования (самый простой
способ) или же храниться в отдельном файле настроек.
Иногда в контроллер приложения помещают логику домена, относящуюся к обработке
конкретного запроса. Вообще говоря, я не приветствую подобные решения. Тем не менее
следует признать, что граница между логикой приложения и логикой домена не всегда
поддается точному определению. Предположим, я обрабатываю заявления о медицин-
ском страховании и должен отобразить дополнительное окно с набором вопросов только
в том случае, если заявитель — курильщик. Что это — логика приложения или логика до-
мена? Если таких случаев не слишком много, я могу вынести эту логику в контроллер
приложения, однако если подобные ситуации возникают по ходу всего приложения, при-
дется реализовать их обработку в модели предметной области (Domain Model, 140).