window.pipedriveLeadboosterConfig = { base: leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(function () { var w = window if (w.LeadBooster) { console.warn('LeadBooster on juba olemas') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() Ruby tarkvara arendamine: The Codest - The Codest
The Codest
  • Meie kohta
  • Teenused
    • Tarkvaraarendus
      • Frontend arendus
      • Backend arendus
    • Staff Augmentation
      • Frontend arendajad
      • Backend arendajad
      • Andmeinsenerid
      • Pilveinsenerid
      • QA insenerid
      • Muud
    • See nõuandev
      • Audit ja nõustamine
  • Tööstusharud
    • Fintech & pangandus
    • E-commerce
    • Adtech
    • Healthtech
    • Tootmine
    • Logistika
    • Autotööstus
    • IOT
  • Väärtus
    • CEO
    • CTO
    • Tarnejuht
  • Meie meeskond
  • Case Studies
  • Tea kuidas
    • Blogi
    • Kohtumised
    • Veebiseminarid
    • Ressursid
Karjäärivõimalused Võtke ühendust
  • Meie kohta
  • Teenused
    • Tarkvaraarendus
      • Frontend arendus
      • Backend arendus
    • Staff Augmentation
      • Frontend arendajad
      • Backend arendajad
      • Andmeinsenerid
      • Pilveinsenerid
      • QA insenerid
      • Muud
    • See nõuandev
      • Audit ja nõustamine
  • Väärtus
    • CEO
    • CTO
    • Tarnejuht
  • Meie meeskond
  • Case Studies
  • Tea kuidas
    • Blogi
    • Kohtumised
    • Veebiseminarid
    • Ressursid
Karjäärivõimalused Võtke ühendust
Tagasi nool TAGASI
2021-05-28
Tarkvaraarendus

Ruby tarkvara arendamine: Pangameetodid ja nende loomise viisid

The Codest

Piotr Komorowski

Software Engineer

Enne kui hakkame looma paukmeetodit, uurime, mis on täpselt seda tüüpi meetod ja millised on selle omadused. Alustame sellest, et sellist tüüpi meetodite kohta puudub üheselt mõistetav definitsioon. Lihtsalt öeldes on bang-metoodika meetod, mille lõpus on hüüumärk.

Me võime sageli kohata väidet, et paukmeetod on teatud mõttes ohtlik meetod ja hüüumärk selle määratluse lõpus ütleb meile, et selle meetodi kasutamisel tuleb olla valvas. Vaatame: mis on see ohtlikkus täpselt, kui tegemist on nende meetoditega ja millised on nende omadused?

Paukmeetodite omadused

1. Põrgumeetod muudab vastuvõtjat

Selliste meetodite üks populaarsemaid omadusi on see, et nad tavaliselt muudavad oma publikut. Võtame näitena map! meetodi. Dokumentatsiooni kohaselt kutsub map! meetod antud plokki üks kord iga self'i elemendi kohta, asendades elemendi ploki poolt tagastatud väärtusega ja kui plokki ei ole antud, tagastatakse selle asemel Enumerator.

 arry = [1, 2, 3, 4, 5]
 arry.object_id => 280
 arry.map! {|num| num**num } => [1, 4, 27, 256, 3125]
 arry.map!                       => #
 arry.map! {|n| n } => [1, 4, 27, 256, 3125]
 arry.object_id => 280

Nagu näeme, jääb object_id muutumatuks. Seega tundub sellise meetodi kasutamise oht ilmne. Kui meie kood me kasutasime muutujat arry kuskil mujal, siis kaart! muudab seda. See võib põhjustada meie programmi ebasoovitavat toimimist või isegi krahhi.

Seal on objektid Ruby mida ei saa muuta, näiteks klasside Integer, Float ja Symbol isendid. Töötamise ajal on projekt, võid ka kohtuda nn magic-kommentaariga, mis läheb nii:

frozenstringliteral: true

Püüdes muuta stringi saaja koodi, kus sellist kommentaari kasutati, tekiks selline viga:

 'abc'.upcase!
 FrozenError (ei saa muuta külmutatud stringi)

Huvitaval kombel oli kavas kehtestada muutumatu stringi sisse Ruby 3.0, kuid otsustati seda muudatust mitte teha. Siiski tuleb meeles pidada, et mitte kõik paukmeetodid ei muuda vastuvõtjat, seega tuleks alati kontrollida dokumentatsioonist, millist ohtu peaksite konkreetse meetodi puhul ootama.

2. Bangi meetod tekitab erandi

Veel üks nende meetodite eripära on see, et paljude meetodite puhul tehakse erand. Näide sellisest meetodist on ActiveRecord::FinderMethods#first! Dokumentatsiooni kohaselt on meetod first! sama, mis esimene, kuid tekitab ActiveRecord::RecordNotFound, kui kirjeid ei leita. Pange tähele, et first! ei võta vastu ühtegi argumenti.

Faili activerecord/lib/activerecord/relation/findermethods.rb, rida 128

def first!
first || raiserecordnotfoundexception!
end

Kuid ActiveRecord::FinderMethods#first meetod, mida kasutatakse eespool, näeb välja nii:

Faili activerecord/lib/activerecord/relation/findermethods.rb, rida 116

def first(limit = nil)
checkreorderdeprecation unless loaded?

if limit
findnthwithlimit(0, limit)
else
findnth 0
end
end

Tänu ülaltoodud näidetele näeme ohtu, et kasutada esimest. Kui me kasutame ActiveRecord::FinderMethods#find! ja see ei leia andmebaasist sobivat kirjet, siis tagastab ta ActiveRecord::RecordNotFound, mis võib põhjustada meie programmi töö seiskumise.

Siiski tuleb meeles pidada, et see ei tähenda, et kui meetodi lõpus ei ole hüüumärki, siis on see turvaline ja ei tekita erandit ega muuda vastuvõtjat.

Ruby on Rails 6.0 võeti kasutusele uus meetodite paar: ActiveRecord::Persistence::ClassMethods#insert_all ja ActiveRecord::Persistence::ClassMethods#insert_all!

Esimene neist meetoditest näitab juba teatavat ohtu. Noh, vastavalt dokumentatsioonile, sisestagekõik sisestab andmebaasi mitu kirjet ühe SQL INSERT-avaldusega. See ei instantseeri ühtegi mudelit ega käivita ActiveRecordi tagasikutseid ega valideerimisi. Kuid sisestamineall! tõstab lisaks ActiveRecord::RecordNotUnique, kui mõni rida rikub tabeli unikaalset indeksit. Sellisel juhul ei sisestata ühtegi rida. See tähendab, et esimene neist meetoditest salvestab kõik kirjed, välja arvatud need, mis rikuvad unikaalset indeksit, samas kui teine (ohtlikum) meetod tekitab erandi ja ei salvesta ühtegi kirjet andmebaasi.

3. Põrgumeetodil on samaväärne ilma hüüumärgita

Paljud meetodid, isegi kui nende lõpus ei ole hüüumärki, on ohtlikud kasutada. Näiteks ActiveRecord::FinderMethods#find. Vastavalt dokumentatsioonile Kui ühte või mitut kirjet ei leita taotletud id-de jaoks, siis tõstetakse ActiveRecord::RecordNotFound.

Näeme, et kuigi see meetod on sama ohtlik kui ActiveRecord::FinderMethods#first!, ei ole tal hüüumärki.

Sama kehtib ka vastuvõtja muutmise kohta. Näiteks Array.delete (nagu dokumenteeritud) kustutab kõik elemendid self'ist, mis on võrdsed objektiga, ja tagastab viimase kustutatud elemendi või nil, kui vastavaid elemente ei leita.

 a = [1, 2, 3, 4, 5]
 a.object_id #=> 320
 a.delete(2) #=> 2
 a #=> [1, 3, 4, 5]
 a.delete(6) #=> nil
 a.object_id #=> 320

On selgelt näha, et objekti on muudetud. Nende kahe meetodi ühisosa on see, et neil ei ole hüüumärgi ekvivalenti. Seega, kui meetodil, mida me soovime luua, oleks selliseid ohte, mida ma eespool mainisin, ei pea selle lõpus olema kohe hüüumärki. Lisaks on soovitatav luua paukmeetod, kui on juba olemas sama nimega meetod, mis on vähem ohtlik kui meetod, mida tahetakse luua.

Millal kasutada paukmeetodeid

Võite küsida, milleks üldse neid ohtlikke meetodeid kasutada, eriti kuna meil on tavaliselt vähem ohtlikud vasted. Üheks eeliseks võib olla näiteks koodi parem jõudlus tänu loodud objektide arvu vähendamisele. Siit saate lugeda rohkem Railsi jõudluse suurendamise kohta.

Kui tegemist on erandite tekitamisega, võib ohtliku create! asemel create meetodi kasutamine viia olukorrani, kus viga meie rakenduses on raskesti avastatav, sest kirjeid ei kirjutata andmebaasi. Seega, kui me oleme kindlad, et parameetrid, mida me sellele meetodile üle anname, on õiged, peaksime kasutama create! meetodit, mis tekitab erandi, kui mingil põhjusel ei salvestata kirjet andmebaasi.

Järeldus on lihtne ja see on järgmine: selliste meetodite mõistlik kasutamine võib parandada meie koodi jõudlust ja kvaliteeti. Siiski peame alati meeles pidama, et nende ebaõige kasutamine võib takistada koodi korralikku töötamist.

Millal luua oma paugumeetod

Kui soovite luua oma ohtliku meetodi, peate läbima teatud otsustusprotsessi. Kõigepealt tuleb küsida, kas on juba olemas meetod, millel on sama nimi kui sellel, mida soovite luua, kuid mis on vähem ohtlik. Võite kaaluda ka meetodite paari loomist, kus üks neist on samaväärne teise meetodiga, ainult ohtlikum.

Pole mõtet luua paukemeetodit, kui selle vaste ilma hüüumärgita puudub. On meetodeid, mis on ohtlikud, sest nad muudavad objekti või tekitavad erandi, aga neil ei ole nime lõpus hüüumärki. Kui luua bang-metoodika, millel puudub vaste, ajab see teie koodi kasutava programmeerija segadusse. See inimene ei oskaks öelda, milles seisneb selle meetodi ohtlikkus ja miks ta väärib hüüumärki nime lõpus.

Teiseks peaksime kaaluma, millistest ohtudest me räägime. Ülaltoodud näidetest võime järeldada, et kõige tavalisem ohu tüüp on objekti enda muutmine (selle koopia loomise asemel) või erandi tekitamine. Loomulikult ei ole see mitte reegel, vaid pigem Ruby ja Ruby on Rails-s defineeritud meetodite analüüsi tulemus. Näiteks võiksime vaadelda sellise meetodipaari rakendamist, kus meetod ilma hüüumärk salvestaks kirje andmebaasi, samas kui hüüumärgiga meetod jätaks selle kirje valideerimise vahele. Sellisel juhul on selge, milles seisneb selliste meetodite kasutamise potentsiaalne oht.

Kokkuvõte

Kokkuvõte paugumeetodite teadmistest viitab järgmistele järeldustele: 1. meetodil hüüumärgiga on vähem ähvardav vaste ilma hüüumärgita, teiseks, hüüumärgiga meetod sooritab ohtliku toimingu, nt muudab vastuvõtjat või tekitab erandi.

Kokkuvõtteks võib öelda, et mõiste bang meetodid aadressil Ruby tarkvaraarendus võib oluliselt parandada teie kodeerimisoskusi ja tuua rohkem selgust teie koodibaasi. Bang meetodid, mida tähistab hüüumärk nende nimede lõpus, näitavad meetodi destruktiivset või potentsiaalselt ohtlikku versiooni. Konventsiooni kohaselt on bang counterpart meetodi tuleks kasutada ettevaatlikult, kuna see võib muuta objekte otse, ilma eraldi koopiat loomata. See võib olla eriti kasulik, kui tegemist on muutuvate objektidega või kui tulemuslikkuse optimeerimine on probleemiks. Siiski on oluline olla ettevaatlik bang-metoodikate kasutamisel, kuna neil võivad olla soovimatud tagajärjed, kui neid ei käsitleta õigesti. Samuti tasub märkida, et mitte kõik meetodid ei ole bang versioonja nende olemasolu tuleks hinnata iga juhtumi puhul eraldi. Teades, millal ja kuidas luua bang-metoodikaid, saate seda võimsat vahendit tõhusalt kasutada ja kirjutada puhast, tõhusat koodi, mis vastab teie spetsiifilistele nõuetele.

Seotud artiklid

Fintech

5 näidet Ruby parimast kasutamisest

Kas olete kunagi mõelnud, mida me saame teha Ruby'ga? Noh, taevas on ilmselt piirideta, kuid me räägime hea meelega mõnest rohkem või vähem teadaolevast juhtumist...

The Codest
Pawel Muszynski Software Engineer
Enterprise & Scaleups lahendused

Parimad tavad tugeva ja sidusa meeskonna loomiseks

Koostöö on tarkvaraarenduse edukuse seisukohalt ülioluline. Tugev meeskond, mis teeb head koostööd, suudab saavutada paremaid tulemusi ja ületada probleeme. Koostöö edendamiseks on vaja jõupingutusi, suhtlemist ja pidevat...

The Codest
Krystian Barchanski Frontend Unit Leader
Tarkvaraarendus

NextJS-i andmete hankimise strateegiad

Viimasel ajal kogub NextJS üha suuremat populaarsust React rakenduste loomise viisina. Kindlasti aitab sellele oluliselt kaasa asjaolu, et NextJS pakub mitmeid erinevaid andmehõivamisstrateegiaid.

The Codest
Pawel Rybczynski Software Engineer
Tarkvaraarendus

Kõige populaarsemate React konksude sügavam uurimine

Paljude intervjuude käigus olen märganud, et isegi kogenud programmeerijatel on probleeme konksude eristamisega, rääkimata nende keerukamatest võimalustest. Niisiis, ma püüan...

The Codest
Pawel Rybczynski Software Engineer

Tellige meie teadmistebaas ja jääge kursis IT-sektori eksperditeadmistega.

    Meie kohta

    The Codest - rahvusvaheline tarkvaraarendusettevõte, mille tehnoloogiakeskused asuvad Poolas.

    Ühendkuningriik - peakorter

    • Büroo 303B, 182-184 High Street North E6 2JA
      London, Inglismaa

    Poola - kohalikud tehnoloogiakeskused

    • Fabryczna büroopark, Aleja
      Pokoju 18, 31-564 Kraków
    • Brain Embassy, Konstruktorska
      11, 02-673 Varssavi, Poola

      The Codest

    • Kodu
    • Meie kohta
    • Teenused
    • Case Studies
    • Tea kuidas
    • Karjäärivõimalused
    • Sõnastik

      Teenused

    • See nõuandev
    • Tarkvaraarendus
    • Backend arendus
    • Frontend arendus
    • Staff Augmentation
    • Backend arendajad
    • Pilveinsenerid
    • Andmeinsenerid
    • Muud
    • QA insenerid

      Ressursid

    • Faktid ja müüdid koostööst välise tarkvaraarenduspartneriga
    • USAst Euroopasse: Miks otsustavad Ameerika idufirmad Euroopasse ümber asuda?
    • Tech Offshore arenduskeskuste võrdlus: Euroopa (Poola), ASEAN (Filipiinid), Euraasia (Türgi).
    • Millised on CTO ja CIOde peamised väljakutsed?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Copyright © 2025 by The Codest. Kõik õigused kaitstud.

    etEstonian
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese ko_KRKorean es_ESSpanish nl_NLDutch elGreek etEstonian