2.1 Conceitos principais da POO
A base da abordagem orientada a objetos na programação é a paradigma da POO. Isso acontece quando todas as entidades do programa são tratadas como objetos. Objetos — são dados + métodos/funções que fazem algo com esses dados.
Também podemos dizer que um objeto tem estado e comportamento. O estado do objeto é definido por seus dados, que estão armazenados em suas variáveis internas. O comportamento do objeto — é a soma de todas as ações que seus métodos executam.
Existem milhares de objetos em um programa médio, em um grande — milhões. Para reduzir o caos, decidiu-se organizar os objetos em classes, e classes — em uma certa hierarquia.
Interessante! O conceito de hierarquia de classes foi retirado do reino animal, onde existem humanos, que são primatas, que são mamíferos, e assim por diante.
Cada objeto tem uma classe que o cria. Por um lado, a classe é um modelo de objeto, por outro lado — é um objeto independente com suas próprias características (mais sobre isso abaixo).
Para entender melhor o conceito de classes, veja as seguintes definições:
Classe:
Classe — é um modelo ou esquema para criar objetos, que define atributos e métodos, característicos de todos os objetos desse tipo. Classes permitem organizar dados e funções que trabalham com esses dados em um todo.
Objeto:
Objeto — é uma instância de uma classe. Cada objeto possui estado (definido pelos atributos) e comportamento (definido pelos métodos).
Encapsulamento:
Encapsulamento é sobre esconder a implementação interna da classe e fornecer um interface para interagir com os objetos dessa classe. Isso ajuda a proteger os dados e gerenciar o acesso a eles.
Herança:
Herança permite que uma classe (filha) herde atributos e métodos de outra classe (mãe). Isso facilita a reutilização do código e simplifica sua manutenção.
Polimorfismo:
Polimorfismo permite usar uma única interface para trabalhar com objetos de diferentes classes. Isso é alcançado através de overrides de métodos nas classes filhas, que são herdados das mães.
Abstração:
Abstração é sobre extrair as características comuns dos objetos e criar classes que representam essas características comuns. Isso ajuda a simplificar sistemas complexos e melhorar sua compreensão.
Se você entendeu pelo menos metade — ótimo. Em seguida, vamos examinar cada um desses pontos com mais detalhes.
2.2 Abstração
Um bom exemplo de abstração na vida real é a descrição de cargos em uma empresa ou organização. O nome do cargo é uma coisa, mas as responsabilidades de cada cargo são outra coisa completamente diferente.
Imagine que você está projetando a estrutura de sua futura empresa. Você pode distribuir as responsabilidades de um secretário, "dividindo" elas entre vários outros cargos. Você pode dividir o cargo de diretor executivo em vários cargos independentes: diretor financeiro, diretor técnico, diretor de marketing, diretor de RH. Ou, por exemplo, combinar os cargos de gerente de escritório e recrutador em um só.
Em termos de programação, abstração é, digamos, a forma correta de dividir um programa em objetos. Normalmente, qualquer grande programa pode ser representado de dezenas de maneiras como objetos interagindo entre si. Abstração permite selecionar as características principais e omitir as secundárias.
![](https://cdn.javarush.com/images/article/c67b5f03-7904-45f7-8959-368a1403de42/512.jpeg)
Abstração é como uma estratégia em uma guerra. Uma estratégia ruim — e nenhuma tática genial pode corrigir a situação.
2.3 Encapsulamento
O objetivo do encapsulamento é melhorar a qualidade da interação dos elementos simplificando sua interação.
![](https://cdn.javarush.com/images/article/131fb89c-03c1-4d9f-ad9b-b2b1ece32276/512.jpeg)
E a melhor maneira de simplificar algo é ocultar todas as partes complexas dos olhares curiosos. Por exemplo, se você entrar na cabine de um Boeing, você não vai entender de imediato como pilotá-lo:
![](https://cdn.javarush.com/images/article/7d17488c-6147-4ba4-a9e8-4ec063e2cbe9/512.jpeg)
Por outro lado, para os passageiros do avião, tudo parece mais simples: compra o ticket, entra no avião, decola e aterra. Você pode facilmente viajar de continente a continente com apenas as habilidades de "comprar um ticket" e "embarcar no avião". Todas as complexidades como preparar o avião para o voo, decolagem, pouso e diversas situações de emergência estão ocultas de nós. Sem mencionar a navegação por satélite, piloto automático e os centros de controle de tráfego aéreo nos aeroportos. E isso torna nossa vida mais fácil.
Do ponto de vista da programação, encapsulamento é "ocultação da
implementação"
. Eu gosto dessa definição. Nossa classe pode conter centenas de métodos e
implementar comportamentos muito complexos em várias situações. Mas podemos
ocultar de olhares curiosos todos os seus métodos (envolvendo seus nomes com "__" em ambos os lados),
e para interagir com outras classes, deixar apenas dois ou três métodos.
Então todas as outras classes do nosso programa verão nesta classe
apenas três métodos e chamarão precisamente esses
. E todas as complexidades estarão ocultas dentro da classe, como a cabine dos pilotos dos
passageiros felizes.
2.4 Herança
A herança tem dois lados. O lado da programação e
o lado da vida real. Do ponto de vista da programação, a herança —
é uma relação especial entre duas classes
. Mas o que é muito mais interessante é o que a herança significa com relação à vida real.
Se precisássemos criar algo na vida real, teríamos dois caminhos:
- criar o que precisamos do zero, gastando muito tempo e esforço;
- criar o que precisamos baseado em algo já existente.
A estratégia mais otimizada parece ser:
pegamos uma boa solução existente, a ajustamos um pouco, adaptamos
às nossas necessidades e a usamos
.
Se seguirmos a história do surgimento do homem, veremos que desde
o início da vida no planeta se passaram bilhões de anos. Mas se imaginarmos que
o homem surgiu do macaco (baseado no macaco), se passaram apenas alguns
milhões de anos.
Criar do zero — é mais demorado. Muito mais.
.
Na programação também há a possibilidade de criar uma classe baseada
em outra.
A nova classe se torna descendente (herdeira) de uma já existente
. Isso é muito vantajoso quando existe uma classe que contém 80%–90% dos dados e métodos
que precisamos.
Nós simplesmente declaramos a classe apropriada como mãe da nossa nova classe,
então na nova classe aparecem automaticamente todos os dados e métodos
da classe mãe
. Legal, né?
2.5 Polimorfismo
Polimorfismo — é um conceito da área de programação. Descreve a situação onde atrás de uma interface única se escondem diferentes implementações. Se tentarmos procurar analogias na vida real, uma delas seria o processo de dirigir um carro.
Se uma pessoa pode dirigir um caminhão, ela pode dirigir uma ambulância, ou um carro esportivo.
A pessoa pode dirigir o carro independentemente de qual tipo de carro for, porque todos possuem
a mesma interface de controle: volante, pedais e alavanca de câmbio
. O sistema interno dos carros é diferente, mas todos eles têm a mesma interface
de controle.
Voltando à programação, o polimorfismo permite
lidar uniformemente com objetos de várias classes (geralmente têm
um ancestral comum) – uma coisa que é difícil de superestimar
. Seu valor aumenta quanto maior for o programa.
POO — são princípios. Leis internas.
Cada um nos limita em algo, mas nos dá grandes
vantagens quando o programa cresce em tamanho
. Quatro princípios da POO — são como quatro pernas de uma cadeira. Se tirar pelo menos uma, toda
o sistema se tornará instável.
GO TO FULL VERSION