be aware of side effects
DESCRIPTION
RubyFuza 2013 talk slidesTRANSCRIPT
![Page 1: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/1.jpg)
be aware ofside-effects
@ryanlemmer / gmt+2
(thinking even more functionally in Ruby)
![Page 2: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/2.jpg)
you can do this in Haskell
a = "greetings!"
![Page 3: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/3.jpg)
and this
a = "greetings!"b = a + " rubyfuza"
![Page 4: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/4.jpg)
and this
a = "greetings!"b = +("greetings!"," rubyfuza")
![Page 5: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/5.jpg)
but you can’t do this in Haskell
a = "greetings!"a = a + " rubyfuza"
![Page 6: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/6.jpg)
but you can’t do this in Haskell
a = "greetings!"a = +("greetings!"," rubyfuza")
![Page 7: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/7.jpg)
value
a = "greetings!"a = a + " rubyfuza"
a = "greetings!"b = a + " rubyfuza"
variable
(immutable) (mutable)
![Page 8: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/8.jpg)
value
a = "greetings!"a = "greetings!"
variable
(immutable) (mutable)
b = a + " rubyfuza" a = a + " rubyfuza"
... other stuff ... other stuff
![Page 9: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/9.jpg)
value
a = "greetings!"a = a + " rubyfuza"
a = "greetings!"b = a + " rubyfuza"
variable=
![Page 10: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/10.jpg)
value
a = "greetings!"a = a + " rubyfuza"
a = "greetings!"b = a + " rubyfuza"
there is no variable
![Page 11: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/11.jpg)
value variable
val a = "greetings!";val b = a + " rubyfuza";
var a = "greetings!";a = a + " rubyfuza";
!=
![Page 12: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/12.jpg)
def add(a, b) a + bend
![Page 13: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/13.jpg)
def add_freaky(a, b) z = a*b a + b * zend
![Page 14: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/14.jpg)
@a = 11
def incr_by(n) @a += nend
![Page 15: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/15.jpg)
@a = 11EXTRA = 10
def incr_by(n) @a += n + EXTRAend
![Page 16: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/16.jpg)
class Calculator attr_reader :balance
def initialize(balance) @balance = balance || 0 end
def incr_by(n) @balance += n end ...end
![Page 17: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/17.jpg)
def test num = Calculator.new(0).incr_by(10) assert_equal 10, numend
![Page 18: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/18.jpg)
class Calculator attr_reader :x, :y, :z, :w, ... attr_accessor :v1, :v2, :v3, ...
def initialize(obj, b, c, ...) obj.set_something(w,y,z, ...) end
def wicked_calc(p1, p2, ...) x/y/z/w/v1/v2/v3 end ...end
![Page 19: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/19.jpg)
class MoreFunctionalCalculator attr_reader :balance
def initialize(balance) @balance = balance || 0 end
def incr_by(n) @balance = self.add(@balance, n) end
private def add(a, b); a+b endend
![Page 20: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/20.jpg)
upcased = [] arr.each do |s| upcased.push(s.upcase) end # use upcased
arr.map do |s| s.upcase end
![Page 21: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/21.jpg)
u = arr.map do |s| s.upcase end u.collect do |s| s ++ “zzzz” end
upcased = [] arr.each do |s| upcased.push(s.upcase ++ “zzzz”) end
![Page 22: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/22.jpg)
taming side-effectsLIMIT them
extract maximum purity (through composition)use functional forms
CONSTRAIN them, make them EXPLICIT, use CONVENTIONS
Haskell => Monads/STM
Erlang => Messages
Active Record
![Page 23: Be aware of side effects](https://reader033.vdocuments.site/reader033/viewer/2022052910/559bb4e71a28ab80538b45bc/html5/thumbnails/23.jpg)
why bother?
cost TIME => $$$cost ENERGY
cause ULCERS
because side effects...