Вопрос или проблема
Я разработчик на 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 и использования значения по умолчанию
-
Потеря контекста: Если мы возвращаем 0 вместо null, мы теряем контекст того, что изначально значение не было определено. Это может привести к недопониманию и ошибкам, особенно когда другие разработчики работают с вашим кодом или документацией API.
-
Сложности в обработке бизнес-логики: Во многих сценариях 0 может быть валидным значением, означающим, что "родитель отсутствует", в то время как null мог бы указать на отсутствие данных. Выделение этих состояний становится жизненно важным для понимания правил бизнес-логики.
-
Увеличение сложности кодовой базы: Необходимость выполнять проверки на значения по умолчанию (например, проверка на 0) усложняет код, что может привести к ошибкам и затруднить тестирование.
Преимущества реализации null safety
-
Ясность и прозрачность: Использование null в вашем API дает более четкое представление о состоянии данных. Это позволяет разработчикам легче понимать, является ли значение неопределённым или целостным.
-
Безопасность типов: Многие языки программирования и инструменты, такие как TypeScript и GraphQL, поддерживают строгую типизацию и защиту от null. Это помогает избежать непредвиденных ошибок выполнения и делает код более предсказуемым.
-
Улучшение работы с клиентом: Клиенты, работающие с вашим 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 вместо значения по умолчанию, вы улучшаете ясность и целостность информации, делая свою кодовую базу более устойчивой к ошибкам и легче поддающейся поддержке. В условиях постоянных изменений в требованиях и нарастающей сложности бизнес-логики, правильная обработка и передача данных играет ключевую роль в успехе проекта.