Hvorfor er GraphQL Variabel Mutation Syntax Så Redundant?

stemmer
0

GraphQL spørsmål / mutasjoner er super clean: de bare kreve hva de faktisk trenger , ikke noe annet. Eller i det minste de grunnleggende er.

Men hvis du bruker variabler med enten en har så din syntaks uunngåelig redundans i det:

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

Legg merke til $episode: Episodeog episode: $episode. Saken er HVER GraphQL mutasjon krever samme redundans: Hvis du bruker variabler, har hvert argument for å bli definert to ganger (og hvis du gjør programmatiske søk, du utvilsomt bruker variabler).

Mitt spørsmål er, hvorfor? Det virker så unødvendig å gjøre alle som bruker GraphQL å gjenta sine argumenter for andre gang.

Hvorfor ikke bare gjøre syntaksen:

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

eller hvis du virkelig trenger å tillate ulike variabelnavn, tillate en valgfri tredje del:

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

For å være klar, jeg forstår at variable-hjelp av spørringer er forskjellig fra ikke-variable seg, men det jeg spør om er, hvorfor velge en syntaks for de spørsmål som tvinger alle til å gjenta seg selv?

Det bare virker så ... ikke tørr! Sikkert jeg mangler en viktig grunn til at denne gjentakelsen er nødvendig?

Publisert på 09/10/2019 klokken 23:47
kilden bruker
På andre språk...                            


1 svar

stemmer
2

Hvorfor må jeg vise mine argumenter i en Javascript-funksjon? Er det ikke opplagt at funksjonen

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

tar to argumenter, en som heter firstnameen navngitt lastname? Vel jeg tror her er det lett å se gjennom, men det er mer kompliserte tilfeller der det ikke er fullt så opplagt. Nå eksempelet ovenfor virker merkelig, men det er noen funksjonelle programmeringsspråk der uttrykk som (_ + 2)og _.concat(_)er gyldige funksjonsuttrykk. Og du kan lage noen ganske ytterst ubehagelig kode (ser på deg, punkt gratis Haskell). Men mange språk synes å mene at erklære inngangen til et stykke kode eksplisitt er en god idé.

Tilbake til GraphQL: La oss se på noen mer kompliserte bruk av variabler, fordi variablene er virkelig en full variabel gjennomføring. Du kan gjøre mer med dem så bare bruke dem til et argument:

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

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

Så variabler kan brukes i en rekke steder, og også brukes flere ganger. Og ikke seldomly GraphQL spørsmål bli virkelig store. Vil dette arbeidet med andre syntaks som du har foreslått? Ja, men jeg tror lesbarheten vil lide. DRY er ikke om å redusere antall tegn du må skrive, men om å redusere feil. Men ofte blir eksplisitt om ting kan også redusere feil (f.eks mye av type systemer i disse dager er i ferd med å bli eksplisitt om inngangsparametre og deres typer).

Så jeg antar det var rett og slett en handel av vedtaket som ble gjort av utviklerne av GraphQL og de valgte den eksplisitte versjonen. Ikke glem sammenheng: GraphQL ble opprettet på Facebook, en av de største web apps i verden.

Siden fordelene med tydelighet er ikke opplagt her er en endring som viser noen:

  • Erklæringen gjør at en utvikler til raskt å forstå alle variabler og deres tilsvarende typer i en spørring.
  • GraphQL utvikler verktøy trenger ikke å ligere antyde hvilken type variablene fra skjemaet, og i stedet kan bare slå opp inngangstypen.
  • Feilmeldinger bli enklere å forstå, tenk argumentet showAlltar ikke booleans men ints. Med erklæringen kan vi si mismatching types for variable $long. $long is Boolean but expected Int. Hvis det ikke er erklært vi ville ha å si $long is sometimes used as Boolean, sometimes as Int. Hva om vi bruker det som tre forskjellige typer?
  • Breaking spørsmål kunne påvises ved GraphQL bare statisk kodeanalyse: Igjen forestille vi endre typen showAlltil Int. I dette tilfellet spørringen kan oppdages så galt, mens uten eksplisitt typedeklarasjon spørringen kan i stedet bryte under kjøring.
Svarte 10/10/2019 kl. 00:32
kilden bruker

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