Slide 1

Slide 1 text

Advanced OOP in Elixir Wojtek Mach @wojtekmach @wojtekmach

Slide 2

Slide 2 text

import OOP

Slide 3

Slide 3 text

import OOP class Person do var :name end

Slide 4

Slide 4 text

import OOP class Person do var :name end joe = Person.new(name: "Joe") robert = Person.new(name: "Robert")

Slide 5

Slide 5 text

import OOP class Person do var :name end joe = Person.new(name: "Joe") robert = Person.new(name: "Robert") joe.name() # => "Joe" robert.name # => "Robert"

Slide 6

Slide 6 text

import OOP class Person do var :name def say_hello_to(who) do IO.puts("#{this.name}: Hello, #{who.name}") end end joe = Person.new(name: "Joe") robert = Person.new(name: "Robert") joe.name() # => "Joe" robert.name # => "Robert" joe.say_hello_to(robert) # => Joe: Hello, Robert

Slide 7

Slide 7 text

import OOP class Person do var :name def say_hello_to(who) do IO.puts("#{this.name}: Hello, #{who.name}") end end joe = Person.new(name: "Joe") robert = Person.new(name: "Robert") joe.name() # => "Joe" robert.name # => "Robert" joe.say_hello_to(robert) # => Joe: Hello, Robert this.name

Slide 8

Slide 8 text

joe = Person.new(name: "Joe") joe.set_name("Hipster Joe") # => :ok joe.name # => "Hipster Joe"

Slide 9

Slide 9 text

Q: How does it work?


Slide 10

Slide 10 text

Q: How does it work?
 A: You don’t want to know.

Slide 11

Slide 11 text

Q: How does it work?
 A: Macros.

Slide 12

Slide 12 text

some FP programmer: „this is bad code”


Slide 13

Slide 13 text

Perhaps it’s not that bad…


Slide 14

Slide 14 text

Q: What’s worse than OOP?


Slide 15

Slide 15 text

Q: What’s worse than OOP?
 A: OOP with inheritance.

Slide 16

Slide 16 text

class Shape do var :x var :y end

Slide 17

Slide 17 text

class Shape do var :x var :y end class Rectangle < Shape do var :width var :height def area do this.width * this.height end end

Slide 18

Slide 18 text

class Shape do var :x var :y end class Rectangle < Shape do var :width var :height def area do this.width * this.height end end class Square < Rectangle do def area do :math.pow(this.width, 2) end end

Slide 19

Slide 19 text

Perhaps it’s not that bad…


Slide 20

Slide 20 text

Q: What’s worse than OOP with inheritance?


Slide 21

Slide 21 text

Q: What’s worse than OOP with inheritance?
 A: OOP with multiple inheritance.

Slide 22

Slide 22 text

class Human do end

Slide 23

Slide 23 text

class Human do end class Spider do end

Slide 24

Slide 24 text

class Human do end class Spider do end class Spiderman < [Human, Spider] do end

Slide 25

Slide 25 text

Advanced OOP

Slide 26

Slide 26 text

class Post do end Post.new

Slide 27

Slide 27 text

class Post do end class Comment do end Post.new Comment.new

Slide 28

Slide 28 text

abstract class ActiveRecord.Base do end class Post < ActiveRecord.Base do end class Comment < ActiveRecord.Base do end Post.new Comment.new

Slide 29

Slide 29 text

abstract class ActiveRecord.Base do end class Post < ActiveRecord.Base do end class Comment < ActiveRecord.Base do end Post.new Comment.new ActiveRecord.Base.new ** (RuntimeError) cannot instantiate abstract class ActiveRecord.Base

Slide 30

Slide 30 text

abstract class ActiveRecord.Base do end abstract class ApplicationRecord < ActiveRecord.Base do end class Post < ApplicationRecord do end class Comment < ApplicationRecord do end

Slide 31

Slide 31 text

class HalfLife do end

Slide 32

Slide 32 text

class HalfLife do end class HalfLife2 < HalfLife do end

Slide 33

Slide 33 text

class HalfLife do end final class HalfLife2 < HalfLife do end

Slide 34

Slide 34 text

class HalfLife do end final class HalfLife2 < HalfLife do end class HalfLife3 < HalfLife2 do end ** (RuntimeError) cannot subclass final class HalfLife2

Slide 35

Slide 35 text

class AppleInc do end

Slide 36

Slide 36 text

class AppleInc do var :devices end apple = Apple.new(devices: ["Alice's iPhone", "Bob's iPad"]) apple.devices # => ["Alice's iPhone", "Bob's iPad"]

Slide 37

Slide 37 text

class AppleInc do private_var :devices end apple = Apple.new(devices: ["Alice's iPhone", "Bob's iPad"]) apple.devices ** (RuntimeError) Cannot access private var devices

Slide 38

Slide 38 text

class NSA do def get_data(company, _fisa_court_order \\ nil) do company.devices end end class AppleInc do private_var :devices end apple = Apple.new(devices: ["Alice's iPhone", "Bob's iPad”]) NSA.new.get_data(apple) ** (RuntimeError) Cannot access private var devices

Slide 39

Slide 39 text

class NSA do def get_data(company, _fisa_court_order \\ nil) do company.devices end end class AppleInc do friend NSA private_var :devices end apple = Apple.new(devices: ["Alice's iPhone", "Bob's iPad”])

Slide 40

Slide 40 text

class NSA do def get_data(company, _fisa_court_order \\ nil) do company.devices end end class AppleInc do friend NSA private_var :devices end apple = Apple.new(devices: ["Alice's iPhone", "Bob's iPad”]) NSA.new.get_data(apple) # => ["Alice's iPhone", "Bob's iPad"]

Slide 41

Slide 41 text

Disclaimer: Don’t run it in production. Ever.

Slide 42

Slide 42 text

Disclaimer: Don’t run it in production. Ever.

Slide 43

Slide 43 text

Thank you! @wojtekmach wojtekmach/oop