Perché GraphQL variabile Mutazione Sintassi Così ridondante?

voti
0

Query GraphQL / mutazioni sono super pulito: hanno solo bisogno di quello che effettivamente bisogno , nient'altro. O almeno quelli di base sono.

Ma se si utilizza le variabili con uno dei due, quindi la sintassi ha inevitabilmente la ridondanza in esso:

query HeroNameAndFriends($episode: Episode) {
  hero(episode: $episode) {
    name
    friends {
      name
    }
  }
}

Si noti la $episode: Episodee episode: $episode. La cosa è ogni GraphQL mutazione richiede la stessa ridondanza: se si utilizzano le variabili, ogni argomento deve essere definito due volte (e se stai facendo programmatiche query, è senza dubbio utilizza variabili).

La mia domanda è: perché? Sembra così inutile per rendere tutti coloro che utilizzano GraphQL devono ripetere i loro argomenti per la seconda volta.

Perché non basta fare la sintassi:

query HeroNameAndFriends() {
  hero(episode: Episode) {
    name
    friends {
      name
    }
  }
}

o se il vostro veramente bisogno per consentire diversi nomi delle variabili, permetterà una terza parte facoltativa:

query HeroNameAndFriends() {
  hero(episode: Episode : $episode) {
    name
    friends {
      name
    }
  }
}

Per essere chiari, ho capito che le query variabili che usano sono diversi da quelli non variabili, ma quello che sto chiedendo è, perché prendo una sintassi per le query che costringe tutti a ripetersi?

Sembra proprio così ... non a secco! Sicuramente mi manca un motivo importante per cui questa ripetizione è necessaria?

È pubblicato 10/10/2019 alle 00:47
fonte dall'utente
In altre lingue...                            


1 risposte

voti
2

Perché devo elencare le mie argomentazioni in una funzione JavaScript? Non è ovvio che la funzione

const getFullName = () => firstname + ' ' + lastname;

prende due argomenti, uno chiamato firstnameuno di nome lastname? Beh penso che qui è facile vedere attraverso ma ci sono casi più complicati in cui non è così evidente. Ora l'esempio di cui sopra sembra strano, ma ci sono alcuni linguaggi di programmazione funzionali in cui espressioni come (_ + 2)e _.concat(_)sono espressioni di funzione valide. E si può creare un codice abbastanza antipatico (guardando a voi, point gratuito Haskell). Ma un sacco di lingue sembrano pensare che dichiarando l'ingresso di un pezzo di codice è esplicitamente una buona idea.

Torna a GraphQL: Diamo un'occhiata ad alcuni usi più complicate delle variabili perché le variabili sono davvero un'implementazione variabile completa. Si può fare di più con loro quindi solo la loro applicazione ad un argomento:

query NestedInput($name: String) {
  user(where: { name: { contains: $name } }) { ... }
}

query WithDirective($long: Boolean) {
  users {
    name
    bio @include(if: $long)
    friends(showAll: $long) {
      name
    }
  }
}

Quindi, le variabili possono essere utilizzati in un sacco di posti e anche essere utilizzati più volte. E non di rado query GraphQL diventano veramente grandi. Sarebbe questo lavoro con la seconda sintassi che hai proposto? Sì, ma credo che la leggibilità avrebbe sofferto. DRY non è di ridurre la quantità di caratteri che si deve digitare ma di ridurre gli errori. Ma spesso essendo esplicito di cose può anche ridurre gli errori (ad esempio, un sacco di sistemi di tipo in questi giorni sono in procinto di essere esplicito su parametri di input e le loro tipologie).

Quindi credo che si trattava semplicemente di un commercio di decisione che è stata fatta dagli sviluppatori di GraphQL e hanno scelto la versione esplicita. Non dimenticare il contesto: GraphQL è stato creato Facebook, uno dei più grandi applicazioni web in tutto il mondo.

Dal momento che i benefici della esplicitazione non sono evidenti qui è una modifica che elenca alcuni:

  • La dichiarazione permette allo sviluppatore di comprendere rapidamente tutte le variabili e le loro tipologie corrispondenti a una query.
  • GraphQL sviluppatore utensili non deve dedurre costoso il tipo delle variabili dallo schema ed invece può semplicemente ricerca il tipo di ingresso.
  • I messaggi di errore diventa più facile da capire, immaginare l'argomento showAllnon tiene booleani ma int. Con la dichiarazione si può dire mismatching types for variable $long. $long is Boolean but expected Int. Se non viene dichiarato che sarebbe da dire $long is sometimes used as Boolean, sometimes as Int. Che cosa succede se lo usiamo come tre tipi differenti?
  • Query rottura potrebbe essere rilevato da GraphQL solo analisi statica del codice: Ancora immaginiamo cambiamo il tipo di showAlla Int. In questo caso la query può essere rilevato come sbagliato, mentre senza la dichiarazione del tipo esplicita la query potrebbe invece rompere in fase di esecuzione.
Risposto il 10/10/2019 a 01:32
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more