Dlaczego GraphQL Zmienna Mutacja Składnia Więc Redundant?

głosy
0

Zapytania GraphQL / mutacje są super czyste: oni tylko wymagać tego, co rzeczywiście wymaga , nic innego. Albo przynajmniej podstawowe z nich są.

Ale jeśli używasz zmiennych albo jednego, wówczas składnia nieuchronnie ma redundancję w nim:

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

Zauważ, że $episode: Episodei episode: $episode. Chodzi o to, KAŻDY mutacja GraphQL wymaga tego samego redundancji: jeśli używasz zmiennych, każdy argument musi być zdefiniowane dwa razy (a jeśli robisz programowe zapytań, bez wątpienia są za pomocą zmiennych).

Moje pytanie brzmi, dlaczego? Wydaje się więc konieczne, aby każdy, kto używa GraphQL trzeba powtarzać ich argumenty po raz drugi.

Dlaczego nie po prostu zrobić składnię:

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

Lub, jeśli naprawdę potrzebujesz, aby umożliwić różnymi nazwami zmiennych, pozwalają opcjonalną trzecią część:

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

Żeby było jasne, rozumiem, że zapytań wykorzystujących zmienne są różne od tych niezmiennych, ale co pytam się o to, dlaczego wybrać składnię dla tych zapytań, które zmusza każdego się powtarzać?

To po prostu wydaje się tak nie ... DRY! Na pewno brakuje mi ważny powód to powtórzenie jest konieczne?

Utwórz 10/10/2019 o 00:47
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
2

Dlaczego muszę notować moje argumenty w funkcji JavaScript? Czy to nie jest oczywiste, że funkcja

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

przyjmuje dwa argumenty, jeden nazwany firstnamejeden nazwany lastname? Więc myślę, że tutaj nie jest łatwo przejrzeć ale są bardziej skomplikowane przypadki, w których nie jest już tak oczywista. Teraz powyższy przykład wydaje dziwne, ale istnieje kilka języków programowania, gdzie wyrażenia funkcjonalne jak (_ + 2)i _.concat(_)obowiązują wyrażenia funkcyjne. I można stworzyć jakiś dość nieprzyjemny kod (patrząc na ciebie, wskaż darmo Haskell). Ale wiele języków wydaje się, że deklarując wejście kawałek kodu wyraźnie jest dobrym pomysłem.

Powrót do GraphQL: Spójrzmy na niektórych bardziej skomplikowanych zastosowań zmiennych, ponieważ zmienne są naprawdę pełne wdrożenie zmienna. Można zrobić więcej z nich to po prostu zastosowanie ich 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 zmienne mogą być wykorzystywane w wielu miejscach, a także być używane wielokrotnie. I nie rzadko GraphQL zapytania stają się naprawdę duże. Czy ta praca z drugim składni, które zostały zaproponowane? Tak, ale myślę, że czytelność ucierpi. DRY nie chodzi o zmniejszenie ilości znaków należy wpisać ale o zmniejszenie błędów. Ale często jest wyraźnie o rzeczach może również zmniejszyć liczbę błędów (np wiele systemów typu tych dniach o czym wyraźnie o parametrach wejściowych i ich typów).

Więc myślę, że to po prostu handel decyzji, która została wykonana przez twórców GraphQL i wybrali wyraźny wersję. Nie zapomnij kontekst: GraphQL powstała na Facebook, jeden z największych aplikacji internetowych na świecie.

Ponieważ korzyści z jednoznaczności nie są tutaj oczywiste jest, że edycja wymienia kilka z nich:

  • Deklaracja pozwala deweloper szybko zrozumieć wszystkie zmienne i odpowiadające im typy w zapytaniu.
  • GraphQL oprzyrządowanie deweloper nie musi drogo wywnioskować typ zmiennych ze schematu, a zamiast tego można po prostu odnośnika typ wejścia.
  • Komunikaty o błędach dostać łatwiej zrozumieć, wyobraźmy sobie argumentu showAllnie bierze wartości logicznych, ale ints. Z deklaracją możemy powiedzieć mismatching types for variable $long. $long is Boolean but expected Int. Jeśli to nie jest zadeklarowana musielibyśmy powiedzieć $long is sometimes used as Boolean, sometimes as Int. Co zrobić, jeśli używamy go jako trzy różne typy?
  • Zapytania łamanie może być wykryty przez GraphQL tylko statyczna analiza kodu: Znowu wyobrazić możemy zmienić typ showAlldo Int. W tym przypadku zapytanie może zostać wykryty jako złe, podczas gdy bez wyraźnej deklaracji typu kwerendy może zamiast łamać przy starcie.
Odpowiedział 10/10/2019 o 01:32
źródło użytkownik

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