Ruby Language
Monkey Patching in Ruby
Zoeken…
Opmerkingen
Monkey patching, hoewel handig, heeft een aantal valkuilen die niet meteen duidelijk zijn. Het meest opvallend is dat een patch zoals die in het voorbeeld het wereldwijde bereik vervuilt. Als twee modules beide Hash#symbolize
, past alleen de laatst vereiste module de wijziging daadwerkelijk toe; de rest wordt gewist.
Bovendien, als er een fout is in een gepatchte methode, verwijst de stacktrace gewoon naar de gepatchte klasse. Dit houdt in dat er een bug is in de Hash
klasse zelf (die er nu is).
Ten slotte, omdat Ruby zeer flexibel is met wat containers moet bevatten, heeft een methode die heel eenvoudig lijkt wanneer je het schrijft veel ongedefinieerde functionaliteit. Het maken van Array#sum
is bijvoorbeeld goed voor een reeks getallen, maar breekt wanneer een reeks van een aangepaste klasse wordt gegeven.
Een veiliger alternatief zijn verfijningen, beschikbaar in Ruby> = 2.0.
Functionaliteit toevoegen
U kunt een methode toevoegen aan elke klasse in Ruby, of deze nu ingebouwd is of niet. Het aanroepende object wordt verwezen met behulp van self
.
class Fixnum
def plus_one
self + 1
end
def plus(num)
self + num
end
def concat_one
self.to_s + '1'
end
end
1.plus_one # => 2
3.plus(5) # => 8
6.concat_one # => '61'