Java for Beginner
769 subscribers
748 photos
216 videos
12 files
1.25K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Фрагменты, директивы и переменные

GraphQL — декларативный язык, но его мощь раскрывается по-настоящему, когда вы начинаете использовать фрагменты, директивы и переменные.


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



1. Фрагменты

Фрагмент (fragment) — это именованный блок запроса, который описывает набор полей.
Он позволяет вынести общую часть и использовать её в нескольких местах.


Главная цель: избежать повторов полей.

Пример без фрагментов:
query {
user(id: 1) {
id
name
avatar
}
post(id: 10) {
author {
id
name
avatar
}
}
}

Повторяются три поля id, name, avatar.


Версия с фрагментом
fragment UserBasic on User {
id
name
avatar
}

query {
user(id: 1) {
...UserBasic
}
post(id: 10) {
author {
...UserBasic
}
}
}

Теперь изменения структуры (например, добавление role) делаются в одном месте — фрагменте.


Как работает фрагмент
fragment UserBasic on User — объявление фрагмента.
User — тип, которому фрагмент принадлежит.
...UserBasic — вставка фрагмента.
Фрагменты можно вкладывать друг в друга и использовать с union и interface.


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

Сложные запросы с глубокой вложенностью
Общие части выносятся в фрагменты.

Работа с interface и union
Позволяют описывать поля для нескольких типов.

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



2. Директивы

Директивы — это аннотации, которые модифицируют выполнение запроса.
Они влияют на структуру данных, которые вернёт сервер.


GraphQL имеет встроенные директивы и позволяет создавать свои.

2.1 Директива @include

Поле будет включено только если условие истинно.
query GetUser($showAvatar: Boolean!) {
user(id: 1) {
name
avatar @include(if: $showAvatar)
}
}

Переменные:

{ "showAvatar": true }

Если showAvatar = false, поле avatar пропадёт из ответа целиком.


2.2 Директива
@skip

Обратная логика:
avatar @skip(if: $binaryMode)

Если binaryMode = true, поле будет пропущено.


2.3 Директива @deprecated

Помечает поле устаревшим.
type User {
username: String @deprecated(reason: "Use 'name' instead")
}

Эта директива влияет на документацию и IDE, но не на данные.


2.4 Кастомные директивы

Пример (схема):
directive @upper on FIELD_DEFINITION


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



3. Переменные в запросах

Переменные — это место, где GraphQL становится особенно полезным.
Они позволяют использовать один и тот же запрос с разными параметрами, не переписывая запрос.


3.1 Базовый пример

Запрос:
query GetPost($id: ID!) {
post(id: $id) {
title
content
}
}


Переменные:
{
"id": 100
}


Сервер соединяет тело запроса и переменные и выполняет.

3.2 Переменные для input-объектов (в мутациях)

Мутация:
mutation CreatePost($input: CreatePostInput!) {
createPost(input: $input) {
id
title
}
}


Переменные:
{
"input": {
"title": "GraphQL",
"content": "Powerful queries"
}
}


Это безопаснее, чем писать input прямо в теле мутации.

3.3 Комбинирование переменных с директивами
query User(
$id: ID!,
$withPosts: Boolean!
) {
user(id: $id) {
name
posts @include(if: $withPosts) {
title
}
}
}


Комбинация:
один запрос,
два режима вывода данных,
ноль дублирования.



#Java #middle #GraphQL #Query
👍2
4. Реальные производственные кейсы

Кейc 1: мобильная и web-версия используют разные наборы полей
query User(
$id: ID!,
$isMobile: Boolean!
) {
user(id: $id) {
name
avatar @skip(if: $isMobile)
posts @include(if: $isMobile) {
title
}
}
}


Мобильный клиент получает минимум данных.
Web — максимум.


Кейc 2: переиспользование структуры пользователя

fragment UserCard on User {
id
name
avatar
}

query PageData {
recommendedUsers { ...UserCard }
recentVisitors { ...UserCard }
followers { ...UserCard }
}


Все блоки страницы используют одну структуру.
CRM-интерфейсы любят такое.


Кейc 3: миграции схемы через директивы

Старая модель:
username @deprecated(reason: "Use 'login' instead")


Frontend получает предупреждение в IDE — никаких тайных поломок.

Кейc 4: сложные фильтры в одном запросе
query FilterPosts($filter: PostFilter!) {
posts(filter: $filter) {
id
title
}
}


Переменные:
{
"filter": {
"authorId": 1,
"tags": ["graphql", "java"],
"minLikes": 10
}
}


#Java #middle #GraphQL #Query
👍2
Что выведет код?

public class Task211125 {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "he" + "llo";
String s3 = "he";
String s4 = "llo";
String s5 = s3 + s4;

System.out.println(s1 == s2);
System.out.println(s1 == s5);
System.out.println(s1.equals(s5));

final String s6 = "he";
final String s7 = "llo";
String s8 = s6 + s7;
System.out.println(s1 == s8);
}
}


#Tasks
👍1
Вопрос с собеседований

Для чего используется CompletableFuture.anyOf() 🤓


Ответ:

anyOf()
запускает несколько асинхронных задач и завершается, как только выполнится любая.

Полезно, когда важен первый успешный результат.

Метод упрощает конкурентную работу, но требует аккуратного управления исключениями и понимания поведения оставшихся задач.



#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
История IT-технологий сегодня — 22 ноября


ℹ️ Кто родился в этот день

Джеффри Дэвид Ульман (родился 22 ноября 1942 года) — американский теоретик информатики; автор классических учебников по компиляторам, теории вычислимости и базам данных, лауреат крупных наград в CS.
Википедия

Расмус Лердорф (дат. Rasmus Lerdorf; р. 22 ноября 1968) — датский программист, ныне живущий в Канаде, написавший в 1994 году набор скриптов на C, обрабатывающих шаблоны HTML-документов, позже воплотившийся в интерпретатор языка сценариев PHP, с помощью которого можно было решать различные задачи веб-приложений, включая не шаблонное создание сайтов для различных целей и направлений.


🌐 Знаковые события

1911 — лётчик Д. М. Сокольцов осуществил радиопередачу с самолёта на землю.


#Biography #Birth_Date #Events #22Ноября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
С 15.11 по 21.11
Предыдущий пост(с 08.11 по 14.11)

Воскресный мотивационный пост:
Не было мотивации

Запись встреч/видео:
JOOQ. Взаимодействуй с БД по-новому.

Обучающие статьи:

Java:
Коллекции в Java

Глава 2. List — списки в Java
Интерфейс List и его особенности

Глава 5. Map — отображения (словари)
Практика: В «Библиотеке» создать Map<String, Book> для быстрого поиска книги по названию.

GraphQL
Определение схемы в GraphQL (SDL)
Запросы и мутации в GraphQL
Фрагменты, директивы и переменные

Полезные статьи и видео:
Как написать приложение на JavaFX: гид для начинающих
MapStruct: как безобидный метод портит весь маппинг


Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
👍3