Fundamentos de orientação a objeto. (P00)
Published: 2023-01-20 15:03:32


Eu sei que você ai do mundo da tecnologia alguma vez ja ouviu ou leu algo sobre a programação orientada a objetos. 

## O que a programação estruturada tem haver com isso ?

Na programação estruturada, um programa é composto por três tipos básicos de estruturas:

- sequências: são os comandos a serem executados
- condições: sequências que só devem ser executadas se uma condição for satisfeita (exemplos: `if-else`, `switch` e comandos parecidos)
- repetições: sequências que devem ser executadas repetidamente até uma condição for satisfeita (`for`, `while`, `do-while` etc)

A diferença principal é que na programação estruturada, um programa é tipicamente escrito em uma única rotina (ou função) podendo, é claro, ser quebrado em sub-rotinas. Mas o fluxo do programa continua o mesmo, como se pudéssemos copiar e colar o código das sub-rotinas diretamente nas rotinas que as chamam, de tal forma que, no final, só haja uma grande rotina que execute todo o programa.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mcel4lu0ukfo1nzlyyhc.png)

Além disso, o acesso às variáveis não possuem muitas restrições na programação estruturada. Em linguagens fortemente baseadas nesse paradigma, restringir o acesso à uma variável se limita a dizer se ela é visível ou não dentro de uma função (ou módulo, como no uso da palavra-chave `static`, na linguagem java), mas não se consegue dizer de forma nativa que uma variável pode ser acessada por apenas algumas rotinas do programa. 

Vemos uma comparação muito clara entre a programação estruturada e a programação orientada a objetos no que diz respeito aos dados. Repare que, no paradigma estruturado, temos procedimentos (ou funções) que são aplicados globalmente em nossa aplicação. No caso da orientação a objetos, temos métodos que são aplicados aos dados de cada objeto. Essencialmente, os procedimentos e métodos são iguais, sendo diferenciados apenas pelo seu escopo.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6mxhh9nl5xg9y49uiga3.png)






## Afinal de contas o que e POO ?
Como o nome ja diz a programação orientada a objetos serve para orientar objetos, usar objetos do mundo real, ou nao para criar programas de computador. Nesse paradigma de programação usamos dados(características) e comportamentos para representar um objeto. Você pega uma necessidade do mundo real e transforma em uma solução através de códigos fonte em linguagem de alto nível para gerar um sistema computacional. Por isso, esse paradigma aproxima o mundo real do mundo virtual.

## Por que fala-se em orientação a objetos?
O objeto é, na verdade, uma aglutinação de estados e comportamentos. Conceitualmente falando, um objeto é um elemento que representa alguma entidade, quer seja abstrata quer seja concreta, da área de interesse do problema que está sendo analisado. Para isso também precisamos entender o conceito de classes, pois classes e objetos estão ligados entre si.

## Classes e objetos

Em síntese, a classe é um conjunto de objetos com características em comum. E é justamente a classe quem define o comportamento do objeto. E o comportamento, por sua vez, é definido por métodos (ação) e atributos (características).

Sendo assim, todos os conceitos da POO (igualmente importantes) são baseados nesses dois iniciais, que são objetos e classes.

Depois que uma classe é definida podem ser criados diferentes objetos que utilizam a classe. Como por exemplo a definição da classe Empresa, que tem os atributos nome, endereço, CNPJ, data de fundação, faturamento, e também o método imprimir, que apenas mostra os dados da empresa.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mtc0dklw31aszrjfgzyt.png)


## Exemplificando classes e objetos. 

Imagine que você comprou um carro recentemente e decide modelar esse carro usando programação orientada a objetos. O seu carro tem as características que você estava procurando: um motor 2.0 híbrido, azul escuro, quatro portas, câmbio automático etc. Ele também possui comportamentos que, provavelmente, foram o motivo de sua compra, como acelerar, desacelerar, acender os faróis, buzinar e tocar música. Podemos dizer que o carro novo é um objeto, onde suas características são seus atributos (dados atrelados ao objeto) e seus comportamentos são ações ou métodos.

Seu carro é um objeto seu mas na loja onde você o comprou existiam vários outros, muito similares, com quatro rodas, volante, câmbio, retrovisores, faróis, dentre outras partes. Observe que, apesar do seu carro ser único (por exemplo, possui um registro único no Departamento de Trânsito), podem existir outros com exatamente os mesmos atributos, ou parecidos, ou mesmo totalmente diferentes, mas que ainda são considerados carros. Podemos dizer então que seu objeto pode ser classificado (isto é, seu objeto pertence à uma classe) como um carro, e que seu carro nada mais é que uma instância dessa classe chamada "carro".


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5hbkk4g9l069voo23nvq.png)

Assim, abstraindo um pouco a analogia, uma classe é um conjunto de características e comportamentos que definem o conjunto de objetos pertencentes à essa classe. Repare que a classe em si é um conceito abstrato, como um molde, que se torna concreto e palpável através da criação de um objeto. Chamamos essa criação de instanciação da classe, como se estivéssemos usando esse molde (classe) para criar um objeto.

```
public class Carro {
    Double velocidade;
    String modelo;

    public void acelerar() {
        /* código do carro para acelerar */
    }

    public void frear() {
        /* código do carro para frear */
    }

    public void acenderFarol() {
        /* código do carro para acender o farol */
    }
}
```
## Conclusão

Para concluir, agora que você sabe mais sobre o que é POO, pode imaginar que é um tema que exige estudos mais profundos, especialmente se você estiver ingressando agora no mundo da programação. Nunca pare de estudar :)