Uma prosa sobre Orientação a Objetos!
Tags: beginners, programming, typescript, architecture
Published: 2022-06-19 14:11:23

Orientação a Objetos é um tópico básico sobre programação, utilizado pela maioria das empresas e projetos (e que ironicamente continua sendo debatido).

Apesar da fama, ela não é nenhuma rocket (ou enterprise) science.

![Painel de controle Star Trek enterprise](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1vbjk7fmbizi5tkej1i1.png)

**Meu começo com a Orientação a Objetos** foi muito tranquilo, já que tive uma introdução em sala de aula no ensino médio. A didática era diferente da que era usada na faculdade, e a linguagem era PHP, o que ajudou bastante e eu só tenho a agradecer aos meus antigos professores.
O único problema que eu tinha (e vejo novos programadores também terem) eram os termos usados. Muitas vezes uma explicação curta e simples é engrandecida por termos inutilmente complexos. Por isso resolvi começar a compartilhar meu conhecimento da forma que mais amo: Simples e descontraída.


## Mas afinal de contas, que é a Orientação a Objetos?


A Programação Orientada a Objetos é um paradigma de programação.
~~Pronto. Acabou o post.~~

_Paradigma_ é basicamente um exemplo, modelo ou padrão. Alguns programadores ao longo dos anos 60 e 70 discutiam e tentavam implementar regras que facilitassem a escrita de código, o que culminou nesse paradigma (e em vários outros).

Uma das explicações mais conhecidas é de que 


> “A orientação a Objetos visa modelar o mundo real como objetos”

~~Explicação vaga, confusa e preguiçosa~~ 


Descobri que podemos explicar da seguinte forma:


> A Orientação a Objetos é um paradigma da programação que, a partir da abstração, modela entidades do mundo real como objetos, utilizando-se de três conceitos pilares: Encapsulamento, Herança e Polimorfismo.


Melhorou um pouco, vejamos... Uma **entidade** é basicamente uma coisa. Uma pessoa, uma cadeira, um carro... Tudo isso pode ser modelado em forma de objeto.

E a parte da **abstração**? Bem, abstrair é basicamente enxugar alguma coisa ao máximo, para que se obtenha apenas aquilo que é extremamente necessário.
Vamos pensar em um gato. Existem milhares de tipos de gato, ninguém nem conhece direito as raças felinas, porque gato é gato!
Eu tenho uma frajolinha, mas convenhamos que para um sistema que cadastra gatinhos, nem todos serão preto e branco. Dessa forma precisamos abstrair as características da minha gata. 
O objeto gato vai ser composto de: Nome, Cor, Pelagem. 
~~Pronto, abstraimos uma gata. A minha gata.~~

No fim, esse objeto com javascript ficaria mais ou menos assim:

![Objeto gato, que possui nome, cor e pelagem, e é atribuído à constante catObject](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/96teh4jfqn7b435l3mhp.png)
 
Pô, aí ficou tranquilo. Só criar um objeto desse jeito aí abstraindo características e temos a famosa Orientação a Objetos, certo? Não, claro que não.
 
Essa é a **modelagem** do objeto gato, mas para um sistema funcional ~~e útil~~ precisamos realizar operações com ele, como por exemplo computar quantos gatos tem um mesmo nome. Ou a porcentagem de gatos frajolas. E é aqui que entram **a herança, o encapsulamento, o polimorfismo**, e a programação em si ~~porque vamos combinar, ainda não programamos nada!~~. 

Nos próximos posts trarei esses pilares, e entenderemos juntos como eles funcionam.