Какая польза или необходимость в объявлении класса модели поддержки, который очевидным образом не отличается от типа GraphQL, связан с GraphQL?

Мне нравится Universal Relay Boilerplate — в общем, я могу сказать, что они очень внимательно относились к тому, как они собрали все это вместе, в отличие от большинства шаблонов, для которых организация папок и т. д. кажется запоздалой (думаю, потому что вы не будете делать сначала что-нибудь важное, что ли)... но не УРБ. Или, по крайней мере, мы разборчивы в одних и тех же вещах.

Почему такой же раздражающий вещь...

... кроме одного: я не понимаю, почему они это делают.

// Class used by GraphQL Server
export default class User
{
  constructor( fields )
  {
    this.id = fields.id
    this.User_AccountName = fields.User_AccountName
    this.User_AccountPassword = fields.User_AccountPassword
    this.User_DisplayName = fields.User_DisplayName
    this.User_ProfilePhoto = fields.User_ProfilePhoto
    this.User_Email = fields.User_Email
    this.User_PhoneNumberMobile = fields.User_PhoneNumberMobile
    this.User_Locale = fields.User_Locale
    this.UserToken2 = fields.UserToken2
  }
}

...два раза в непосредственной близости без объяснения причин?

Вот тип, который на самом деле немного отличается от оригинала благодаря псевдониму.

export default new GraphQLObjectType( {
  name: 'Viewer',
  interfaces: [NodeInterface],
  isTypeOf: object => object instanceof User,
  fields: {
    id: globalIdField('Viewer'),

    User_IsAnonymous:        { type: GraphQLBoolean, resolve: (obj) => obj.id.equals( Uuid_0 ) },
    User_AccountName:        { type: GraphQLString,  resolve: (obj) => obj.User_AccountName },
    User_DisplayName:        { type: GraphQLString,  resolve: (obj) => obj.User_DisplayName },
    User_ProfilePhoto:       { type: GraphQLString,  resolve: (obj) => obj.User_ProfilePhoto },
    User_Email:              { type: GraphQLString,  resolve: (obj) => obj.User_Email },
    User_PhoneNumberMobile:  { type: GraphQLString,  resolve: (obj) => obj.User_PhoneNumberMobile },
    User_Locale:             { type: GraphQLString,  resolve: (obj) => obj.User_Locale },
    UserToken2:             { type: GraphQLString,  resolve: (obj) => obj.UserToken2 },

    ..._ViewerFields,

  },
} );

Они намерены это очевидно

Это самый яркий пример разницы между model и type, который я смог найти в шаблоне; остальные идентичны. На самом деле я был немного раздражен, обнаружив, что ни одно другое руководство не рекомендует и даже не упоминает выполнение model.js, а скорее начинается с type.js.

Я мог бы понять, если бы

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

Но они делают это везде, что заставляет меня думать, что я упускаю здесь что-то важное.


person tacos_tacos_tacos    schedule 02.07.2016    source источник


Ответы (2)


Это не одно и то же. Точно такое же имя:

  • Одним из них является экземпляр object
  • другой — структура объектов (типы используются для документирования API)
person basarat    schedule 03.07.2016
comment
Итак... тип на первом месте? - person tacos_tacos_tacos; 03.07.2016
comment
Поместите класс затем тип;) - person basarat; 04.07.2016

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

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

GraphQL — это внешний слой интерфейса в вашем приложении.

На приведенной выше диаграмме GraphQL будет «внешним интерфейсом». Обратите внимание, что он находится поверх уровня бизнес-логики/модели, но не заменяет его.

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

Прочитайте об этих концепциях, представленных Дэном Шафером в моем резюме его доклада о React Europe, здесь: https://medium.com/apollo-stack/graphql-at-facebook-by-dan-schafer-38d65ef075af#.awusd3ibv

person stubailo    schedule 05.07.2016