OBJECT-ORIENTED PROGRAMMING (OOP)

 Object-oriented programming (OOP) is a programming paradigm that revolves around the concept of objects. In OOP, objects are instances of classes, which serve as blueprints for creating objects. Each object has properties (attributes or data fields) and behaviors (methods or functions). 

In Ruby, OOP is deeply ingrained into the language's design. Here's a brief overview of how OOP works in Ruby: 

  1. 1. CLASSESS
  2. Classes are the building blocks of Ruby's OOP paradigm. You define a class using the class keyword followed by the class name. 

For example: 
class Person
  # Class definition
end


2. OBJECTS
Objects are instances of classes. You create objects using the new method of a class. 

For example:
person1 = Person.new 


3. ATTRIBUTES
Attributes are characteristics of an object. In Ruby, you can define attributes using instance variables (@variable_name). You typically define attribute accessors using attr_reader, attr_writer, or attr_accessor

For example:
class Person 
  attr_accessor :name, :age 
end 


4. METHODS
Methods are behaviors associated with objects. You define methods inside class definitions. 

For example:
class Person
  def greet
    puts "Hello, I'm #{@name} and I'm #{@age} years old."
  end
end


5. POLYMORPHISM
Ruby supports polymorphism, allowing objects of different classes to respond to the same method in different ways. This is achieved through method overriding.

For example:
class Animal
  def make_sound
    puts "Some generic sound"
  end
end

class Dog < Animal
  def make_sound
    puts "Woof!"
  end
end

class Cat < Animal
  def make_sound
    puts "Meow!"
  end
end

class Cow < Animal
  def make_sound
    puts "Moo!"
  end
end

# Polymorphism in action
animals = [Dog.new, Cat.new, Cow.new]

animals.each do |animal|
  animal.make_sound
end

Output:
Woof!
Meow!
Moo!


6. ENCAPSULATION
Ruby supports encapsulation by controlling access to attributes and methods using access modifiers (public, protected, private). 

For example:
class Person
  def initialize(name, age)
    @name = name
    self.age = age  # Using the setter method for encapsulation
  end

  def age
    @age
  end

  def age=(new_age)
    if new_age >= 0
      @age = new_age
    else
      puts "Age cannot be negative!"
    end
  end
end

person = Person.new("Alice", 30)
puts person.age  # Output: 30

person.age = -5  # Trying to set negative age

Output:
30
Age cannot be negative!


7. MODULES and MIXINS
Ruby allows you to define reusable code in modules, which can then be included in classes using the include keyword. This is a form of multiple inheritance called mixins. 

For example:
module Swimmable
  def swim
    puts "#{self.class} is swimming"
  end
end

class Fish
  include Swimmable
end

class Duck
  include Swimmable
end

fish = Fish.new
duck = Duck.new

fish.swim  # Output: Fish is swimming
duck.swim  # Output: Duck is swimming
Note: In this example, both Fish and Duck classes can now use the swim method defined in the Swimmable module, thanks to mixins.

Overall, OOP in Ruby provides a flexible and intuitive way to structure and organize code, making it particularly suitable for building complex applications. 

Back to blogs