Oriented Object Programming (OOP) is a programming paradigm based on the concept of objects.
As my main programming language is #Ruby, it's obviously the paradigm I'm the most familiar with : one of the biggest principle in Ruby is that "Everything is object".
I like to see objects as abstraction of real world things, with their attributes and methods.
```ruby
class Dog < Animals
attr_accessor :race, :color
def bark
"Wouaf"
end
end
dog = Dog.new
puts dog.bark
# => Wouaf
dog.race = "Rotweiller"
puts dog.race
# => Rotweiller
```
Here's a basic Dog object with two attributes, that represent what a dog can be, and a method that represent what a dog can do.
This dog extend from the Animal object, which have his own set of attributes that represent what an animal can be, and a set of methods that represent what it can do.
```ruby
class Animals
attr_accessor :size
def eat
"Eating..."
end
def reproduce
"Reproducing..."
end
end
animal = Animal.new
puts animal.eat
# => Eating...
```
By extending objects, the childs can use the methods of parents. This keep a clean code and satisfy the first principle of [SOLID](SOLID.md) which is the [Single responsability principle](Single%20responsability%20principle.md)
```Ruby
dog = Dog.new # From the class Dog
puts dog.eat # Using the method from Animal class on Dog
# => "Eating..."
```