Programação Orientada a Objetos: uma Breve Introdução 👷
Tags: beginners, programming, oop, braziliandevs
Published: 2023-03-12 02:54:25

  A orientação a objetos é um famoso paradigma da programação que surge da tentativa de aproximar a realidade ao mundo virtual, assim ela é baseada no conceito de objetos, sendo elas entidades (concretas ou abstratas) que seguem a um mesmo modelo, as classes.

#### 🤔 Você Sabia? 🤔
> Esse conceito foi idealizado no final da década de 1960 por Alan Talk, introduzida por meio da linguagem Simula-68.

## Classes 🏠
> 🏠 -> 🧱 + 🔨

  As classes são as "fôrmas" dessas entidades, possibilitando a atribuição de características e ações a elas, modelando-as da melhor maneira possível às suas ideias e intenções. Imagine-a como o projeto de uma casa, no qual é descrito o que é necessário para faze-la ser o que ele é, ou seja, o que é preciso para uma casa ser uma casa.

  Um dos componentes que fazem essa função de descrição é o **Atributo 🧱**, que são as características de um objeto, sendo eles propriedades semelhantes que as entidades de uma classe possuem. Sendo assim, seguindo a analogia anterior, uma classe "Casa" teria os seguintes atributos:
- Cor;
- Material do telhado;
- Material da parede;
- Quantidade de quartos;
- etc…

  E assim como os Atributos, os **Métodos 🔨** também tem a função de agregar as singularides de uma Classes, sendo responsáveis por representar as funcionalidades e comportamentos daquela entidade por meio de ações, ou seja, como é que a entidade que está sendo representada age. Uma casa poderia ter um método que alteraria sua cor, por exemplo.

### Métodos especiais ⭐️
  Por padrão, as classes possuem alguns métodos especiais, que otimizam seu uso, e são eles:
- Construtores: passam valores padronizados aos atributos na instância de um objeto.
- Getters: métodos que buscam e retornam informações dos atributos.
- Setters: métodos que definem e atualizam os valores dos atributos.

### Visibilidade de componente
  Essa definição de visibilidade gere o acesso externo aos métodos e atributos de um objeto. 😶‍🌫️
- Público: permite o acesso do componente em qualquer lugar que o objeto for utilizado.
- Privado: permite o acesso apenas na classe em questão.
- Protegido: permite o acesso somente às classes filhas, em mais nenhuma outra aplicação.

## Relacionamento entre Classes 🍻
  O relacionamento entre classes permite a associação entre classes independentes. Esse relacionamento indica que os objetos de uma das classes estão relacionados aos objetos da outra classe. 
 
  Há vários tipos de relacionamentos, a mais comum do paradigma é a **Associação 👫** que acontece quando há uma relação estrutural entre classes, em que uma utiliza dos métodos e atributos da outra. 
  
  Uma outra forma de uma classe se relacionar a outra, é por meio de **Dependência 💉** que acontece quando em uma das classes, a sua mudança afeta a outra, ou seja, o relacionamento de dependência é caracterizado quando uma funcionalidade precisa de uma outra classe para ser executada. Essa dependência ocorre em apenas uma delas.

## Pilares do Paradigma 🏛️
  Para o funcionamento adequado da Orientação a Objetos é preciso entender as 4 bases do paradigma.

  A principal entre elas é a **Abstração 📝**, ela consiste em utilizar apenas as características necessárias na modelagem dos objetos, para identificar dentre todos os possíveis atributos da entidade, quais serão realmente úteis. 

  Um outro pilar, é o **Encapsulamento 💊**, como o próprio termo diz, o encapsulamento "encapsula" o objeto, restringindo o acesso a alguns dos componentes. O encapsulamento é aplicado por meio de interfaces, usado tanto para a segurança da aplicação quanto para a prevenção de erros. Por exemplo, ao dirigir um carro, o motorista não possui acesso direto ao motor, e sim aos pedais. 

  Mais um conceito importantíssimo ao paradigma: **Hierarquia 👨‍👩‍👧**. A ideia é transferir os mesmos atributos e métodos de uma classe às outras, assim permitindo formar uma árvore hierárquica de classes, partindo da maior generalização (raiz) até a maior especialização (folhas). Esse é considerado o relacionamento de generalização. 

  E por último mas não menos importante, o **Polimorfismo 🐱**, é a utilização do mesmo nome de um método já existente, porém com outras funcionalidades, podendo alterar a assinatura dos mesmos ou não.

_**Assinatura ✍️**_
> _A assinatura é o que permite a identificação de um método de forma única, tendo em vista, que muitas vezes é utilizado o mesmo homônimo na criação de novos métodos. O que garante essa unicidade é a quantidade de parâmetros e que esses parâmetros sejam do mesmo tipo do método de seu homônimo._

### Tipos Básicos de Polimorfismo 
- Sobreposição: quando ocorre a sobreposição dos métodos herdados em classes diferentes, utilizando dos mesmos nomes e assinaturas.
- Sobrecarga: quando há adição de metódos à classe, utilizando o mesmo nome para essas implementações, porém com assinaturas diferentes.
- Paramétrico: quando há a utilização de métodos com o mesmo homônimo e assinatura, alterando apenas o tipo do retorno e dos parâmetros.

## Conclusão 🎉
Essa foi uma breve apresentação conceitual ao paradigma, onde foram colocadas as ideias principais para seu entendimento. Hoje em dia é possível perceber o quão útil foi o desenvolvimento desse modelo, que possibilitou com detalhes a descrição de alguma entidade do mundo real ao código. 


**:)**