Um guia para iniciantes de abstração em programação orientada a objetos

Quando você come um burrito, todos os seus receptores gustativos cantam de alegria. Cada mordida traz uma combinação de diferentes tipos de sabor, como salgado, doce, picante e umami. Cada mordida depois disso tem um sabor ligeiramente diferente, conforme uma nova coleção de ingredientes junta seus sabores.

Você pode ter lido os ingredientes do menu, mas não sabe exatamente como o molho é feito. O tempero que eles usam em seus vegetais pode ser uma mistura secreta. Você não precisa saber todos os ingredientes exatos, no entanto. Basta saber que é delicioso.

Os ingredientes que você conhece, como arroz branco puro, são concretos. Os outros elementos são abstratos. Você sabe que é salsa, mas de que tipo? Ou, se alguém simplesmente lhe der um burrito do nada, todo o burrito é abstrato.

Abstração no Resumo

Junto com a herança , a abstração é um conceito importante na programação orientada a objetos. A teoria é que todo objeto deve entregar resultados simples e previsíveis. Os objetos também devem compartilhar apenas o que precisa ser compartilhado.

A abstração mantém o código e os dados ocultos quando apropriados

Você pode pensar em um burrito como um objeto. Dentro do burrito, você tem vários outros objetos, como feijão, arroz, queijo e molho picante. O feijão pode ter sido temperado. O queijo pode ser uma mistura. E o molho picante pode ser uma combinação de pimentas envelhecidas em vinagre.

Você não precisa saber como todos os ingredientes de um burrito foram feitos. E, no caso de cachorros-quentes, você provavelmente não quer saber. O que importa é que não se desintegre ao comer e que seja super saboroso.

A abstração está intimamente ligada ao encapsulamento

É a mesma coisa com objetos de programação. Quando você instancia um objeto (cria-o a partir de uma classe), é como pedir um burrito no balcão do food truck. Você tem acesso a alguns dados, mas não a todos. Você não precisa saber como o objeto funciona, desde que as funções retornem os dados corretos. Aqui está um burrito em JavaScript / Typescript:

 class CheeseBlend {
private _ingredients = ["Colby Jack", "Cheddar", "Manchego"];
get ingredients() {
return "melted cheese";
}
}
class SecretSalsa {
private _ingredients = ["onions", "tomatoes", "cilantro", "Guatemalan Insanity Peppers"];
get ingredients() {
return "it's a secret";
}
}
class Burrito {
private _beans = "beans";
private _rice = "rice";
private _cheese: CheeseBlend = new CheeseBlend();
private _salsa: SecretSalsa = new SecretSalsa();
get cheese() {
return this._cheese.ingredients;
}
get salsa() {
return this._salsa.ingredients;
}
}
let burro = new Burrito();
console.log(burro.cheese);
console.log(burro.salsa);

Você pode brincar com este código na caixa de proteção TypeScript .

No exemplo acima, os ingredientes da salsa e do queijo são abstraídos. Primeiro, eles são encapsulados, para ocultar os ingredientes especiais. Em seguida, getters são adicionados para acessar os ingredientes. Mas os ingredientes apenas retornam uma representação abstrata do que realmente são.

Abstração no concreto

Abstração é mais do que um conceito, no entanto. As aulas também podem ser abstratas. Isso significa que eles podem definir outras classes. Mas eles próprios não podem ser instanciados.

Por que as aulas às vezes devem ser abstratas

Imagine que você vai a um restaurante e se senta. O garçom lhe entrega um menu. Você abre para descobrir que há apenas um item: comida.

Isso é muito abstrato. Você pediria? Você comeria? Você provavelmente não faria. Dizer que algo é comida não é suficiente. Precisa ser decomposto em algo mais concreto.

Que tal macarrão? Bem, esse é um tipo de alimento mais específico. E sabemos que provavelmente tem macarrão e molho. Mas há muitos tipos diferentes de massa por aí, então ainda é abstrato.

O que é abstrato e o que é concreto?

O Fettuccine Alfredo é um exemplo concreto de comida e massa. A mesma coisa se aplica às aulas. Nem toda classe deve ser instanciada. Algumas classes devem definir apenas a estrutura de outras classes.

Aqui está um exemplo com uma classe abstrata Food e uma classe filha MacadamiaNuts :

 abstract class Food {
constructor(public name: String) {}
abstract totalCalories(): number;
abstract description(): string;
abstract flavor(): string;
}
class MacadamiaNuts extends Food {
constructor() {
super("One Cup of Macadamia Nuts");
}
totalCalories() {
return 962;
}
description() {
return "A nut from Hawaii.";
}
flavor() {
return "rich, buttery, and nutty";
}
}
let nuts = new MacadamiaNuts();
console.log(nuts.name)
console.log(nuts.description())

Aqui está o código.

As classes abstratas dizem às outras classes como elas devem se comportar. No exemplo acima, se você for uma classe de alimentos, deve ter funções que permitam acesso ao seu nome, sabor, descrição e calorias.

Observe que a classe MacadamiaNuts estende Food . Isso quer dizer que nozes de macadâmia concorda em seguir as regras da alimentação . Além disso, observe que o construtor chama super . Esse comando instancia a classe pai antes que o construtor instancia MacadamiaNuts .

Se você está aprendendo a programar, pode se divertir mais com esses jogos de programação .

Prática de Abstração

  • Visite o link acima e use a sandbox para criar uma classe abstrata chamada Soup.
  • Crie um filho concreto da classe Sopa , chamado Cereal .
  • Use console.log para testar seu código. O que acontece se sua classe Cereal não tiver uma das funções definidas em Sopa ?

Mas qual é o objetivo de uma classe que você não consegue instanciar?

A princípio, classes abstratas podem parecer desnecessárias. Afinal, você não pode realmente usá-los para fazer um objeto. E não é como se eles transmitissem suas funções. As funções devem ser reescritas em todas as classes-filho.

Existem dois motivos principais pelos quais você precisa de classes abstratas. Eles mantêm seu código consistente e garantem que outros desenvolvedores também escrevam código consistente. Você nem sempre estará trabalhando sozinho. Toda a equipe precisa seguir as mesmas regras. Você pode aprender mais na documentação do TypeScript sobre classes abstratas .