Princípios básicos da Programação Orientação a Objetos (POO)
Published: 2021-10-25 12:16:11

Fala pessoal! Quem nunca se deparou com um código Orientado a Cebola (É só abrir o código que dá vontade de chorar)? 

Hoje em dia, muitas pessoas dizem que programam orientado a objetos, mas na verdade estão somente trabalhando com o conceito de Classes, criando diversos objetos cheios de parâmetros e acabam esquecendo alguns dos conceitos básicos da POO. 


Conceitos Básicos

A Orientação a Objetos é um paradigma de computação que nos auxilia a efetuar abstrações de objetos e outras coisas imateriais do mundo real. Essas abstrações serão escritas em forma de estruturas de fácil compreensão, estruturas essas que servirão de modelo para criação de nossos dados dentro dos sistemas.

A Programação orientada a Objetos baseia-se nos seguintes pilares:
- Encapsulamento
- Herança
- Polimorfismo

Vamos detalhar um pouco mais sobre cada uma das partes principais da POO abaixo:

1) Classes
São abstrações de objetos do mundo real, essas abstrações funcionam como um modelo para criação de instâncias de objetos que serão manipuladas pelo nosso programa.
As classes são especificadas através de métodos e propriedades, que permitirão que interações sejam feitas com objetos que sejam desse tipo.

2) Herança
A herança funciona para que possamos efetuar uma especialização de nossas classes, permitindo que tenhamos códigos limpos e mais reutilizáveis. Por exemplo, ao abstrairmos um classe “Humano”, podemos ter duas classes especializadas “Homem” e “Mulher”. Essas duas classes filhas herdarão todas as propriedades e métodos que a classe Humano possuir, como braços, pernas, métodos para Andar(), Respirar(), dentre outros.
Nossa classe Mulher poderia ter propriedades adicionais como “ovários”, “útero”, além de métodos como Gestação (), Amamentar (), etc.

3) Objetos
Pensando no exemplo anterior, Eu (Yan) sou um objeto da classe “Homem”, que herda todas as propriedades e métodos específicos dessa classe, além de tudo que estiver especificado na classe “Humano”. Esse objeto será identificado por valores específicos que estarão atribuídos aos atributos desse objeto, na hora da criação do mesmo, e durante todo ciclo de vida do mesmo.

4) Encapsulamento
É uma propriedade da Orientação a Objetos que descreve a ação de efetuar um fluxo de informação dentro da classe. Como exemplo podemos usar o método Andar() da nossa classe Humano. Esse método chama internamente outros métodos como MoverPernaDireta() e MoverPernaEsquerda(), além de trocar propriedades como Peso, etc.

5) Polimorfismo
É uma ferramenta da Orientação a Objetos que permite termos mais de um método, em uma mesma classe, com o mesmo nome, contanto que ele possua uma passagem de parâmetros diferente, ou que sobrescreva o Método de uma classe pai.
Por exemplo, nossa classe Humano possui um método PerderPeso(). Este método pode ser implementado na nossa classe Humano recebendo um valor para que seja descontado da propriedade Peso. Em nossas classes Homem e Mulher, podemos especializar este método colocando fórmulas e recebendo mais parâmetros, pois a perda de peso ocorre de maneiras diferentes em cada gênero.

6) Classes Abstratas
São classes que não podem ser diretamente instanciadas. Elas servem como modelo para que outras classes conheçam a classe, sem depender dela.

7) Interfaces
Interfaces funcionam como contratos, onde a estrutura de uma classe é exposta. Com interfaces, podemos utilizar outro recurso da orientação a objetos como a IoC (Inversion of Control).

8) Inversão de Controle e Injeção de dependência
A inversão de controle é uma padrão de desenvolvimento, onde a responsabilidade de chamada de métodos é delegada a uma infraestrutura de software, não diretamente pelo programador. Para isso, podemos citar a Injeção de Dependência como ferramenta para tal. Com ela, podemos referenciar contratos e efetuar chamadas a métodos especificados nessas interfaces, a injeção de dependência (que conhece o link entre os contratos e as classes) fará o link, desacoplando e reduzindo a complexidade do nosso código.

9) S.O.L.I.D.
O SOLID refere-se aos cinco pilares que nos auxiliam a criar códigos mais flexíveis, de fácil manutenção e entendimento.
Esses pilares nos guiam a utilizar todos os itens anteriores de maneira acertiva. O SOLID por si só, merece um dia de aula para exemplos e conceitos. Ele continua tão atual que diversos Padrões de Desenvolvimento novos representam por si só uma única letra, como o “S” que diz que classes devem ter uma única responsabilidade (como o Serverless, FaaS — Function as a Service).

10) DDD — Domain Driven Design
Uma das abordagens mais utilizada para modelagem de nossas classes, no desenvolvimento do core de nossas aplicação, é o DDD. Esse modelo de desenvolvimento foca no domínio de nosso problema, fazendo com que sigamos os principios do SOLID, evitando dar responsabilidade de mais a nossas estruturas, modelando nosso Software focando em linguagem oblíqua, que é nada mais nada menos que uma linguagem falada pelo usuário do nosso sistema como “EfetuarTransferencia()”, “DepositarCheque()”, etc.

Nos próximos posts abordarei mais a fundo conceitos que precisam estar entranhados em nossos subconscientes como SOLID (Muita atenção nesse cara), YAGNI, KISS, DRY, DDD, Design Patterns, dentre outros.

Até a próxima!