Miért GraphQL változó mutációs szintaxis tehát redundáns?

szavazat
0

GraphQL lekérdezés / mutációk szuper tiszta: csak szükség, amit valójában szükség , semmi mást. Vagy legalábbis az alapvető közül.

De ha használni változók közül az egyik, akkor a szintaxis óhatatlanul redundancia benne:

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

Megjegyzés: a $episode: Episodeés episode: $episode. A lényeg az, MINDEN GraphQL mutáció megköveteli ugyanezt redundancia: ha használja változókat, minden érvet kell határozni kétszer (és ha így programozott lekérdezéseket, akkor kétségtelenül használ változók).

A kérdésem az, hogy miért? Úgy tűnik, igen szükségtelen, hogy mindenki, aki használja GraphQL meg kell ismételni az érveiket a második alkalommal.

Miért nem csak, hogy a szintaxis:

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

vagy ha a valóban szüksége van ahhoz, hogy az eltérő változó nevét, lehetővé teszi egy opcionális harmadik rész:

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

Ahhoz, hogy tiszta, jól értem, hogy a változó a lekérdezések eltérnek a nem változó is, de amit kérek arról van szó, hogy miért válasszon egy szintaxist azokat a lekérdezéseket, amely arra kényszerít mindenkit, hogy ismételjék meg?

Ez csak úgy tűnik ... nem száraz! Bizonyára Hiányzik egy fontos ok, amiért ez ismétlés van szükség?

A kérdést 10/10/2019 00:47
a forrás felhasználó
Más nyelveken...                            


1 válasz

szavazat
2

Miért kell felsorolni az érveimet egy JavaScript függvény? Nem nyilvánvaló, hogy a funkció

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

két paramétert, az egyik megnevezett firstnameegyik neve lastname? Nos, azt hiszem itt is könnyű átlátni, de van egy bonyolultabb esetek, amelyekben nem annyira nyilvánvaló. Most a fenti példa fura, de van néhány funkcionális programozási nyelvek, ahol a kifejezések, mint (_ + 2), és _.concat(_)érvényes funkció kifejezések. És akkor létrehozhat egy elég ellenszenves kód (néz rád, pont szabad Haskell). De sok nyelven úgy gondolják, hogy kimondja a bemenetére egy kódrészletet kifejezetten jó ötlet.

Vissza GraphQL: Nézzünk néhány bonyolultabb felhasználása változók, mert változók valóban a teljes változó végrehajtását. Akkor többet velük, akkor csak azok alkalmazására egy érv:

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

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

Tehát változókat lehet használni egy csomó helyen és többször is használható. És nem ritkán GraphQL lekérdezések válik igazán nagy. Vajon ezt a munkát a második szintaxis, amit javasoltam? Igen, de azt hiszem, az olvashatóság szenvedne. DRY nem a mennyiségének csökkentésére karaktereket kell beírni, hanem arról, csökkenti a hibák. De gyakran nem egyértelmű a dolog is csökkentheti a hibák (pl egy csomó típusú rendszerek manapság arról, hogy egyértelmű a bemeneti paraméterek és típus).

Tehát azt hiszem, hogy egyszerűen egy kereskedelmi döntés, amit tett a fejlesztők GraphQL és úgy döntöttek, az explicit verzió. Ne felejtsük el, a kontextus: GraphQL jött létre a Facebook, az egyik legnagyobb internetes alkalmazások a világon.

Mivel az előnyeit a explicitségnek nem nyilvánvaló itt van egy szerkesztés, amely felsorolja néhány:

  • A nyilatkozat lehetővé teszi a fejlesztők, hogy gyorsan megérteni az összes változót és a megfelelő típus egy lekérdezést.
  • GraphQL fejlesztő szerszám nem kell drágán következtetni típusú változók a séma és ehelyett egyszerűen lookup a bemenet típusát.
  • Hibaüzenetek könnyebb megérteni, elképzelni az érvelés showAllnem veszi logikai értékek, de ints. A nyilatkozat azt mondhatjuk mismatching types for variable $long. $long is Boolean but expected Int. Ha nem adják meg azt kellene mondani $long is sometimes used as Boolean, sometimes as Int. Mi lenne, ha használja, mint három különböző típusú?
  • Breaking lekérdezéseket lehet kimutatni GraphQL csak statikus kód elemzésével: Ismét elképzelni megváltoztatjuk a típusát showAll, hogy Int. Ebben az esetben a lekérdezés lehet kimutatni, mint rossz, míg nélkül explicit deklarációs lekérdezés lehet inkább megtörni a futás során.
Válaszolt 10/10/2019 01:32
a forrás felhasználó

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