Паттерн «объект-представление»
фото: shuttermanic
17 октября 2012 года Bryan Helmkamp, основатель Code Climate написал
пост описывающий 7 паттернов для рефакторинга толстых ActiveRecord
-моделей
в Ruby on Rails. Здесь, в Crush & Lovely, у всех Rails-разработчиков этот пост
является основным ориентиром для написания модульного, лаконичного, выразительного
и тестируемого кода.
В этой серии статей мы расскажем о подобных концепциях в JavaScript. Как и работа Bryan Helmkamp, эта серия так же применима к моделям данных, и не менее полезна. В этом посте обсудим паттерн «объект-форму.
Паттерны рефакторинга JavaScript-приложений
- Объект-значение
- Объект-сервис
- Объект-форма
- Объект-запрос
- Объект-представление
- Объект-политика
- Декораторы
Объект-представление
Лучше всего храненить логику и атрибуты необходимые только для формирования представления (HTML в обычных сайтах или JSON в API) вне моделей. Хранение специфичной информации непосредственно в модели создает путаницу в том, что является «настоящими» данными модели (и хранится в базе), а что требуется только для представления. Объект-представление работает как адаптер между «настоящими» данными модели и представлением этих данных.
Представим, например, модель товара с атрибутом price
,
который хранится в базе со значением 599
центов, но в представлении
продукта значение изменяется на $5.99
. С одной стороны, хранить это значение
как второй атрибут price
в модели совсем не правильно. С другой, также неправильно
включать логику форматирования в шаблон.
Объект-представление «одевает» данные модели, трансформируя, добавляя или удаляя значения, и возвращая новый объект для использования в слое представления. Этот подход создает хорошее место для логики и атрибутов, связанных с представлением и не смешивает их со свойствами модели.
Я хочу отметить, что существуют различные мнения о том, что именно подразумевается под этим паттерном. Helmkamp упоминает об этом в оригинальной статье, да и у нас в Crush & Lovely это частая тема для споров — наши инженеры предпочитают не употреблять название «объект-представление», в основном, потому что обычно под представлением имеют в виду HTML, а этот паттерн может использоваться и для формирования ответа API, и для передачи данных внешним сервисам и любыми другим способами. Мы предпочитаем название «Presenter», в первую очередь потому что это имя хорошо отражает суть паттерна — формирование представления данных, вне зависимости от их конечной формы.
Пример
К примеру, возмем конец года, когда преподаватели печатают отчеты по каждому студенту. Кроме различной информации, отчет содержит среднюю оценку студента, информацию о том, переведен ли он на следующий курс, и его номер телефона.
Скрипт для генерации отчетов находит каждого студента и оценки которые он получал в течение года, создавая «настоящее» представление объекта:
PDF-верстка отчета «глупа» и ничего не знает о форматировании данных:
Формирование данных студента для представления станет проще если мы воспользуемся объектом-представлением, который, после создания, передадим прямо в шаблон. Вот пример того, как должен выглядеть объект-представление «одевающий» модели наших студентов для использования в шаблоне:
Так что, все, что нужно сделать — взять данные студентов и передать их в представление для рендеринга:
Нужно отметить отилчную возможность извлечь часто используемые метобы объекта-представления, такие как форматирование телефонного номера и вынести их в модули или хелперы, которые могут быть использованы в других объектах-представления, делая ваше приложение более модульным. Возможности для организации кода при использовании объектов-представлений открыты и гибки, так что каждый инженер должен взглянуть на свой собственный стиль, для того, чтобы получить лучший результат.
Тестирование
Юнит-тесты для проверки изменений данных на удивление прямолинейны, так как все, что вам нужно сделаеть — передать сквозь объект-представление один объект или массив а затем получить другой на выходе. Остается только проверить корректрость обработанных данных.
В следующем посте мы рассмотрим объекты-политики, которые представляют отличные инструменты для инкапсуляции бизнес-логики.
фото: shuttermanic
Подписывайтесь на РСС. Всем добра!
Похожие статьи:
-
Паттерн «объект-запрос»
7 паттернов для рефакторинга JavaScript-приложений
-
Паттерн «объект-форма»
7 паттернов для рефакторинга JavaScript-приложений
-
Паттерн «объект-сервис»
7 паттернов для рефакторинга JavaScript-приложений
-
Паттерн «объект-значение»
7 паттернов для рефакторинга JavaScript-приложений
-
Чейнинг
или Как сделать код проще, добавив одну строчку
-
Музыка для работы #5
Немного мурашек по спине…