Ruby Monstas · Classes / Objects and OOP Exercises. Recap. Questions Blocks Symbols Ranges....

Post on 21-Aug-2020

13 views 0 download

Transcript of Ruby Monstas · Classes / Objects and OOP Exercises. Recap. Questions Blocks Symbols Ranges....

Ruby Monstas

Session 11

Agenda

● Recap / Questions● Classes / Objects and OOP● Exercises

Recap

QuestionsBlocksSymbolsRanges

Object-oriented programming

Classes & Objects

Cookie cutter analogy

Cookie cutter analogy

Cookie cutterCookies

Cookie cutter analogy

Cookie cutter→ Class

Cookies→ Objects

Cookie cutter analogy

The cookie cutter (class) is used to make the dough (memory) into cookies (objects).

Cat exampleThe domain of our application: cats!Therefore it makes sense to have a “Cat” class (cookie cutter).We can later use our “Cat” class to produce concrete (actual) cats.

Cat example: Class diagram

Cat

name: Stringcoat: Stringweight: Float

+move_to+location+speak+eat+information

Cat example: Class diagram

data

behaviour

class nameCat

name: Stringcoat: Stringweight: Float

+move_to+location+speak+eat+information

Cat example: InstantiationCat

name: “Sgt. Fuzzyboots”coat: “tabby”weight: 3.1

...

Cat

name: Stringcoat: Stringweight: Float

+move_to+location+speak+eat+information

Cat example: InstantiationCat

name: “Sgt. Fuzzyboots”coat: “tabby”weight: 3.1

...

Cat

name: “Gorbypuff Thunderhorse II”coat: “cream”weight: 4.7

...

Cat

name: Stringcoat: Stringweight: Float

+move_to+location+speak+eat+information

Cat example: InstantiationCat

name: “Sgt. Fuzzyboots”coat: “tabby”weight: 3.1

...

Cat

name: “Gorbypuff Thunderhorse II”coat: “cream”weight: 4.7

...

Cat

name: Stringcoat: Stringweight: Float

+move_to+location+speak+eat+information

Cat example: InstantiationCat

name: “Sgt. Fuzzyboots”coat: “tabby”weight: 3.1

...

Cat

name: “Gorbypuff Thunderhorse II”coat: “cream”weight: 4.7

...

Cat

name: Stringcoat: Stringweight: Float

+move_to+location+speak+eat+information

Classes in Ruby

Cat

name: Stringcoat: Stringweight: Float

+move_to+location+speak+eat+information

Classes in Ruby: initialize method

class Cat def initialize(name, coat, weight) @name = name @coat = coat @weight = weight endend

Cat

name: Stringcoat: Stringweight: Float

+move_to+location+speak+eat+information

Classes in Ruby: initialize method

class Cat def initialize(name, coat, weight) @name = name @coat = coat @weight = weight endend

Cat

name: Stringcoat: Stringweight: Float

+move_to+location+speak+eat+information

Classes in Ruby: initialize method

initialize is a special method, that allows us to initialize the object we’re creating with some data.The same concept is called “constructor” in other programming languages.

class Cat def initialize(name, coat, weight) @name = name @coat = coat @weight = weight endend

Cat

name: Stringcoat: Stringweight: Float

+move_to+location+speak+eat+information

Classes in Ruby: Using initializeCat

name: “Sgt. Fuzzyboots”coat: “tabby”weight: 3.1

...

Cat

name: “Gorbypuff Thunderhorse II”coat: “cream”weight: 4.7

...

class Cat def initialize(name, coat, weight) @name = name @coat = coat @weight = weight endend

sgt_fuzzyboots = Cat.new( 'Sgt. Fuzzyboots', 'tabby', 3.1)

gorbypuff = Cat.new(

'Gorbypuff Thunderhorse II',

'cream',

4.7

)

Classes in Ruby: Using initialize

class Cat def initialize(name, coat, weight) @name = name @coat = coat @weight = weight endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)

1. Cat.new is called, that means initialize gets called in the Cat class.

Classes in Ruby: Using initialize

class Cat def initialize(name, coat, weight) @name = name @coat = coat @weight = weight endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)

2. Local variables name, coat and weight get assigned to the values passed.

Classes in Ruby: Using initialize

class Cat def initialize(name, coat, weight) @name = name @coat = coat @weight = weight endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)

3. Instance variables @name, @coat and @weight get assigned to the values of the local variables name, coat and weight.

Classes in Ruby: Using initialize

class Cat def initialize(name, coat, weight) @name = name @coat = coat @weight = weight endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)

4. initialize method is over. Ruby builds an instance (object) of type Cat that contains the data and returns it from the new method call.

Classes in Ruby: Using initialize

class Cat def initialize(name, coat, weight) @name = name @coat = coat @weight = weight endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)

5. The returned object of type Cat gets assigned to a local variable called sgt_fuzzyboots outside the class.

Local vs. instance variablesLocal variables are useable from when they’re first defined until the end of the scope they’re defined in.a = 12

puts a

Local vs. instance variablesLocal variables are useable from when they’re first defined until the end of the scope they’re defined in.a = 12

puts a

12

Local vs. instance variablesLocal variables are useable from when they’re first defined until the end of the scope they’re defined in.a = 12

puts a

12

def my_method a = 12 puts aend

my_method

Local vs. instance variablesLocal variables are useable from when they’re first defined until the end of the scope they’re defined in.a = 12

puts a

12

def my_method a = 12 puts aend

my_method

12

Local vs. instance variablesLocal variables are useable from when they’re first defined until the end of the scope they’re defined in.a = 12

puts a

12

def my_method a = 12end

my_methodputs a

def my_method a = 12 puts aend

my_method

12

Local vs. instance variablesLocal variables are useable from when they’re first defined until the end of the scope they’re defined in.a = 12

puts a

12

def my_method a = 12end

my_methodputs a

NameError (undefined local variable or method `a' for main:Object)

def my_method a = 12 puts aend

my_method

12

Local vs. instance variablesLocal variables are useable from when they’re first defined until the end of the scope they’re defined in.a = 12

puts a

12

def my_method a = 12end

my_methodputs a

NameError (undefined local variable or method `a' for main:Object)

def my_method a = 12 puts aend

my_method

12

def my_method a = 12end

a = 23my_methodputs a

Local vs. instance variablesLocal variables are useable from when they’re first defined until the end of the scope they’re defined in.a = 12

puts a

12

def my_method a = 12end

my_methodputs a

NameError (undefined local variable or method `a' for main:Object)

def my_method a = 12 puts aend

my_method

12 23

def my_method a = 12end

a = 23my_methodputs a

Local vs. instance variablesLocal variables are useable from when they’re first defined until the end of the scope they’re defined in.a = 12

puts a

12

def my_method a = 12end

my_methodputs a

NameError (undefined local variable or method `a' for main:Object)

def my_method a = 12 puts aend

my_method

12 23

def my_method a = 12end

a = 23my_methodputs a

def my_method a = 12 puts aend

a = 23my_method

Local vs. instance variablesLocal variables are useable from when they’re first defined until the end of the scope they’re defined in.a = 12

puts a

12

def my_method a = 12end

my_methodputs a

NameError (undefined local variable or method `a' for main:Object)

def my_method a = 12 puts aend

my_method

12 23

def my_method a = 12end

a = 23my_methodputs a

12

def my_method a = 12 puts aend

a = 23my_method

class Cat def initialize(name, coat, weight) @name = name @coat = coat @weight = weight endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)

# do something else

Local vs. instance variables

class Cat def initialize(name, coat, weight) @name = name @coat = coat @weight = weight endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)

# do something else

Local vs. instance variables

name, coat, weight are in scope here, but not outside initialize!

name, coat, weight are gone here!

Local vs. instance variablesInstance variables are useable without definition (default value: nil). They are in scope inside an object. Each object has its own instance variables.class MyClass def my_method @my_variable endend

my_object = MyClass.newputs my_object.my_method

Local vs. instance variablesInstance variables are useable without definition (default value: nil). They are in scope inside an object. Each object has its own instance variables.class MyClass def my_method @my_variable endend

my_object = MyClass.newputs my_object.my_method

(nothing (nil))

Local vs. instance variablesInstance variables are useable without definition (default value: nil). They are in scope inside an object. Each object has its own instance variables.class MyClass def my_method @my_variable endend

my_object = MyClass.newputs my_object.my_method

class MyClass def initialize @my_variable = 12 end

def my_method @my_variable endend

my_object = MyClass.newputs my_object.my_method

(nothing (nil))

Local vs. instance variablesInstance variables are useable without definition (default value: nil). They are in scope inside an object. Each object has its own instance variables.class MyClass def my_method @my_variable endend

my_object = MyClass.newputs my_object.my_method

class MyClass def initialize @my_variable = 12 end

def my_method @my_variable endend

my_object = MyClass.newputs my_object.my_method

(nothing (nil)) 12

Local vs. instance variablesInstance variables are useable without definition (default value: nil). They are in scope inside an object. Each object has its own instance variables.class MyClass def my_method @my_variable endend

my_object = MyClass.newputs my_object.my_method

class MyClass def initialize @my_variable = 12 end

def my_method @my_variable endend

my_object = MyClass.newputs my_object.my_method

(nothing (nil)) 12

class MyClass def initialize(my_number) @my_variable = my_number end

def my_method @my_variable endend

a = MyClass.new(12)b = MyClass.new(23)

puts b.my_methodputs a.my_method

Local vs. instance variablesInstance variables are useable without definition (default value: nil). They are in scope inside an object. Each object has its own instance variables.class MyClass def my_method @my_variable endend

my_object = MyClass.newputs my_object.my_method

class MyClass def initialize @my_variable = 12 end

def my_method @my_variable endend

my_object = MyClass.newputs my_object.my_method

(nothing (nil)) 12

class MyClass def initialize(my_number) @my_variable = my_number end

def my_method @my_variable endend

a = MyClass.new(12)b = MyClass.new(23)

puts b.my_methodputs a.my_method

2312

Classes in Ruby: Behaviour

data

behaviour

class nameCat

name: Stringcoat: Stringweight: Float

+move_to+location+speak+eat+information

Class diagram Ruby

?

?

Classes in Ruby: Behaviour

data

behaviour

class nameCat

name: Stringcoat: Stringweight: Float

+move_to+location+speak+eat+information

Class diagram Ruby

Instance variables

?

Classes in Ruby: Behaviour

data

behaviour

class nameCat

name: Stringcoat: Stringweight: Float

+move_to+location+speak+eat+information

Class diagram Ruby

Instance variables

Methods

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: BehaviourWhat we want (our “contract” for the Cat class):

Meow!the bedSgt. Fuzzyboots has eaten cat food, a treat and is currently here: the bed

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: BehaviourWhat we want (our “contract” for the Cat class):

Meow!the bedSgt. Fuzzyboots has eaten cat food, a treat and is currently here: the bed

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: BehaviourWhat we want (our “contract” for the Cat class):

Meow!the bedSgt. Fuzzyboots has eaten cat food, a treat and is currently here: the bed

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: BehaviourWhat we want (our “contract” for the Cat class):

Meow!the bedSgt. Fuzzyboots has eaten cat food, a treat and is currently here: the bed

class Cat # ...end

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

class Cat # ...

def speak endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

class Cat # ...

def speak puts 'Meow!' endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

class Cat # ...end

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

class Cat # ...

def move_to(location) # ... endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

class Cat # ...

def move_to(location) @location = location endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

class Cat # ...

def move_to(location) @location = location end

def location # ... endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

class Cat # ...

def move_to(location) @location = location end

def location @location endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

class Cat # ...end

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

class Cat # ...

def eat(food) # ... endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

class Cat # ...

def eat(food) @foods << food endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

class Cat # ... def initialize(name, coat, weight) # ... end

def eat(food) @foods << food endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

class Cat # ... def initialize(name, coat, weight) # ... @foods = [] end

def eat(food) @foods << food endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

Sgt. Fuzzyboots has eaten cat food, a treat and is currently here: the bed

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

Sgt. Fuzzyboots has eaten cat food, a treat and is currently here: the bedclass Cat

# ...end

class Cat # ...end

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

Sgt. Fuzzyboots has eaten cat food, a treat and is currently here: the bed

class Cat # ... def information # ... endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

Sgt. Fuzzyboots has eaten cat food, a treat and is currently here: the bed

class Cat # ... def information "#{@name} has eaten" endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

Sgt. Fuzzyboots has eaten cat food, a treat and is currently here: the bed

class Cat # ... def information "#{@name} has eaten" endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

Sgt. Fuzzyboots has eaten cat food, a treat and is currently here: the bed

class Cat # ... def information "#{@name} has eaten #{@foods.join(', ')}" endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

Sgt. Fuzzyboots has eaten cat food, a treat and is currently here: the bed

class Cat # ... def information "#{@name} has eaten #{@foods.join(', ')}" endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

Sgt. Fuzzyboots has eaten cat food, a treat and is currently here: the bed

class Cat # ... def information "#{@name} has eaten #{@foods.join(', ')} and is currently here: #{location}" endend

sgt_fuzzyboots = Cat.new('Sgt. Fuzzyboots', 'tabby', 3.1)sgt_fuzzyboots.speaksgt_fuzzyboots.move_to('the bed')puts sgt_fuzzyboots.locationsgt_fuzzyboots.eat('cat food')sgt_fuzzyboots.eat('a treat')puts sgt_fuzzyboots.information

Classes in Ruby: Behaviour

Sgt. Fuzzyboots has eaten cat food, a treat and is currently here: the bed

Time to practice

Let’s get to it!