Паттерн «объект-запрос»
фото: shuttermanic
17 октября 2012 года Bryan Helmkamp, основатель Code Climate написал
пост описывающий 7 паттернов для рефакторинга толстых ActiveRecord
-моделей
в Ruby on Rails. Здесь, в Crush & Lovely, у всех Rails-разработчиков этот пост
является основным ориентиром для написания модульного, лаконичного, выразительного
и тестируемого кода.
В этой серии статей мы расскажем о подобных концепциях в JavaScript. Как и работа Bryan Helmkamp, эта серия так же применима к моделям данных, и не менее полезна. В этом посте обсудим паттерн «объект-форму.
Паттерны рефакторинга JavaScript-приложений
- Объект-значение
- Объект-сервис
- Объект-форма
- Объект-запрос
- Объект-представление
- Объект-политика
- Декораторы
Объект-запрос
Запросы к базам данных, даже самые простые, могут быть большими и сложными для чтения и понимания. Более сложные запросы, особенно те, которые взаимодействуют с несколькими коллекциями или таблицами, тяжело не только писать, но и поддерживать.
Паттерн «объект-запрос» обеспечивает хороший инструмент для отделения логики запросов и связанных с ними операций в отдельный модуль. Такое разделение позволяет получить горяздо более поддерживаемую и читаемую структуру, а так же обеспечивает очень понятный API для кода, использующего объект-запрос.
Пример
Давайте представим какой-нибудь метод API, который возвращает список всех студентов, перешедших на следующий курс, в JSON-формате.
Без использования объекта запросов у нас могла бы быть функция в API-контроллере или объект-сервис, как в примере ниже. Стоит отметить, что
DetermineStudentPassingStatus
я взял из статьи об объекте-сервисе.
Мы сейчас не просто спустились на последние круги коллбек-ада, мы написали код, который очень сложно прочитать. Благодаря объекту запросов, мы можем создать гораздо более выразительный модуль.
Сгруппировав все связанные с запросом операции, мы получили более организованную структуру и создали выразительный API, который удобно использовать в приложении. Например, в виде контроллера ExpressJS:
Данные, которые возвращает этот метод API будут простой строкой, полученной из хранилища данных, без какой-либо обработки. Зачастую, это не совсем то, что нам нужно. В этом примере, объект-запрос может быть объеденен с объектом-представлением (о котором мы напишем в следующей части). Объект-представление обеспечивает единое место для трансформации объекта перед показом пользователю.
Есть еще одна вещь, которую хочется отметить. Паттерн «объект-запрос»
открывает очень интересные возможности композиции. К примеру, в коде
приложения может быть много мест, где вам понадобится получить все оценки
определенной группы студентов, и в этом случае мы можем вынести эту
операцию в отдельный объект-запрос, and use it in the
#fetchAssignmentsForCurrentStudents
method.
Тестирование
Создание объекта-запроса вне контекста его использования позволяет легко покрывать его тестами. Если вы используете тестовую базу данных, все что вам нужно — загрузить необходимые данные в базу для того, чтобы обеспечить ожидаемые результаты при выполнении запросов. Остается только убедиться в том, что результаты корректные
В следующем посте мы обсудим объект-представление — отличный инструмент для изоляции преобразований данных модели в их представление.
Подписывайтесь на РСС. Всем добра!
фото: shuttermanic
Похожие статьи:
-
Паттерн «объект-представление»
7 паттернов для рефакторинга JavaScript-приложений
-
Паттерн «объект-форма»
7 паттернов для рефакторинга JavaScript-приложений
-
Паттерн «объект-сервис»
7 паттернов для рефакторинга JavaScript-приложений
-
Паттерн «объект-значение»
7 паттернов для рефакторинга JavaScript-приложений
-
Чейнинг
или Как сделать код проще, добавив одну строчку
-
Музыка для работы #5
Немного мурашек по спине…