<aside> <img src="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" alt="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" width="40px" />

Descrição

Programação Orientada a Objetos (POO) é um dos principais paradigmas de desenvolvimento de software, baseado na organização do código em "objetos". Esses objetos representam entidades do mundo real, combinando dados (atributos) e comportamentos (métodos) em estruturas chamadas classes. A disciplina aborda conceitos fundamentais como encapsulamento, herança, polimorfismo e abstração, que tornam o código mais modular, reutilizável e fácil de manter. Com a POO, os alunos aprendem a projetar sistemas mais robustos e organizados, facilitando o desenvolvimento colaborativo e a evolução contínua do software. Essa abordagem é amplamente utilizada em linguagens como Java, C++, Python e C#, sendo essencial para quem deseja seguir carreira no desenvolvimento de aplicações modernas.

</aside>

Objetos

Os objetos são unidades que combinam dados (que são os atributos) e as ações (métodos).

Podemos dizer que o carro é um objeto, em que suas características são seus atributos (dados atrelados ao objeto) e seus comportamentos são ações (métodos).

Os elementos de um objeto se dividem em duas categorias:

Atributos

Os atributos ou propriedades se referem às informações do objeto.

Então, por exemplo, se considerar um objeto "celular", suas propriedades serão: cor, marca, modelo, ano de fabricação e daí por diante

Métodos

Os métodos, por outro lado, são as operações que podem ser feitas no objeto.

Se seguir no exemplo de celular, os métodos podem ser ligar, enviar mensagem, tirar uma foto.

Classes

A classe é um conjunto de atributos e métodos que definem os objetos pertencentes à essa classe.

Um “Fiat Uno” é um objeto da Classe Carro.

Observe que, apesar do Fiat Uno possuir as suas próprias características, podem existir outros com exatamente os mesmos atributos, mas que ainda são considerados carros.

As principais características da programação orientada a objetos

As duas bases da POO são os conceitos de classe e objeto. Desses conceitos, derivam alguns outros conceitos extremamente importantes.

Os conceitos são o encapsulamento, a herança, as interfaces e o polimorfismo.

Encapsulamento

O encapsulamento de atributos e métodos impede o vazamento de escopo, em que um atributo ou método é visível por alguém que não deveria vê-lo, como outro objeto ou classe.

Ainda usando a analogia do carro, sabemos que ele possui atributos e métodos. Ou seja, características e comportamentos.

Os métodos do carro, como acelerar e freiar, podem usar atributos e outros métodos do carro como o tanque de gasolina e o mecanismo de injeção de combustível.

No entanto, se alguns desses atributos ou métodos forem facilmente visíveis e modificáveis, como o mecanismo de aceleração do carro, é possível fazer alterações com efeitos colaterais imprevisíveis.

Nessa analogia, uma pessoa pode não estar satisfeita com a aceleração do carro e modifica a forma como ela acontece, criando efeitos colaterais que podem, por exemplo, fazer o carro nem andar.

Dizemos, nesse caso, que o método de aceleração do seu carro não é visível por fora do próprio carro.

Na POO, um atributo ou método que não é visível de fora do próprio objeto é chamado de "privado" e quando é visível, é chamado de "público".

Mas então, como sabemos como o nosso carro acelera? É simples: não sabemos.

Nós só sabemos que para acelerar, devemos pisar no acelerador e de resto o objeto sabe como executar essa ação sem expor como o faz.

Dizemos que a aceleração do carro está encapsulada, pois sabemos o que ele vai fazer ao executarmos esse método, mas não sabemos como - e na verdade, não importa para o programa como o objeto o faz, só que ele o faça.

O mesmo vale para atributos. Por exemplo, não sabemos como o carro sabe qual velocidade mostrar no velocímetro ou como ele calcula sua velocidade, mas não precisamos saber como isso é feito.

Só precisamos saber que ele vai nos dar a velocidade certa. Ler ou alterar um atributo encapsulado pode ser feito a partir de getters e setters (colocar referência).

Isso evita a confusão do uso de variáveis globais no programa, deixando mais fácil de identificar em qual estado cada variável vai estar a cada momento do programa, já que a restrição de acesso nos permite identificar quem consegue modificá-la.

Portanto, encapsulamento é:

  1. Restringir o acesso direto aos atributos de uma classe.
  2. Controlar esse acesso por meio de métodos (como getters e setters) ou outras estratégias.
  3. Isolar a complexidade interna da classe, expondo uma interface "limpa".

Encapsular é como dizer:

"Eu (classe) cuido da bagunça aqui dentro. Você (usuário) só precisa saber quais botões apertar."

Também podem ser chamados de “tipo de dados abstratos”

Herança

No exemplo do Fiat Uno, tínhamos um carro com atributos específicos.

Apesar de ser único, existem carros com exatamente os mesmos atributos ou formas modificadas.

Mudando de exemplo, digamos que você tenha comprado um carro do modelo Fit, da Honda. Esse modelo possui uma outra versão, chamada WR-V (ou "Honda Fit Cross Style"), que possui muitos dos atributos da versão clássica, mas com algumas diferenças bem grandes para transitar em estradas de terra.

Diferente da versão clássica, o motor é híbrido, possui um sistema de suspensão diferente tração nas quatro rodas, por exemplo.

Vemos então que não só alguns atributos como também alguns mecanismos (ou métodos, traduzindo para POO) mudam.

No entanto, a versão "cross" ainda é do modelo Honda Fit, ou melhor, é um tipo do modelo.

Quando dizemos que uma classe A é um tipo de classe B, dizemos que a classe A herda as características da classe B e que a classe B é mãe (ou pai) da classe A, estabelecendo então uma relação de herança entre elas.

Portanto, herança é:

Interface

Muitos dos métodos dos carros são comuns em vários automóveis.

Tanto um carro quanto uma motocicleta são classes cujos objetos podem acelerar, parar, acender o farol etc, pois são coisas comuns a automóveis.

Podemos dizer, então, que ambas as classes "carro" e "motocicleta" são "automóveis".

Quando duas (ou mais) classes possuem comportamentos comuns que podem ser separados em uma outra classe, dizemos que a "classe comum" é uma interface, que pode ser "herdada" pelas outras classes.

Note que colocamos a interface como "classe comum", que pode ser "herdada" (com aspas), porque uma interface não é exatamente um classe, mas sim um conjunto de métodos que todas as classes que herdarem dela devem possuir (implementar) - portanto, uma interface não é "herdada" por uma classe, mas sim implementada.

No mundo do desenvolvimento de software, dizemos que uma interface é um "contrato": uma classe que implementa uma interface deve fornecer uma implementação a todos os métodos que a interface define, e em compensação, a classe implementadora pode dizer que ela é do tipo da interface.

No exemplo do "carro" e "motocicleta", eles são classes que implementam os métodos da interface "automóvel", logo podemos dizer que qualquer objeto dessas duas primeiras classes, como um Honda Fit ou uma motocicleta da Yamaha, são automóveis.

Um pequeno detalhe: uma interface não pode ser herdada por uma classe, mas sim implementada.

No entanto, uma interface pode herdar de outra interface, criando uma hierarquia de interfaces.

Usando um exemplo completo com carros, dizemos que a classe "Honda Fit Cross" herda da classe "Honda Fit", que por sua vez herda da classe "Carro".

A classe "Carro" implementa a interface "Automóvel" que, por sua vez, pode herdar (por exemplo) uma interface chamada "MeioDeTransporte", uma vez que tanto um "automóvel" quanto uma "carroça" são meios de transporte, ainda que uma carroça não seja um automóvel.

Portanto, interface é:

Como um contrato:

A interface é 100% abstrata (só a definição, sem corpo).

Perguntas