Предисловие

Мы часто слышим фразу «объясни мне, как будто мне 5 лет». Еще вчера я наткнулся на интересный пост от разработчиков с таким заголовком. Некоторое время я хотел написать о том, чтобы «перевернуть» эту фразу, чтобы «подумать об этом, как будто вам пять». Пятилетние дети могут отлично учиться и могут быть экспертами в простом мышлении. Их лаконичность позволяет им быть чрезвычайно эффективными и действенными в получении именно того, чего они хотят.

По мере того, как мы все становимся старше, наши языковые навыки улучшаются, и мы все заботимся о формальностях и манерах. Итак, если мы видим, что друг ест шоколадный батончик, и мы хотим его, мы спрашиваем:

"Привет как дела? Этот шоколадный батончик выглядит восхитительно? Можно мне кусок? »

А ребенок просто говорит:

"Конфета, шоколадный батончик!"

Даже если взрослый, держащий шоколадный батончик, ответит: «Что ты скажешь?» ребенок по-прежнему говорит: «Кенди-бар!». Взрослый отвечает: «Скажите пожалуйста» (и все равно дает ребенку шоколадный батончик!), А ребенок смеется: «Нет, скажите пожалуйста».

Взрослый должен заботиться о формальностях, поскольку это способ проявить уважение к другим людям. Взрослый знает, что, если он не проявит уважения, задав свой вопрос, он может закончить с пустыми руками ... и, возможно, получит ответ типа «черт возьми». С другой стороны, ребенок получает бесплатный пропуск, потому что в этот момент он может не знать ничего лучше. Удачливый малыш!

Кажется, что этот образ мышления взрослого иногда переносится на то, как мы программируем, и может сделать нас менее эффективными, из-за чего мы слишком озабочены формированием сообщения, когда на самом деле нас беспокоят только данные. Мы можем забыть, что когда мы разговариваем с машиной, а не с человеком, мы можем меньше беспокоиться о манерах и просто говорить машине, что мы хотим.

Приближаемся к GraphQL как пятилетний ребенок

Когда я впервые взглянул на GraphQL, мне показалось привлекательным, что как разработчик я мог сосредоточиться в первую очередь на данных, а не на формальностях для получения этих данных (потому что написание подробных списков маршрутов API никогда не было той работой, на которую я подписывался). Я также был немного напуган, потому что не был полностью уверен, готов ли я принять совершенно другой образ мышления. К счастью, «совершенно другой образ мышления» на самом деле потребовал от меня упростить свой ум до 5-летнего.

Давайте перенесем сюда пример с шоколадным батончиком, чтобы объяснить, как детское мышление облегчает жизнь.

Взрослый мозг, поступающий из RESTful API, вероятно, будет думать примерно так:

http.get(‘/?candybar=kitkat&size=kingSize’).then(handleResp)

Взрослый должен иметь дело с протоколом «http», специальными символами «&», «=» и знать, как их правильно расположить. И нужно помнить «.then».

Взрослый человек с SQL-мышлением, вероятно, структурирует запрос следующим образом:

SELECT * FROM CANDYBARS WHERE CANDYBAR=”kitkat” AND SIZE=”kingSize”

Взрослый должен интересоваться именами таблиц и столбцов. Взрослый должен знать * табличную * структуру данных. Чтобы получить только один моноблок, нужно много печатать. Да, и слова «ВЫБЕРИТЕ», «ГДЕ», «ОТ», «И» ... это все на английском ... так что, если английский не является родным языком взрослого, запрос становится для нее немного сложнее для понимания ...

А ребенок, скорее всего, просто попросит конфету как можно скорее:

candybar = ‘kitkat’
size = ‘kingSize’

Гораздо проще, правда ?? Этот фрагмент на самом деле не является GraphQL, но он довольно близок. Так я начал учиться. В то время я думал: «Хорошо, GraphQL, ты говоришь, что ты просто о данных, мы сделаем это именно об этом». Я немного усовершенствую свой запрос, чтобы он соответствовал тому, как, по моему мнению, должен выглядеть JSON-подобный запрос, потому что я думаю, что это именно то, что вы ожидали: возможно, фигурные скобки и запятая.

{
 candybar: ‘kitkat’,
 size: ‘kingSize’
}

Э… если подумать… опустите запятую, потому что пятилетний ребенок не всегда так озабочен пунктуацией, как ее эффективностью.

Имея в наличии ментальную парадигму, мне пора было заняться другой вещью, которую пятилетний ребенок умеет лучше всего: поиграть с ней. К счастью, онлайн-инструмент Interactive GraphQL« GraphiQL ] оказался чрезвычайно бесценным. Никакой настройки или аутентификации не требуется. Все, что мне нужно было сделать, это просто перейти к нему, и он был готов для моего ввода.

На этой игровой площадке я смог попробовать приведенный выше фрагмент в панели кодирования и сразу понял, что синтаксис отключен. Панель «результатов» сообщила мне, какие были ошибки, а дальнейшее изучение правого верхнего угла показало, какие схемы были доступны. Итак, в конце концов, с небольшими изменениями (и да, прочитав документацию), я узнал, что вышеуказанный запрос нужно было бы написать так:

{ // ← NOTE: the word “query” is optional and can be omitted;
  // GraphQL treats this as a query by default. Pretty cool,right?
 candyBars (candyBar: ‘kitkat’, size: ‘kingSize’) { 
             // ^^ query params   ^^
   candyBar // ← include in resp back to me
   size // ← include in resp back to me
 }
}

Но пятилетнему ребенку может потребоваться еще больше информации, даже если фактические параметры останутся неизменными. В GraphQL это было легко сделать:

query {
 candyBars (candyBar: ‘kitkat’, size: ‘kingSize’) { 
   id // ← Makes life easier. See mutations below.
   candyBar
   size
   /* Extra props here: */
   shape // ‘rectangle’
   wrapperColor // ‘red’
   wrapperHasCartoon // true
   /* ← keep typing…GraphiQL has intellisense… → */
   /* type until you get the prop you want. */
 }
}

Это касается запросов, но как насчет изменения состояния моноблока? Пятилетний ребенок может захотеть откусить хороший кусок. Итак, мои мысли изначально были примерно такими:

update (id: 123, pctBitten: “50%”) {
 size // respond with new size
}

Итак, в GraphQL слово не «обновление», а «мутация». После небольшой дополнительной настройки фрагмент выглядит следующим образом:

mutation {
 biteCandyBar(id: 123, pct: “50%”) { // mutations are labeled
   size // respond with new size
 }
}

Несмотря на то, что слово «мутация» является более типичным, чем «обновление», и может даже выходить за рамки словарного запаса пятилетнего ребенка, блок внутри мутации может быть ближе к мысли пятилетнего ребенка. То есть выполняемая мутация - «biteCandyBar». Это также позволяет упростить параметр с «pctBitten» до «pct». Предполагается, что «pct» относится к «pctBitten» из-за метки мутации.

Заключение

Хорошо, да, GraphQL - это гораздо больше, чем я описал. Это лишь верхушка на поверхности, и, чтобы стать экспертом в этом вопросе, ответственный разработчик, вероятно, прочитает документацию всесторонне. Однако, чтобы намочить ноги, я умоляю вас думать, как будто вам 5 лет! Это может очень хорошо уменьшить ваш первоначальный страх.