Proč je GraphQL Variable Mutace Syntax Takže Redundant?

hlasů
0

GraphQL dotazy / mutace jsou super čisté: oni vyžadují pouze to, co skutečně potřebují , nic jiného. Nebo alespoň ty základní jsou.

Ale pokud budete používat proměnné buď s jedním, pak se vaše skladba má nevyhnutelně redundanci v něm:

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

Všimněte si $episode: Episodei episode: $episode. Problém je v tom KAŽDÝ GraphQL mutace požaduje stejný redundanci: pokud používáte proměnné, každý argument, je třeba definovat dvakrát (a pokud jste dělat programové dotazy, nepochybně používáte proměnné).

Moje otázka je, proč? Zdá se, že tak zbytečné, aby každý, kdo používá GraphQL muset opakovat jejich argumenty podruhé.

Proč ne jen aby syntaxe:

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

nebo je-li vaše opravdu potřeba počítat s rozdílnými názvy proměnných, aby volitelný třetí díl:

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

Aby bylo jasno, já to chápu, že dotazy variabilní využívající jsou odlišné od těch non-variabilní, ale to, co se ptám, je, proč vybrat syntaxi pro ty dotazy, které nutí každého, aby se opakovat?

Zdá se to tak ... není suchý! Jistě mi chybí důležitý důvod, proč to opakování je nutné?

Položena 10/10/2019 v 00:47
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
2

Proč musím uvést své argumenty do funkce JavaScriptu? Není to jasné, že funkce

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

přijímá dva argumenty, jeden s názvem firstname, který se jmenoval lastname? No myslím, že tady to jde snadno vidět skrz ale existuje složitější případy, kdy to není tak docela jasné. Právě výše uvedený příklad vypadá divně, ale tam jsou některé funkční programovací jazyky, kde výrazy jako (_ + 2)a _.concat(_)jsou platné výrazy funkce. A můžete vytvořit některé docela nepříjemný kód (při pohledu na vás, přejděte bez Haskell). Ale mnoho jazyků si myslí, že se prohlašuje vstup kus kódu výslovně je to dobrý nápad.

Zpět na GraphQL: Podívejme se na některé složitější použití proměnných, protože proměnné jsou opravdu plné variabilní implementace. Můžete dělat více s nimi pak jen jejich použití na argument:

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

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

Takže proměnné mohou být použity v mnoha místech a také použít vícekrát. A ne zřídka GraphQL dotazy stát opravdu velký. By tato práce s druhou syntaxi, která jste navrhla? Ano, ale myslím, že čitelnost bude trpět. DRY není o snižování množství znaků, které mají psát, ale o snížení počtu chyb. Ale často je výslovně o tom, co mohou také omezit chyby (např mnoho typů systémů v těchto dnech o tom, že explicitní o vstupních parametrů a jejich typy).

Takže myslím, že to bylo prostě obchodní rozhodnutí, který byl vyroben podle vývojáři GraphQL a oni si vybrali explicitní verzi. Nezapomeňte na kontext: GraphQL vznikl na Facebook je jedním z největších webových aplikací na světě.

Vzhledem k tomu, že výhody jednoznačnosti, nejsou zde zřejmá, je editační, který uvádí několik z nich:

  • Toto prohlášení umožňuje vývojářům rychle pochopit všechny proměnné a jejich odpovídající typy v dotazu.
  • GraphQL developer nářadí nemusí nákladně odvodit typ proměnné ze schématu a místo toho lze jednoduše vyhledávání typ vstupu.
  • Chybová hlášení dostat srozumitelnější, představit argument showAllnebere logické operátory, ale celých čísel. S prohlášením můžeme říci mismatching types for variable $long. $long is Boolean but expected Int. Pokud tomu tak není prohlášen bychom museli říci $long is sometimes used as Boolean, sometimes as Int. Co kdybychom ji využít jako tři různé typy?
  • Breaking dotazy by mohly být detekovány GraphQL pouze statická analýza kódu: Opět si představit, změníme typ showAllk Int. V tomto případě může být dotaz rozpoznán jako špatný, přičemž bez výslovného prohlášení typu dotazu by mohla namísto zlomit za běhu.
Odpovězeno 10/10/2019 v 01:32
zdroj uživatelem

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