(function(w,d,s,l,i){w[l]=w[l]|||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=? 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-5LHNRP9'); Polimorfisms Ruby un GraphQL - The Codest
The Codest
  • Par mums
  • Pakalpojumi
    • Programmatūras izstrāde
      • Frontend izveide
      • Backend izstrāde
    • Staff Augmentation
      • Frontend izstrādātāji
      • Backend izstrādātāji
      • Datu inženieri
      • Mākoņa inženieri
      • QA inženieri
      • Citi
    • Tā Konsultatīvais dienests
      • Audits un konsultācijas
  • Nozares
    • Fintech un banku darbība
    • E-commerce
    • Adtech
    • Healthtech
    • Ražošana
    • Loģistika
    • Automobiļu nozare
    • IOT
  • Vērtība par
    • CEO
    • CTO
    • Piegādes vadītājs
  • Mūsu komanda
  • Case Studies
  • Zināt, kā
    • Blogs
    • Tikšanās
    • Tiešsaistes semināri
    • Resursi
Karjera Sazinieties ar mums
  • Par mums
  • Pakalpojumi
    • Programmatūras izstrāde
      • Frontend izveide
      • Backend izstrāde
    • Staff Augmentation
      • Frontend izstrādātāji
      • Backend izstrādātāji
      • Datu inženieri
      • Mākoņa inženieri
      • QA inženieri
      • Citi
    • Tā Konsultatīvais dienests
      • Audits un konsultācijas
  • Vērtība par
    • CEO
    • CTO
    • Piegādes vadītājs
  • Mūsu komanda
  • Case Studies
  • Zināt, kā
    • Blogs
    • Tikšanās
    • Tiešsaistes semināri
    • Resursi
Karjera Sazinieties ar mums
Atpakaļ bultiņa ATGRIEZTIES ATPAKAĻ
2022-01-13
Programmatūras izstrāde

Polimorfisms Ruby un GraphQL valodās

Lukasz Brzeszcz

Šajā rakstā es iepazīstināšu ar polimorfisma izmantošanu GraphQL. Tomēr, pirms es sāku, ir vērts atgādināt, kas ir polimorfisms un GraphQL.

Polimorfisms

Polimorfisms ir svarīgs komponents objektorientēta programmēšana. Lai vienkāršotu lietas, tā pamatā ir fakts, ka dažādu klašu objektiem ir piekļuve vienam un tam pašam interfeisam, kas nozīmē, ka no katra no tiem varam sagaidīt vienu un to pašu funkcionalitāti, bet ne vienmēr tā ir īstenota vienādi. In Rubīns izstrādātāji var iegūt polimorfisms trīs veidos:

Mantojums

Mantojums ir izveidot vecāku klasi un bērnu klases (t. i., mantot no vecāku klases). Apakšklases saņem vecākās klases funkcionalitāti, kā arī ļauj mainīt un pievienot funkcionalitāti.

Piemērs:

klase Dokuments
  attr_reader :name
beigas

klase PDFDocument < Document
  def paplašinājums
    :pdf
  end
end

klase ODTDocument < Dokuments
  def paplašinājums
    :odt
  end
end

Moduļi

Moduļi Rubīns ir daudz pielietojumu. Viens no tiem ir miksīni (vairāk par miksīniem lasiet sadaļā Galīgais sadalījums: Rubīns vs Python). Sajaukumus Ruby valodā var izmantot līdzīgi kā saskarnes citās valodās. programmēšanas valodas (piem. Java), piemēram, tajos var definēt metodes, kas ir kopīgas objektiem, kuri satur konkrēto miksīnu. Laba prakse ir moduļos iekļaut tikai lasīšanai paredzētas metodes, t.i., metodes, kas nemainīs šī objekta stāvokli.

Piemērs:

modulis Ar nodokli apliekamais
  def tax

     cena * 0,23
  beigas
end

klase Automašīna
  include Taxable
 attr_reader :price
end

klase Book
  include Taxable

 attr_reader :price
end

Pīles drukāšana

Tā ir viena no dinamiski tipizētu valodu galvenajām iezīmēm. Nosaukums cēlies no slavenā pārbaudījuma, ja tas izskatās kā pīle, peld kā pīle un krakšķ kā pīle, tad tas, iespējams, ir pīle. . programmētājs nav jāinteresējas, kurai klasei pieder dotais objekts. Svarīgas ir metodes, kuras var izsaukt uz šo objektu.

Izmantojot iepriekš minētajā piemērā definētās klases:

klase Automobilis
  attr_reader :price

 def initialize(price)
    @price = price
   end
end

klase Book
  attr_reader :price

 def initialize(price)
    @price = price
  end
end

car = Car.new(20.0)
book = Book.new(10.0)

[car, book].map(&:price

GrapQL

GraphQL ir salīdzinoši jauna API pieprasīšanas valoda. Tās priekšrocības ir tādas, ka tai ir ļoti vienkārša sintakse, turklāt klients pats izlemj, ko tieši viņš vēlas saņemt, jo katrs klients saņem tieši to, ko vēlas, un neko citu.

Parauga vaicājums GraphQL:

{
  allUsers {
     users {
        id
        login
        e-pasts

       }
     }
   }

Atbildes paraugs:

{
  "allUsers": {
    "users": [
     {
        "id": 1,
        "login": "user1",
        "email": "[email protected]": "[email protected]"
      },
      {
        "id": 2,
        "login": "user2",
        "email": "[email protected]".
      },
    ]
  }
}

Iespējams, tas ir viss, kas mums šobrīd ir jāzina. Pārejam pie lietas būtības.

Problēmas izklāsts

Lai labāk izprastu problēmu un tās risinājumu, izveidosim piemēru. Būtu labi, ja šis piemērs būtu gan oriģināls, gan diezgan piezemēts. Tāds, lai katrs no mums kādu dienu var sastapties. Kā ir ar... dzīvniekiem? Jā! Lieliska ideja!

rubīns un grafql polimorfisms - dzīvnieki

Pieņemsim, ka mums ir backend lietojumprogramma, kas rakstīta valodā Ruby on Rails. Tā jau ir pielāgota iepriekš minētās shēmas izmantošanai. Pieņemsim arī, ka mums jau ir GraphQL konfigurēts. Mēs vēlamies, lai klients varētu veikt pieprasījumu ar šādu struktūru:

{
 allZoos : {
    zooloģiskais dārzs: {
      nosaukums
      pilsēta
      dzīvnieki: {
        ...
      }
    }
  }
}

Ko vajadzētu ievietot trīs punktu vietā, lai iegūtu trūkstošo informāciju - mēs uzzināsim vēlāk.

Īstenošana

Turpmāk izklāstīšu soļus, kas nepieciešami mērķa sasniegšanai.

Vaicājuma pievienošana QueryType

Vispirms ir jādefinē, ko tieši nozīmē vaicājums allZoos. Lai to izdarītu, mums jāapmeklē failsapp/graphql/types/query_type.rb un definēt vaicājumu:

   moduļu veidi
      klase QueryType < Types::BaseObject
       field :all_zoos, [Types::ZooType], null: false

       def all_zoos
          Zoo.all
       end
    end
 end

Vaicājums jau ir definēts. Tagad ir pienācis laiks definēt atdeves tipus.

Veidu definīcijas

Pirmais nepieciešamais tips būs ZooType. Definēsim to failā app/graphql/types/ zoo_type.rb:

moduļu veidi
  klase ZooType < Types::BaseObject
    field :name, String, null: false
    lauks :city, String, null: false
    lauks :animals, [Types::AnimalType], null: false
  end
end

Tagad ir pienācis laiks definēt tipu AnimalType:

moduļu veidi
  klase AnimalType < Types::BaseUnion
   possible_types ElephantType, CatType, DogType

     def self.resolve_type(obj, ctx)
       if obj.is_a?(Elephant)
          ElephantType
       elsif obj.is_a?(Cat)
         CatType
       elsif obj.is_a?(Dog)
        DogType
      end
    end
  end
end

Ko mēs redzam kods iepriekš?

  1. AnimalType manto no Types::BaseUnion.
  2. Mums ir jāuzskaita visi veidi, kas var veidot konkrēto savienību.
    3.We override funkciju self.resolve_object(obj, ctx),kam jāatgriež dotā objekta tips.

Nākamais solis ir noteikt dzīvnieku veidus. Tomēr mēs zinām, ka daži lauki ir kopīgi visiem dzīvniekiem. Iekļausim tos tipā AnimalInterface:

moduļu veidi
  modulis AnimalInterface
    include Types::BaseInterface

    field :name, String, null: false
    field :age, Integer, null: false
  end
end

Izmantojot šo saskarni, mēs varam turpināt definēt konkrētu dzīvnieku tipus:

moduļu veidi
  klase ElephantType < Types::BaseObject
    implementē Types::AnimalInterface

    field :trunk_length, Float, null: false
  end
end

modulis Types
  klase CatType < Types::BaseObject
   implementē Types::AnimalInterface

   field :hair_type, String, null: false
  end
end

modulis Types
  klase DogType < Types::BaseObject
    implementē Types::AnimalInterface

     field :breed, String, null: false
  end
end

Tas ir viss! Gatavs! Pēdējais jautājums: kā mēs varam izmantot to, ko esam izdarījuši no klienta puses?

Vaicājuma izveide

{
 allZoos : {
   zooloģiskais dārzs: {
      nosaukums
      pilsēta
      dzīvnieki: {
        __typename

        ... on ElephantType {
          nosaukums
          vecums
          stumbra garums
        }

         ... on CatType {
          nosaukums
          vecums
          hairType
         }
         ... on DogType {
          nosaukums
          vecums
          šķirne
         }
       }
     }
   }
 }

Šeit mēs varam izmantot papildu lauku __typename, kas atgriezīs precīzu dotā elementa tipu (piemēram, CatType). Kā izskatīsies atbildes paraugs?

{
  "allZoos": [

   {
      "name": "Natura Artis Magistra",
      "city": "Amsterdam",
      "dzīvnieki": [
        {
          "__typename": "ElephantType"
          "name": "Franco",
          "age": 28,
          "stumbra garums": 9.27
         },
         {
         "__typename": "DogType"
         "name": "Jack",
         "age": 9,
         "šķirne": "Džeka Rasela terjers".
        },
      ]
    }
  ]
} 

Analīze

Viens šīs pieejas trūkums ir acīmredzams. Pieprasījumā katram tipam ir jāievada vārds un vecums, lai gan mēs zinām, ka šie lauki ir visiem dzīvniekiem. Tas nav traucējoši, ja kolekcijā ir pilnīgi atšķirīgi objekti. Tomēr šajā gadījumā dzīvniekiem ir gandrīz visi kopīgi lauki. Vai to var kaut kā uzlabot?

Protams! Mēs veicam pirmās izmaiņas failā app/graphql/types/zoo_type.rb:

moduļu veidi
  klase ZooType < Types::BaseObject
    field :name, String, null: false
    lauks :city, String, null: false
    lauks :animals, [Types::AnimalInterface], null: false
  end
end

Mums vairs nav vajadzīga tā savienība, ko esam definējuši iepriekš. Mēs mainām Types::AnimalType uz Types::AnimalInterface.

Nākamais solis ir pievienot funkciju, kas atgriež tipu no Veidi :: AnimalInterface un pievienot arī sarakstu ar orphan_types, t.i., tipiem, kas nekad netiek tieši izmantoti:

moduļu veidi
  modulis AnimalInterface
    include Types::BaseInterface

   field :name, String, null: false
   field :age, Integer, null: false

   definition_methods do
      def resolve_type(obj, ctx)
        if obj.is_a?(Elephant)
          ElephantType
        elsif obj.is_a?(Cat)
          CatType
        elsif obj.is_a?(Dog)
          DogType
        end
      end
    end
    orphan_types Types::ElephantType, Types::CatType, Types::DogType
  end
end

Pateicoties šai vienkāršai procedūrai, pieprasījumam ir mazāk sarežģīta forma:

{
  allZoos : {
   zooloģiskais dārzs: {
      nosaukums
      pilsēta
      dzīvnieki: {
        __typename
        nosaukums
        vecums

       ... on ElephantType {
          stumbra garums

       }
       ... on CatType {
          hairType

       }
       ... on DogType {
          šķirne

        }
      }
    }
  }
}

Kopsavilkums

GraphQL ir patiešām lielisks risinājums. Ja vēl nezināt, izmēģiniet to. Ticiet man, tas ir tā vērts. Tas lieliski risina problēmas, kas rodas, piemēram, REST API. Kā es parādīju iepriekš, polimorfisms nav reāls šķērslis tam. Es iepazīstināju ar divām metodēm, kā to risināt.
Atgādinājums:

  • Ja darbojaties ar objektu sarakstu ar kopīgu bāzi vai kopīgu saskarni - izmantojiet saskarnes,
  • Ja darbojaties ar objektu sarakstu ar atšķirīgu struktūru, izmantojiet citu saskarni - izmantojiet union

Lasīt vairāk

GraphQL Ruby. Kā ir ar veiktspēju?

Sliedes un citi transporta līdzekļi

Rails attīstība ar TMUX, Vim, Fzf + Ripgrep

Saistītie raksti

Ilustrācija viedtālruņa veselības aprūpes lietotnei ar sirds ikonu un pieaugošo veselības diagrammu, kas apzīmēta ar The Codest logotipu, kurš pārstāv digitālās veselības un HealthTech risinājumus.
Programmatūras izstrāde

Veselības aprūpes programmatūra: Mārketinga programmatūra: veidi, izmantošanas gadījumi

Šodien veselības aprūpes organizāciju rīcībā esošie rīki vairs neatgādina papīra diagrammas, kas tika izmantotas pirms vairākiem gadu desmitiem. veselības aprūpes programmatūra tagad atbalsta veselības aprūpes sistēmas, pacientu aprūpi un mūsdienīgu veselības aprūpes sniegšanu klīniskajās un...

TĀKĀDĒJAIS
Abstrakta ilustrācija ar lejupejošu joslu diagrammu ar augošu bultiņu un zelta monētu, kas simbolizē izmaksu efektivitāti vai ietaupījumus. Augšējā kreisajā stūrī redzams The Codest logotips ar saukli "In Code We Trust" uz gaiši pelēka fona.
Programmatūras izstrāde

Kā paplašināt izstrādātāju komandu, nezaudējot produkta kvalitāti

Palielināt izstrādātāju komandu? Uzziniet, kā augt, nezaudējot produkta kvalitāti. Šajā rokasgrāmatā aplūkotas pazīmes, kas liecina, ka ir pienācis laiks paplašināt komandu, komandas struktūra, pieņemšana darbā, vadība un rīki, kā arī tas, kā The Codest var...

TĀKĀDĒJAIS
Programmatūras izstrāde

Uz nākotni noturīgu tīmekļa lietojumprogrammu veidošana: The Codest ekspertu komandas ieskats

Uzziniet, kā The Codest izceļas mērogojamu, interaktīvu tīmekļa lietojumprogrammu izveidē, izmantojot modernākās tehnoloģijas un nodrošinot viengabalainu lietotāja pieredzi visās platformās. Uzziniet, kā mūsu zināšanas veicina digitālo transformāciju un biznesa...

TĀKĀDĒJAIS
Programmatūras izstrāde

Top 10 Latvijā bāzēti programmatūras izstrādes uzņēmumi

Mūsu jaunākajā rakstā uzziniet vairāk par Latvijas labākajiem programmatūras izstrādes uzņēmumiem un to inovatīvajiem risinājumiem. Uzziniet, kā šie tehnoloģiju līderi var palīdzēt uzlabot jūsu biznesu.

thecodest
Uzņēmumu un mērogošanas risinājumi

Java programmatūras izstrādes pamati: A Guide to Outsourcing Successfully

Izpētiet šo būtisko rokasgrāmatu par veiksmīgu outsourcing Java programmatūras izstrādi, lai uzlabotu efektivitāti, piekļūtu speciālajām zināšanām un sekmīgi īstenotu projektus ar The Codest.

thecodest

Abonējiet mūsu zināšanu bāzi un saņemiet jaunāko informāciju par IT nozares pieredzi.

    Par mums

    The Codest - starptautisks programmatūras izstrādes uzņēmums ar tehnoloģiju centriem Polijā.

    Apvienotā Karaliste - Galvenā mītne

    • 303B birojs, 182-184 High Street North E6 2JA
      Londona, Anglija

    Polija - Vietējie tehnoloģiju centri

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Krakova
    • Brain Embassy, Konstruktorska
      11, 02-673 Varšava, Polija

    The Codest

    • Sākums
    • Par mums
    • Pakalpojumi
    • Case Studies
    • Zināt, kā
    • Karjera
    • Vārdnīca

    Pakalpojumi

    • Tā Konsultatīvais dienests
    • Programmatūras izstrāde
    • Backend izstrāde
    • Frontend izveide
    • Staff Augmentation
    • Backend izstrādātāji
    • Mākoņa inženieri
    • Datu inženieri
    • Citi
    • QA inženieri

    Resursi

    • Fakti un mīti par sadarbību ar ārējo programmatūras izstrādes partneri
    • No ASV uz Eiropu: Kāpēc Amerikas jaunuzņēmumi nolemj pārcelties uz Eiropu?
    • Tehnoloģiju ārzonas attīstības centru salīdzinājums: Tech Offshore Eiropa (Polija), ASEAN (Filipīnas), Eirāzija (Turcija)
    • Kādi ir galvenie CTO un CIO izaicinājumi?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Autortiesības © 2026 The Codest. Visas tiesības aizsargātas.

    lvLatvian
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian es_ESSpanish nl_NLDutch etEstonian elGreek pt_PTPortuguese cs_CZCzech lt_LTLithuanian is_ISIcelandic lvLatvian