As descobertas que faço e coisas que aprendo

Um dos paradigmas que podem ser seguidos na programação é a orientação por objetos, que consiste basicamente em ter um sistema não linear com objetos que podem interagir entre si, uma abordagem diferente da Programação Estruturada.

Na programação orientada a objetos o sistema é muito mais flexível, escalonável e de rápido desenvolvimento, porém perde muito em performance caso fossemos comparar diretamente com programação estruturada.

Os conceitos básicos de POO (Programação Orientada a Objetos) são:

  1. Abstração
  2. Encapsulamento
  3. Herança
  4. Polimorfismo

Abstração

O conceito de trazer uma ideia do "mundo real" para o código. É na abstração que você descreve seu objeto para o computador definindo sua identidade, propriedades e métodos. Digamos que precisamos abstrair uma televisão:

// Abstração

// Identidade, nome do objeto, identificador unico.
objeto Televisao = {
    // Propriedades do objeto
    cor: "Preta",
    marca: "Tvision",
    material: "plastico"
}

// Métodos, ações (funções) que seu objeto executa

Televisao.ligar()
Televisao.mudarCanal()
Televisao.aumentaVolume()

Este é um exemplo genérico de abstração, o código e forma de dispor os elementos e funções pode variar de acordo com a linguagem de programação que estiver utilizando.

Encapsulamento

O conceito de encapsulamento é utilizado para manter a segurança dos valores que são utilizados dentro do objeto, as ações e métodos que são executados dentro do objeto não são expostos ao usuário. Seguindo o exemplo da televisão, quando o usuário aumenta o volume de uma TV ele não sabe e nem tem acesso aos valores e comandos que são transmitidos para a TV, esse seria um encapsulamento, as ações são restritas apenas ao sistema. Ou caso fosse necessário trocar o controle da TV, poderia ser modificada apenas uma parte do sistema sem problemas, pois no final o funcionamento continuaria o mesmo.

O encapsulamento na programação orientada a objetos trabalha com o conceito de isolar ao máximo cada objeto e função para que o sistema funcione de forma flexível, seja fácil de modificar e as alterações não afetem o usuário final.

Para trabalhar com valores das propriedades no encapsulamento são utilizados getters (métodos que requisitam valores do sistema) e setters (métodos que modificam valores no sistema).

Herança

É  a possibilidade de transferirmos propriedades e métodos entre objetos. Um objeto filho possui a capacidade de herdar métodos e valores de um objeto pai.

A herança possibilita que façamos a criação de objetos específicos através de objetos mais generalistas.

Existe a herança direta onde o objeto herda de um objeto logo acima dele e a herança indireta que o objeto herda valores de várias camadas acima.

// Herança
objeto Animal = {
    tipo: "ser vivo",
}

objeto Cachorro extende Animal

Cachorro.tipo = "ser vivo"

Utilizando da herança podemos trabalhar com objetos construtores que possuem um padrão geral de métodos e valores, onde seus filhos possuem alterações ou métodos mais especificos para cada caso.

Polimorfismo

É o conceito de utilizar um mesmo método para vários objetos alterando os valores de retorno. Um mesmo método com comportamentos diferentes.

Durante a execução desse método ele terá um valor de acordo com cada chamada.

// Polimorfismo

objeto Eletrodomestico = {
    função Ligar(){
        return "Está ligado!"
    }
}

objeto Radio extende Eletrodomestico

objeto Radio = {
    função Ligar(){
        return "O radio está ligado"
    }
}

Conclusão

Esses são os conceitos básicos para a iniciação á programação orientada a objetos, eles podem ser utilizados em conjunto e combinados com diversos outros conceitos e padrões para que você tenha um código eficiente.