window.pipedriveLeadboosterConfig = { basis: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', versie: 2, } ;(functie () { var w = venster als (w.LeadBooster) { console.warn('LeadBooster bestaat al') } anders { w.LeadBooster = { q: [], on: functie (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: functie (n) { this.q.push({ t: 't', n: n }) }, } } })() Ruby softwareontwikkeling: Knalmethoden en manieren om ze te maken - The Codest
The Codest
  • Over ons
  • Diensten
    • Software Ontwikkeling
      • Frontend ontwikkeling
      • Backend ontwikkeling
    • Staff Augmentation
      • Frontend ontwikkelaars
      • Backend ontwikkelaars
      • Gegevensingenieurs
      • Cloud Ingenieurs
      • QA ingenieurs
      • Andere
    • Het advies
      • Audit & Consulting
  • Industrie
    • Fintech & Bankieren
    • E-commerce
    • Adtech
    • Gezondheidstechnologie
    • Productie
    • Logistiek
    • Automotive
    • IOT
  • Waarde voor
    • CEO
    • CTO
    • Leveringsmanager
  • Ons team
  • Case Studies
  • Weten hoe
    • Blog
    • Ontmoetingen
    • Webinars
    • Bronnen
Carrière Neem contact op
  • Over ons
  • Diensten
    • Software Ontwikkeling
      • Frontend ontwikkeling
      • Backend ontwikkeling
    • Staff Augmentation
      • Frontend ontwikkelaars
      • Backend ontwikkelaars
      • Gegevensingenieurs
      • Cloud Ingenieurs
      • QA ingenieurs
      • Andere
    • Het advies
      • Audit & Consulting
  • Waarde voor
    • CEO
    • CTO
    • Leveringsmanager
  • Ons team
  • Case Studies
  • Weten hoe
    • Blog
    • Ontmoetingen
    • Webinars
    • Bronnen
Carrière Neem contact op
Pijl terug KEREN TERUG
2021-05-28
Software Ontwikkeling

Ruby software ontwikkeling: Knalmethoden en manieren om ze te maken

The Codest

Piotr Komorowski

Software Engineer

Voordat we beginnen met het maken van een bang methode, moeten we eerst leren wat dit type methode precies is en wat de kenmerken ervan zijn. Laten we beginnen met het feit dat er geen eenduidige definitie is van dit soort methoden. Simpel gezegd is een bang method een methode met een uitroepteken aan het einde.

We komen vaak tegen dat de bang methode in zekere zin een gevaarlijke methode is en het uitroepteken aan het einde van de definitie vertelt ons dat we waakzaam moeten zijn bij het gebruik van deze methode. Laten we eens kijken: wat is dit gevaar precies als het gaat om deze methoden en wat zijn hun kenmerken?

Kenmerken van knalmethoden

1. De bang-methode verandert de ontvanger

Een van de populairste kenmerken van dit soort methoden is dat ze meestal hun publiek veranderen. Laten we eens kijken naar de map! methode als voorbeeld. Volgens de documentatie roept de map! methode het gegeven blok eenmaal aan voor elk element van self, waarbij het element wordt vervangen door de waarde die door het blok wordt geretourneerd en als er geen blok wordt gegeven, wordt in plaats daarvan een enumerator geretourneerd.

 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

Zoals we kunnen zien, blijft object_id ongewijzigd. Het gevaar van het gebruik van een dergelijke methode lijkt dus duidelijk. Als in onze code we de variabele arry ergens anders hebben gebruikt, dan zal de map! deze veranderen. Dit kan ertoe leiden dat ons programma op een ongewenste manier werkt of zelfs crasht.

Er zijn objecten in Ruby die niet gewijzigd kunnen worden, zoals instanties van de klassen Integer, Float en Symbol. Tijdens het werken aan een projectJe kunt ook het zogenaamde magische commentaar tegenkomen dat als volgt gaat:

bevrorenstringletterlijk: waar

Pogingen om de ontvanger van de String te wijzigen in de code waar een dergelijke opmerking werd gebruikt, zouden resulteren in een fout zoals deze:

 'abc'.upcase!
 FrozenError (kan bevroren String niet wijzigen)

Interessant genoeg waren er plannen om onveranderlijke String te introduceren in Ruby 3.0maar werd besloten deze wijziging niet door te voeren. Onthoud echter dat niet alle bang-methoden de ontvanger veranderen, dus je moet altijd in de documentatie controleren wat voor gevaar je kunt verwachten in het geval van een bepaalde methode.

2. De bang-methode maakt een uitzondering

Een ander onderscheidend kenmerk van deze methoden is dat voor veel ervan een uitzondering wordt gemaakt. Een voorbeeld van zo'n methode is de ActiveRecord::FinderMethods#first! Volgens de documentatie is de methode first! hetzelfde als de methode first, maar roept ActiveRecord::RecordNotFound op als er geen record wordt gevonden. Merk op dat first! geen argumenten accepteert.

Bestand activerecord/lib/activerecord/relation/findermethods.rb, regel 128

def first!
first || raiserecordnotfoundexception!
end

De ActiveRecord::FinderMethods#first methode die hierboven wordt gebruikt ziet er echter als volgt uit:

Bestand activerecord/lib/activerecord/relation/findermethods.rb, regel 116

def eerste(limiet = nil)
checkreorderdeprecation tenzij geladen?

als limiet
findnthwithlimit(0, limiet)
anders
findnth 0
einde
einde

Dank dus de bovenstaande voorbeelden, zien we het gevaar van het gebruik van de eerste. Als we ActiveRecord::FinderMethods#find! gebruiken en het vindt geen geschikt record in de database, dan zal het ActiveRecord::RecordNotFound retourneren, waardoor ons programma kan stoppen met werken.

We moeten echter onthouden dat dit niet betekent dat als een methode geen uitroepteken aan het einde heeft, deze veilig is en geen exceptie zal oproepen of de ontvanger zal veranderen.

In Ruby on Rails 6.0 is een nieuw paar methoden geïntroduceerd: ActiveRecord::Persistence::ClassMethods#insert_all en ActiveRecord::Persistence::ClassMethods#insert_all!

De eerste van deze methoden vertoont al een zekere mate van gevaar. Welnu, volgens de documentatie is het invoegen vanvoegt meerdere records in de database in met een enkele SQL INSERT-instructie. Er worden geen modellen geïnstantieerd en er worden geen ActiveRecord callbacks of validaties geactiveerd. De insertall! roept bovendien ActiveRecord::RecordNotUnique op als rijen een unieke index op de tabel schenden. In dat geval worden er geen rijen ingevoegd. Dit betekent dat de eerste methode alle records opslaat behalve diegene die de unieke index schenden, terwijl de tweede (gevaarlijkere) methode een uitzondering oproept en geen records opslaat in de database.

3. De bang-methode heeft een equivalent zonder uitroepteken

Veel methoden zijn gevaarlijk om te gebruiken, ook al hebben ze geen uitroepteken aan het einde. Bijvoorbeeld ActiveRecord::FinderMethods#find. Volgens de documentatie Als een of meer records voor de opgevraagde id's niet kunnen worden gevonden, wordt ActiveRecord::RecordNotFound opgeworpen.

We kunnen zien dat, hoewel deze methode dezelfde mate van gevaar heeft als ActiveRecord::FinderMethods#first!, deze geen uitroepteken heeft.

Hetzelfde geldt voor het wijzigen van de ontvanger. Bijvoorbeeld, Array.delete (zoals gedocumenteerd) verwijdert alle items van de self die gelijk zijn aan object en retourneert het laatst verwijderde item, of nil als er geen overeenkomende items zijn gevonden.

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

Je kunt duidelijk zien dat het object is gewijzigd. Wat de twee methoden gemeen hebben, is dat ze geen uitroepteken-equivalent hebben. Daarom, als de methode die we willen maken het soort gevaren zou hebben dat ik hierboven noemde, hoeft het niet meteen een uitroepteken aan het einde te hebben. Bovendien is het aan te raden om een bang method te maken als er al een methode is met dezelfde naam die minder gevaarlijk is dan de methode die je wilt maken.

Wanneer knalmethoden gebruiken

Je kunt je afvragen waarom je deze gevaarlijke methoden überhaupt gebruikt, vooral omdat we meestal minder gevaarlijke tegenhangers hebben. Een van de voordelen kan bijvoorbeeld een verbeterde codeprestatie zijn dankzij het verminderen van het aantal objecten dat wordt aangemaakt. Hier kun je meer lezen over het verhogen van de prestaties van Rails.

Als het gaat om het oproepen van uitzonderingen, kan het gebruik van de methode create in plaats van het gevaarlijke create! leiden tot een situatie waarin een fout in onze applicatie moeilijk te detecteren is, omdat de records niet naar de database worden geschreven. Dus, als we zeker weten dat de parameters die we doorgeven aan deze methode correct zijn, kunnen we beter de create! methode gebruiken, die een exceptie zal oproepen als, om wat voor reden dan ook, het record niet wordt opgeslagen in de database.

De conclusie is eenvoudig en luidt als volgt: verstandig gebruik van dergelijke methoden kan de prestaties en kwaliteit van onze code verbeteren. We moeten echter altijd onthouden dat ongepast gebruik ervoor kan zorgen dat de code niet meer goed werkt.

Wanneer maak je je eigen knalmethode

Als je je eigen gevaarlijke methode wilt maken, moet je een bepaald besluitvormingsproces doorlopen. Ten eerste is de vraag of er al een methode bestaat met dezelfde naam als degene die je wilt maken, maar dan minder gevaarlijk. Je kunt ook overwegen om een paar methodes te maken waarvan de ene gelijkwaardig is aan de andere, alleen gevaarlijker.

Het heeft geen zin om een knalmethode te maken als zijn tegenhanger zonder uitroepteken niet bestaat. Er zijn methodes die gevaarlijk zijn omdat ze het object veranderen of een exception oproepen, en toch hebben ze geen uitroepteken aan het einde van de naam. Het maken van een bang method zonder equivalent zou een programmeur die je code gebruikt in verwarring brengen. Deze persoon zou niet kunnen zeggen wat het gevaar van deze methode is en waarom het een uitroepteken aan het einde van de naam verdient.

Ten tweede moeten we overwegen over wat voor soort gevaren we het hebben. Uit de bovenstaande voorbeelden kunnen we concluderen dat het meest voorkomende type gevaar het veranderen van het object zelf is (in plaats van het maken van een kopie) of het oproepen van een exception. Natuurlijk is dit geen regel, maar eerder een resultaat van het analyseren van de methodes die zijn gedefinieerd in Ruby en Ruby on Rails. We kunnen bijvoorbeeld kijken naar de implementatie van een methodepaar waarbij de methode zonder de uitroepteken zou de record opslaan in de database, terwijl de methode met het uitroepteken de validatie van deze record zou overslaan. In dit geval is het duidelijk waar het potentiële gevaar van het gebruik van dergelijke methoden ligt.

Samenvatting

Een samenvatting van de kennis van knalmethoden leidt tot de volgende conclusies: de 1e methode met het uitroepteken heeft een minder bedreigend tegenhanger zonder uitroepteken, ten tweede voert de methode met een uitroepteken een gevaarlijke actie uit, bijvoorbeeld de ontvanger wijzigen of een uitzondering oproepen.

Concluderend kan worden gesteld dat het begrijpen van het concept van knalmethoden in Ruby softwareontwikkeling kan je codeervaardigheden enorm verbeteren en meer duidelijkheid brengen in je codebase. Knalmethoden, aangeduid met een uitroepteken aan het einde van hun naam, geven een destructieve of potentieel gevaarlijke versie van een methode aan. Volgens conventie wordt de bang tegenhanger van een methode moet met voorzichtigheid gebruikt worden, omdat het objecten direct kan wijzigen, zonder een aparte kopie te maken. Dit kan bijzonder nuttig zijn wanneer je te maken hebt met muteerbare objecten of wanneer prestatie-optimalisatie van belang is. Het is echter belangrijk om voorzichtig te zijn bij het gebruik van bang methods, omdat ze onbedoelde gevolgen kunnen hebben als er niet goed mee wordt omgegaan. Het is ook de moeite waard om op te merken dat niet alle methoden een knalversieen hun aanwezigheid moet van geval tot geval worden beoordeeld. Met de kennis over wanneer en hoe je bang methods moet maken, kun je dit krachtige gereedschap effectief gebruiken en schone, efficiënte code schrijven die voldoet aan je specifieke eisen.

Verwante artikelen

Fintech

5 voorbeelden van het beste gebruik van Ruby

Heb je je ooit afgevraagd wat we met Ruby kunnen doen? Nou, de sky is waarschijnlijk de limit, maar we praten graag over een aantal min of meer bekende gevallen...

The Codest
Pawel Muszynski Software Engineer
Oplossingen voor ondernemingen en schaalvergroting

Beste praktijken voor het bouwen van een sterk en hecht team

Samenwerking is cruciaal voor het succes van softwareontwikkeling. Een sterk team dat goed samenwerkt kan betere resultaten behalen en uitdagingen overwinnen. Om samenwerking te bevorderen, zijn inspanningen, communicatie en voortdurende...

The Codest
Krystian Barchanski Frontend Unit Leader
Software Ontwikkeling

Strategieën voor het ophalen van gegevens in NextJS

De laatste tijd wint NextJS steeds meer aan populariteit als een manier om React toepassingen te bouwen. Het feit dat NextJS verschillende strategieën voor het ophalen van gegevens biedt, draagt hier zeker aan bij.

The Codest
Pawel Rybczynski Software Engineer
Software Ontwikkeling

Een diepere blik op de populairste React haken

In de loop van vele interviews heb ik gemerkt dat zelfs ervaren programmeurs moeite hebben met het onderscheiden van Hooks, om nog maar te zwijgen over hun meer geavanceerde mogelijkheden. Dus ik zal proberen...

The Codest
Pawel Rybczynski Software Engineer

Abonneer je op onze kennisbank en blijf op de hoogte van de expertise uit de IT-sector.

    Over ons

    The Codest - Internationaal softwareontwikkelingsbedrijf met technische hubs in Polen.

    Verenigd Koninkrijk - Hoofdkantoor

    • Kantoor 303B, 182-184 High Street North E6 2JA
      Londen, Engeland

    Polen - Lokale technologieknooppunten

    • Fabryczna kantorenpark, Aleja
      Pokoju 18, 31-564 Krakau
    • Hersenambassade, Konstruktorska
      11, 02-673 Warschau, Polen

      The Codest

    • Home
    • Over ons
    • Diensten
    • Case Studies
    • Weten hoe
    • Carrière
    • Woordenboek

      Diensten

    • Het advies
    • Software Ontwikkeling
    • Backend ontwikkeling
    • Frontend ontwikkeling
    • Staff Augmentation
    • Backend ontwikkelaars
    • Cloud Ingenieurs
    • Gegevensingenieurs
    • Andere
    • QA ingenieurs

      Bronnen

    • Feiten en fabels over samenwerken met een externe partner voor softwareontwikkeling
    • Van de VS naar Europa: Waarom Amerikaanse startups besluiten naar Europa te verhuizen
    • Tech Offshore Ontwikkelingshubs Vergelijking: Tech Offshore Europa (Polen), ASEAN (Filippijnen), Eurazië (Turkije)
    • Wat zijn de grootste uitdagingen voor CTO's en CIO's?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Gebruiksvoorwaarden website

    Copyright © 2025 door The Codest. Alle rechten voorbehouden.

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