Является ли внедрение проверки на нулевое значение в бэкенде (graphql) хорошей идеей?

Вопрос или проблема

Я разработчик на Flutter и использую nestjs+gql для написания бэкенда. Если сделать бэкенд безопасным по отношению к null, некоторые случаи будут такими:

import { Field, Int, ObjectType } from '@nestjs/graphql';

@ObjectType()
export class SessionPreview {
  @Field(() => Int)
  id: number;
  @Field(() => String)
  title: string;
  @Field(() => Int, { description: 'если корневая сессия, то вернёт ноль' })
  parentId: number;
  @Field(() => Int)
  itemCount: number;
}

@ObjectType()
export default class SessionPreviewResponse {
  @Field(() => [SessionPreview])
  result: SessionPreview[];
}

Является ли возврат нуля, если это null в базе данных плохим дизайном?

Ответ или решение

Безопасность null в бэкенде (GraphQL): Хорошая ли это идея?

Введение

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

Проблема

В приведённом вами примере, если значение parentId возвращается как нулевое из базы данных, в системе устанавливается значение 0. Это приводит к вопросу: является ли такое решение хорошим дизайном?

Недостатки возвращения null и использования значения по умолчанию

  1. Потеря контекста: Если мы возвращаем 0 вместо null, мы теряем контекст того, что изначально значение не было определено. Это может привести к недопониманию и ошибкам, особенно когда другие разработчики работают с вашим кодом или документацией API.

  2. Сложности в обработке бизнес-логики: Во многих сценариях 0 может быть валидным значением, означающим, что "родитель отсутствует", в то время как null мог бы указать на отсутствие данных. Выделение этих состояний становится жизненно важным для понимания правил бизнес-логики.

  3. Увеличение сложности кодовой базы: Необходимость выполнять проверки на значения по умолчанию (например, проверка на 0) усложняет код, что может привести к ошибкам и затруднить тестирование.

Преимущества реализации null safety

  1. Ясность и прозрачность: Использование null в вашем API дает более четкое представление о состоянии данных. Это позволяет разработчикам легче понимать, является ли значение неопределённым или целостным.

  2. Безопасность типов: Многие языки программирования и инструменты, такие как TypeScript и GraphQL, поддерживают строгую типизацию и защиту от null. Это помогает избежать непредвиденных ошибок выполнения и делает код более предсказуемым.

  3. Улучшение работы с клиентом: Клиенты, работающие с вашим API, могут лучше обрабатывать ответные данные, если они понимают, что несуществующие значения вернутся как null, а не значения по умолчанию.

Решение

Оптимальным решением будет сделать поле parentId nullable в GraphQL схеме. Это позволит бэкенду возвращать null, когда информация отсутствует, и давать клиенту чёткое понимание ситуации. Пример:

@Field(() => Int, { nullable: true, description: 'If root session, it will return null' })
parentId?: number;

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...