Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Игра «История одной фермы» - увлекательное и бросающее вызов вашим серым клеточкам приключение, от которого невозможно оторваться!

История одной фермы - маджонг

Маджонг, Казуальные, Приключения

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • SergeyKorsun SergeyKorsun 12 постов
  • SupportHuaport SupportHuaport 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня

Java + Программист

С этим тегом используют

Программирование IT IT юмор Обучение Android Python Юмор Картинка с текстом Работа Разработка Все
205 постов сначала свежее
4
mimokrokodilchik
mimokrokodilchik
1 год назад
Серия Деревья

Продолжаем решать деревья. Инвертирование дерева - одна из самых популярных задач⁠⁠

Эта часть является продолжением цикла лекций про деревья. В этой части мы снова воспользуемся рекурсией чтобы инвертировать дерево. Задача довольно популярна и по сложности является довольно простой.

Допустим у нас есть дерево

Допустим у нас есть дерево ниже:

Продолжаем решать деревья. Инвертирование дерева - одна из самых популярных задач IT, Программист, Telegram, Telegram (ссылка), Java

Инвертируем дерево

Целью является инвертировать дерево. Те для каждого узла нужно поменять местами его левый и правый наследники. Логику надо также применять к наследникам наследников.

Продолжаем решать деревья. Инвертирование дерева - одна из самых популярных задач IT, Программист, Telegram, Telegram (ссылка), Java

Давайте проговорим какие этапы нужно продумать:

  • Проитерироватсья по всем узлам рекурсией те нам понадобится функция которая будет вызывать саму себя.

  • Нижние пустые null узлы нужно будет проигнорировать

  • Для всех остальных узлов нужно выполнить смену ссылок для правого и левого наследников

Решение:

Продолжаем решать деревья. Инвертирование дерева - одна из самых популярных задач IT, Программист, Telegram, Telegram (ссылка), Java

Думаю вам тоже задача показалось довольно простой но при этом она является одной из самых частых во время собеседований. В следующей статье мы рассмотрим более сложные случаи. Всем кому интересно - добро пожаловать в мою группу.

Показать полностью 2
[моё] IT Программист Telegram Telegram (ссылка) Java
3
19
mimokrokodilchik
mimokrokodilchik
1 год назад
Лига программистов
Серия Деревья

Используем рекурсию для решения задач на деревья. Ищем максимальную глубину дерева⁠⁠

В прошлой части мы рассмотрели разные подходы рекурсивного обхода дерева. Давайте воспользуемся некоторыми из них для решения довольно известных задач.

Находим максимальную глубину дерева.

Одна из самых популярных и простых задач на деревья - поиск узла находящегося на максимально удаленом расстоянии. Рассмотрим дерево ниже:

Используем рекурсию для решения задач на деревья. Ищем максимальную глубину дерева IT, Программист, Telegram (ссылка), Telegram, Java, Длиннопост

Высота данного дерева - пять

Довольно очевидно что самый длинный узел в данном дереве - M и он является пятым по счету если головной является первым.

Как решать данную задачу используя рекурсию.

Если сильно упрощать то нам нужно сделать 2 действия:

  • Обойти все узлы

  • Каким то образом "сохранять" состояния каждый раз когда мы обходим узлы

Но как же сохранять состояния о той глубине на которой мы побывали? Тут есть как минимум два варианта:

  • Использовать возвращемое значение самой рекурсивной функции и "возвращать" её на уровень выше.

  • Иметь какой то объект в котором мы будем сохранять состояния находясь внутри рекурсии

Воспользуемся первым подходом. Сосредоточимся на следующих аспектах:

  • Рекурсивная функция должна передавать значение сама себе "наверх"

  • Определить какое именно значение должно перебрасываться.

Логика передаваемого "наверх" значения.

  • Самые нижние уровни (те что указывают на null) должны возвращать 0 тк они не включены в расчет глубины данного подграфа

  • Нижний уровень который с листьями имеет лишь null предков должен вернуть 1 тк он является первым уровнем

  • Узел выше чем 1й (те не лист) должен выбирать максимальный уровень из двух его наследников и добавлять 1 тк находится на уровень выше из наибольшего из них.

После данных рассуждений у нас вырисовывается вот такая картина:

Используем рекурсию для решения задач на деревья. Ищем максимальную глубину дерева IT, Программист, Telegram (ссылка), Telegram, Java, Длиннопост

null уровни 0, листья 1 и все остальные узлы - выбирает наибольшее из наследников и добавляют 1.

К чему привели наши рассуждения?

Все эти рассуждения намекают что в нашей итеративной функциии будет 3 разных сценария и функция которая выбирает наибольшее из двух. Именно подобные размышления чаще всего помогают перевести абстрактные размышления в код.

И так первая версия кода:

Используем рекурсию для решения задач на деревья. Ищем максимальную глубину дерева IT, Программист, Telegram (ссылка), Telegram, Java, Длиннопост

Версия рабочая но слишком многословная - хотя для собеседования вполне подойдет.

Самый важная часть кода - итеративный вызов левого и правого поддерева и последующий расчет максимального значения среди них. И конечно же добавление 1 наибольшему из них чтобы учесть и текущую высоту.

Этот код можно было бы улучшить удалив случай когда мы находимся в самом низу - дело в том что если условие истино то возвращаемое значение maxDepth + 1 будет также равно 1.

Спасибо за внимание, всем кому интересна промышленная разработка приглашаю в мой канал.

Показать полностью 2
[моё] IT Программист Telegram (ссылка) Telegram Java Длиннопост
1
142
PerfectMilter
PerfectMilter
1 год назад

6. Повторить⁠⁠

6. Повторить Программирование, Программист, Java, Javascript, Python, IT юмор, IT
Показать полностью 1
Программирование Программист Java Javascript Python IT юмор IT
6
5
mimokrokodilchik
mimokrokodilchik
1 год назад
Серия Деревья

Рекурсивно обходим деревья. Прямой, Центрированый, Обратный обходы⁠⁠

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

Рекурсивно обходим деревья. Прямой, Центрированый, Обратный обходы Telegram (ссылка), Программист, Java, Программирование, IT, Дерево, Длиннопост

Обход деревьев часто ощущается как лабиринт

Давайте рассмотрим уже знакомое дерево:

Рекурсивно обходим деревья. Прямой, Центрированый, Обратный обходы Telegram (ссылка), Программист, Java, Программирование, IT, Дерево, Длиннопост

Прямой обход дерева (Префиксный) - NLR

В прошло части мы уже итерировались по дереву рекурсивно. В нем мы сначала печатали значение узла (Node) затем посещаем левое поддерево (Left) и лишь потом правое поддерево (Right). Такой подход называется прямым или еще префиксным - NLR.

Рекурсивно обходим деревья. Прямой, Центрированый, Обратный обходы Telegram (ссылка), Программист, Java, Программирование, IT, Дерево, Длиннопост

Распечатка значения и последующее движение влево вниз и уже затем вправо.

Центрированный обход дерева (Инфиксный) LNR

Теперь сделаем одно минимальное изменение - сначала мы пойдем в левое поддерево (Left) затем распечатаем значение узла (Node) и потом пойдем в правое поддерево (Right) - этот обход называют Инфиксным (от лат. in внутри fixus закрепленный) или центрированным - LNR. Понятие инфиксный прошло из математики. Если очень упрощать значит что N находится между L и R.

Рекурсивно обходим деревья. Прямой, Центрированый, Обратный обходы Telegram (ссылка), Программист, Java, Программирование, IT, Дерево, Длиннопост

разница лишь в 1 линии но процес "обхода" меняется.

И так вроде рекурсия выполнила ровно такой же обход, но теперь процесс распечатки значения узла мы стали делать после того как уходим "влево". Теперь если задуматься то первая печать произойдет лишь когда мы дойдем до нижнего левого узла. Давайте изобразим как будет выглядеть "обход" а порядок печати значений узлов:

Рекурсивно обходим деревья. Прямой, Центрированый, Обратный обходы Telegram (ссылка), Программист, Java, Программирование, IT, Дерево, Длиннопост

Обратный или Постфиксный обход. LRN

Думаю уже понятно что данный подход подразумевает печать значения узла (Node) после посещения левого (Left) поддерева и правого (Right) поддерева - LRN

Рекурсивно обходим деревья. Прямой, Центрированый, Обратный обходы Telegram (ссылка), Программист, Java, Программирование, IT, Дерево, Длиннопост

Печатаем лишь после обхода левого и затем правого поддеревьев.

Порядок распечатки изображен ниже:

Рекурсивно обходим деревья. Прямой, Центрированый, Обратный обходы Telegram (ссылка), Программист, Java, Программирование, IT, Дерево, Длиннопост

Минимальные изменения - большие последствия.

Изза минимальных изменений (меняя лишь порядок одной строчки) мы получили разные обходы дерева. Это позволит нам решать разные задачи в будущем.

Следующий этап.

В следующей статье мы рассмотрим какие задачи мы можем решать используя описанные подходы. Одна из главных целей цикла статей - помочь преодолеть страх задач про деревья во время собеседований. Думаю стоит повторить еще раз - как только вам прилетела задача на деревья во время собеса начинайте с того что напишите функцию обхода. Большинство алгоритмических задач решается именно через рекурсию (но не только через неё).

Кому интересна промышленная разработка и Java приглашаю в мою группу. Спасибо за внимание.

Показать полностью 6
[моё] Telegram (ссылка) Программист Java Программирование IT Дерево Длиннопост
1
11
mimokrokodilchik
mimokrokodilchik
1 год назад
Серия Деревья

Что такое деревья и как с ними работать. Используем Java⁠⁠

Деревья являются одним из самых пугающих вещей в разработке. Еще хуже дело обстоит, когда программист встречает задачу, связанную с деревьями, во время собеседования. В этой статье я постараюсь минимизировать боль, связанную с этой темой.

Деревья бывают разные. Мы рассмотрим двоичное сбалансированное.

В данной статье мы рассмотрим наиболее популярные — двоичные сбалансированные (красно-черные) деревья.

Что такое деревья и как с ними работать. Используем Java IT, Программист, Telegram, Telegram (ссылка), Дерево, Java, Программирование, Длиннопост

Пример бинарного дерева. У каждого листка может быть не более двух наследников.

Основные понятия.

Рассматривая бинарные деревья нужно знать следующие понятия:

  • Node - он же узел. Это элемент дерева, содержащий какое-то значение, которое может быть любым, от примитива (например, числа) до объекта (например, пользователя).

  • Edge или ребро. Ссылка, соединяющая один узел с другим или указывающая на пустое значение (null).

  • Root Node. Верхний узел дерева, от которого начинается вся структура.

  • Leaf - Узел, не имеющий наследников, то есть находящийся в самом низу иерархии.

  • Высота дерева - Количество "уровней", от корня до самого нижнего узла.

Что такое деревья и как с ними работать. Используем Java IT, Программист, Telegram, Telegram (ссылка), Дерево, Java, Программирование, Длиннопост

Несбалансированные деревья могут выродиться в связный список.

Несбалансированные деревья — это деревья, у которых высота левой и правой веток может значительно отличаться. В худшем случае все узлы могут располагаться по одной стороне. В этом случае дерево деградирует до связного списка.

Что такое деревья и как с ними работать. Используем Java IT, Программист, Telegram, Telegram (ссылка), Дерево, Java, Программирование, Длиннопост

деградированное дерево вырожденное в связанный список.

Сбалансированные деревья.

Сбалансированные (например красно-черные) при каждом добавлении нового узла проверяют, является ли дерево "несбалансированным". Если условие истино то дерево делает "разворот" свои узлов.

Что такое деревья и как с ними работать. Используем Java IT, Программист, Telegram, Telegram (ссылка), Дерево, Java, Программирование, Длиннопост

Пример красно черного сбалансированного дерева. Именно такое используется в TreeMap

Сбалансированные деревья никогда не вырождаются в связанные списки. В J ava джаве деревья представлены коллекцие TreeMap и TreeSet (который инкапсулирует TreeMap внутри себя).

Как могут быть представлены деревья на уровне кода.

Если мы не используем готовые решения вроде TreeMap то простейшее дерево может быть представлено в виде следующего класса:

Что такое деревья и как с ними работать. Используем Java IT, Программист, Telegram, Telegram (ссылка), Дерево, Java, Программирование, Длиннопост

Простейший узел. По большому счету это единственный важный момент.

Итого что мы имеем:

  • String data это то значение которое хранит узел. Это может быть любым объектом - в нашем случае просто строка.

  • Node left - ссылка на левого наследника.

  • Node right - ссылка на правого.

Используя Node класс создадим дерево

Поочередно инициализируем наше дерево с 7 узлами

Что такое деревья и как с ними работать. Используем Java IT, Программист, Telegram, Telegram (ссылка), Дерево, Java, Программирование, Длиннопост

Изобразим полученное дерево:

Что такое деревья и как с ними работать. Используем Java IT, Программист, Telegram, Telegram (ссылка), Дерево, Java, Программирование, Длиннопост

Итерация по дереву - один из самых важных навыков для решения задач.

Большинство (если не все) задач, связанных с деревьями требуют итерации или обхода узлов. Чаще всего, умея обходить дерево, вы решаете львиную часть проблемы. В данной статье мы рассмотрим лишь 1 вариант итерации, я напишу отдельные статьи чтобы рассмотреть другие подходы.

Используем рекурсию для итерации и распечатки всех элементов.

Каждый раз когда вам прилетела задача по деревьям, помните - скорее всего в основании решения будет рекурсия (это не всегда так, но довольно часто). Те у вас будет функция которая будет вызывать сама себя. Для распечатки дерева напишем рекурсию которая обходит все элементы начиная с левого наследника:

Что такое деревья и как с ними работать. Используем Java IT, Программист, Telegram, Telegram (ссылка), Дерево, Java, Программирование, Длиннопост

Код вроде простой но не стоит его недооценивать. Давайте проговорим этапы:

  1. Распечатываем значение узла

  2. Идем к левому наследнику и повторяем действие (те опять распечатываем и идем влево)

  3. после того мы обошли все левые и уткнулись в null мы "возвращаемся" на уровень который находится наверху от нижнего левого и идем в правый наследник

  4. зайдя в правый распечатывем и идем влево повторяя шаги 2-3.

Все это звучит странно проще будет изобразить:

Что такое деревья и как с ними работать. Используем Java IT, Программист, Telegram, Telegram (ссылка), Дерево, Java, Программирование, Длиннопост

Это лишь первая статья но в ней мы ознакомились с основными понятиями. Также мы обошли дерево, используя рекурсию. Это один из самых популярных подходов в решениии подобных задач. В следующей части мы рассмотрим альтернативные варианты работы с деревьями.

Кому интересна разработка приглашаю в мой телеграм канал

Показать полностью 8
[моё] IT Программист Telegram Telegram (ссылка) Дерево Java Программирование Длиннопост
21
13
Аноним
Аноним
1 год назад
Лига программистов

Войти в IT⁠⁠

Собственно, название поста отображает его основную мысль) Есть желание сменить работу на Java-программиста, однако начитавшись постов и проанализировав HH возникают огромные сомнения по поводу нужности очередного стажера/джуна на рынке.

Коротко о бэкграунде: бакалавриат и магистратура по специальности "Автоматизированные системы управления тех.процессом", 5 лет опыта работы инженером-программистом АСУ ТП. Обязанности - разработка ПО для ПЛК(паскалеподобные SCL и ST) и SCADA(VBS, SQL и чуть-чуть C#), настройка ПК, ПНР.

Что делаю: купил курс на Я.Практикуме(да-да, очередной недопрограммист после курсов), когда понял, что у меня остается куча времени, т.к. курс разбит на 2-недельные спринты, а задания я прохожу от силы неделю, докупил еще JavaRush. Параллельно начал изучать Шилдта. В мыслях накидать свой петпроект для реальной задачи на работе - построение относительно простой системы отчетов. Само собой, после изучения Java Core - изучение Git, Maven, Spring и прокачка SQL.

Непосредственно вопрос: насколько реально найти с подобным "послужным" списком работу на должность Java Junior за 3-4 месяца? Город миллионник(не Москва и не Питер), на зп в целом пофиг, понимаю, что первые полгода-год - работа за еду)

Дополнительный вопрос: куда копать, куда не копать, на что следует обращать внимание?

IT Смена работы Программирование Java Программист Текст
56
7
mimokrokodilchik
mimokrokodilchik
1 год назад

Spring Reactive упрощенно⁠⁠

Реактивщина стала поддерживаться Спрингом с 2017 года. Но через 6 лет многие так и не осознали, где её применять и зачем она нужна. А ведь для Спринга это стало целой новой эпохой.

Spring Reactive упрощенно IT, Программист, Java, Telegram (ссылка), Длиннопост

Реактивнища это не изобретение Спринга.

Первое что нужно знать — реактивщина и реактивный подход не являются изобретением Спринга. Наоборот спринг как обычно поглотил очередную технологию, в данном случае Project Reactor

Реактивный дух времени.

Понятие реактивного подхода размыто но в общем подразумевает что приложение будет скорее событийно ориентировано. Давайте рассмотрим простой пример ниже, в котором сравним старый синхроный подход и рективный.

Синхронный блокирующий подход:

Предположим что на мнужно выполнить 3 задачи. В старом синхронном подходе мы получим код который будет запущенным одним потоком поочередно и блокирующе.

Spring Reactive упрощенно IT, Программист, Java, Telegram (ссылка), Длиннопост

синхронный подход

Реактивный подход

Теперь перепишем ту же задачу используя реактивщину, встроенную в JDK еще с Java 9:

Spring Reactive упрощенно IT, Программист, Java, Telegram (ссылка), Длиннопост

Создаем паблишер и отправляем ему 3 задачи.

Различия. Небольшая большая разница.

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

Но почему реактивщина стала с каждым днем становится все более популярней?

Причин довольно много, но я упомяну лишь два наиболее важных (по моему мнению):

  1. Эффективное использование ресурсов (это утверждение истинно только если вы используете неблокирующий код).

  2. Отзывчивость системы (Responsive)

Реактивный + неблокирующий подходы = нефть, золото, греча и, конечно же, акции эппл.

Spring Reactive упрощенно IT, Программист, Java, Telegram (ссылка), Длиннопост

Отгадайте, кто сожрет все потоковые ресурсы?

Если проанализировать среднестатистический цикл жизни потока то можно заметить что большую часть времени (иногда по 99% времени)

находится либо:

  1. В состоянии ожидании доступа к локу те в состоянии ожидании монитора BLOCKED или WAITING

  2. В "логическом ожидании" какого то ресурса как то ответа базы, сервиса или просто базы.

И это очень очень плохо. В текущих реалиях даже среднестатистический процессор обладает огромными мощностями. Большинство операций занимают нано и микросекунд, но ожидания и блокировки руинят всю производительность.

Решением является совместное использования реактивщины и неблокировщины. Первая организует процесс в котором пул потоков ожидает задачи под выполнение а неблокирующий подход не заставляет ждать потока в рамках одной из задач.

Отзывчивость системы. (Responsiveness)

Один из весомых плюсов реактивщины - возможность получения данных по мере их появления. А как следствие любые решения поверх реактивщины отзывчивы для пользователя и не висят тысячами лет пока все данные не подгрузятся.

Давайте уже, что нибудь попишем.

Как я уже упомянул есть несколько реактивных решений, но в рамках статьи мы напишем Спринговые классические решения.

Перед тем как начать. Если выше на путь реактивнищы - пути обратно нет. Все слои внутри приложений надо стараться писать именно в этом стиле. И конечно не забывать про неблокируйщий подход. Если следовать блокирующему то потоки будут стопорится именно у такой блокируюей воронки.

Что это значит на практике?

А на практике это значит что старые библиотеки вроде rest template (общение по http), jdbc template (связь с базой) должны быть выпилены и заменены не реактивные и неблокирующие:

  1. Rest Template -> WebClient

  2. JdbcTemplate -> DatabaseClient (R2DBC)

  3. FileSystemResource (чтение файлов) -> ReadableResource

  4. И так далее для соответствующий библиотек.

Пишем классический Фронт Бэк База на Спринге.

Пример ниже не является самым сложным, но скорее показательным. Напишем простую локику:

  1. К нам приходит http запрос

  2. Мы перенаправляем запрос в базу

  3. Как база дает первый ответ мы кидаем данные на фронт

  4. Данные на фронте парсятся по мере появления (а не лишь когда все будут доступны)

Если говорить упрощенно то весь код по сути будет сводится к тому что мы будем прокладывать трубы в виде Flux или Mono объектов.

Стоит помнить что вся реактивная магия Спринга возможно лишь когда при его старте используется WebFlux'овый фреймворк. Старый вариант запуска Спринга с каким нибудь томкатом под капотом не сработает. Поэтому зависимости ниже обязательны:

Spring Reactive упрощенно IT, Программист, Java, Telegram (ссылка), Длиннопост

Начнем с базы, используем

Пробросим Flux используя DatabaseClient:

Spring Reactive упрощенно IT, Программист, Java, Telegram (ссылка), Длиннопост

Теперь полученный Flux выставим на сторону фронта:

Spring Reactive упрощенно IT, Программист, Java, Telegram (ссылка), Длиннопост

Наверно вы заметили что возвращаемый тип не application/json. Да тип x-ndjson. Если использовать стандартный application/json то данные которые будут улетать на фронт будут неполный и конвертировать их в целые объекты будет головной болью. Это недостаток потокового подхода (хотя по сути это 1 http запрос, просто растянутый). x-ndjson формат позволяет кидать на фронт кидать объекты

Читаем на фронте. Код неидеален, скорее служит в качестве простого примера.

Spring Reactive упрощенно IT, Программист, Java, Telegram (ссылка), Длиннопост

Код выше делает следующее:

  1. Делает http запрос

  2. Ожидает ответа

  3. Как только ответ прилетает начинает читать его по частям и писать в конcоль

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

Еще раз про эффективный расход процессорных ресурсов.

Я еще раз хочу упомянуть что реактивные, неблокирующие решение написанные прямыми руками позволяют выжать максимум из предоставленных ресурсов. Особенно это актуально во времена микросервисов. Все чаще на проектах под небольшой микросервис могут выделить не более чем 1/0.5/0.1 CPU и я в общем поддерживаю такой подход.

Виртуальные потоки VS Реактивщина.

Эта тема заслуживает отдельного поста. И он будет следующим если эта статья зайдет. Дайте знать в комментах если интересно.

Спасибо за внимание, больше бесплатных статей и стримов в моей группе про джаву и смежные технологии.

Показать полностью 7
[моё] IT Программист Java Telegram (ссылка) Длиннопост
0
Партнёрский материал Реклама
specials
specials

Только каждый третий пикабушник доходит до конца⁠⁠

А сможете ли вы уложить теплый пол, как супермонтажник?

Проверить

Ремонт Теплый пол Текст
12
mimokrokodilchik
mimokrokodilchik
1 год назад

GraphQL все еще неизвестный зверь в промышленной разработке⁠⁠

В данной статье мы разберем, что такое GraphQL, и построим приложение с использованием Java и Spring.

GraphQL все еще неизвестный зверь в промышленной разработке IT, Программист, Java, Telegram (ссылка), Длиннопост

Атмосферный логотип GraphQL

GraphQL стал опенсорсным в 2015 году, однако за десять лет так и не достиг такой же популярности, как REST-архитектура (на графике ниже видно, что нет явной тенденции к большему росту). Нельзя прямо сравнивать GraphQL с REST, поскольку первый представляет собой язык запросов, а второй – архитектурный стиль. Тем не менее, оба имеют реализации в промышленной разработке.

GraphQL все еще неизвестный зверь в промышленной разработке IT, Программист, Java, Telegram (ссылка), Длиннопост

GraphQL все еще остается аутсайдером.

GraphQL в двух словах это гибкий контракт.

GraphQL создает канал коммуникации, где клиент может указывать серверу, какие именно данные ему нужны. Благодаря такому подходу, имея всего лишь один гибкий канал, можно снизить нагрузку на потребление трафика и упростить процесс разработки.

Spring и GraphQL

Довольно ожидаемо что Spring поглотил стандарное решение GraphQL и, конечно же, добавил несколько новых аннотаций. Spring хлебом не корми - дай новых аннотаций наклепать. Давайте напишем своё первое - апи сотрудники.

Для работы со спрингом нужно добавить зависимости.

Для интеграции добавьте в зависимости org.springframework.boot:spring-boot-starter-graphql а также установите переменную в application.properties: spring.graphql.graphiql.enabled: true

Все начинается с GraphQL схемы.

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

GraphQL все еще неизвестный зверь в промышленной разработке IT, Программист, Java, Telegram (ссылка), Длиннопост

Пример так себе, но для нашего примера сгодится.

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

Составляем схему.

Делаем схему, которая будет соответствовать нашим классам. Слева я расположил знакомые нам Java классы, а справа схему которая будет сохранена в schema.graphqls файле и затем использована для построения соединения.

GraphQL все еще неизвестный зверь в промышленной разработке IT, Программист, Java, Telegram (ссылка), Длиннопост

Язык graphql (справа) довольно интуитивен

Из структуры довольно понятно, что типы имеют либо примитивный тип - (строка, число) либо ссылки на другие объекты. Также в квадратных скобках отмечаются массивы данных.

Последний шаг - декларация запроса. В нашем случае allEmployees.

Создадим метод который будет возвращать данные - он должен быть помечен аннотацией @QueryMapping. Также зарегистрируем его в schema файле:

GraphQL все еще неизвестный зверь в промышленной разработке IT, Программист, Java, Telegram (ссылка), Длиннопост

Возвращаемый тип и название метода должны совпадать.

На этом все. Мы закончили разработку. Пишем первые запросы.

Довольно просто получилось интегрировать GraphQL, осталось научиться им пользоваться. Для этого мы воспользуемся встроенной веб интерфейсом который поставляется из коробки. После старта приложения откройте: http://localhost:8080/graphiql?path=/graphql

GraphQL все еще неизвестный зверь в промышленной разработке IT, Программист, Java, Telegram (ссылка), Длиннопост

Вот какую красоту мы увидим.

Что это такое? Более детально:

  • Слева у нас есть конструктор который помогает кликами создавать запрос

  • По центру мы готовим сам контракт для запроса - его можно править в ручную

  • Справа результат работы апи для выбранного контракта

В примере выше мы выбрали лишь два поля которые нужно вернуть для каждого сотрудника - имя и айдишник. Давайте добавим туда и департамент с локациями:

GraphQL все еще неизвестный зверь в промышленной разработке IT, Программист, Java, Telegram (ссылка), Длиннопост

Лишь измения в контракте дали нам новый результат. На бэкэнде мы не сделали изменений.

Как можно заметить, добавив необходимые поля, мы изменили контракт. Теперь данные о сотрудниках, департаментах и их локациях возвращаются с бэкенда.

Это не все возможности GraphQL.

Данная статья не включает все возможности GraphQL такие как:

  • Мутации - возможность делать гибкие запросы на изменение данных

  • Подписка - возможность подписываться на изменения

  • Более гибкие возможности работы с GraphQL - например возможность читать данные из контекста GraphQL

  • Генерация документации

  • DataLoaders - возможность борьбы с N+1 проблемой при работе с базой данных

Моё скромное мнение.

По моему технология недооценена на рынке и достойна куда большего внимания. Текущая имплементация далека от идеала но и относительно проста. Проблема снижения нагрузки и создания универсального апи которое можно динамически менять без изменений со стороны сервера - встречается часто, особенно в больших компаниях (а чаще в больших компания java и используется). Поэтому я всем советую поиграться с технологией и применять в нужных случаях.

Надеюсь вам понравилась статья, кому интересно приглашаю в мой телеграм канал про разработку на Java и смежные технологии. Спасибо за внимание.

Показать полностью 7
[моё] IT Программист Java Telegram (ссылка) Длиннопост
0
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии