DEV Community

Alan Patrick
Alan Patrick

Posted on

OOP do jeito certo: Passagem de Mensagem e os Quatro Pilares

Acabei de assistir um vídeo antigo do ThePrimeagen sobre passagem de mensagens na OOP, e quis escrever um artigo que explicasse melhor o tópico. Enãto aqui estamos.

Passagem de mensagens, para aqueles que não sabem, é essencialmente um gatilho para um objeto agir. De alguma forma, "passagem de mensagens" tornou-se "evocação de métodos". JavaScript, apesar de não ser Smalltalk, já possui um mecanismo interessante para mensagens. Você pode acessar dinamicamente os campos de um objeto:

obj['mensagem'](...params);
Enter fullscreen mode Exit fullscreen mode

Isso permite que você acesse o comportamento associado à mensagem. Comportamento não é o mesmo que uma chamada de método. Comportamentos podem ser muitos métodos privados de uma vez, métodos públicos ou até mesmo uso de referência de outros objetos. O importante é a API declarativa que a passagem de mensagens possibilita. Isso enforça o princípio da Abstração.

const jose = new Pessoa('José');

jose['saudacao'](); // imprime "Olá, eu sou o José!"
jose['soma'](2, 2); // imprime "Eu sou ruim em matemática!!!"
Enter fullscreen mode Exit fullscreen mode

Se dermos a mesma mensagem para diferentes objetos, o que acontece? Obtemos Polimorfismo.

const jose = new Pessoa('José');
const fusca = new Carro('Fusca');
const pimenta = new Cachorro('Pimenta');

jose['saudacao'](); // imprime "Olá, eu sou o José!"
fusca['saudacao'](); // imprime "Beep!"
pimenta['saudacao'](); // imprime "Au Au!"
Enter fullscreen mode Exit fullscreen mode

Para ensinar matemática a José, não podemos simplesmente abrir o cérebro dele e enfiar matemática lá dentro — não é assim que o cérebro funciona na vida real, então não será assim que modelaremos nosso sistema aqui. José será ensinado corretamente. Vamos apresentá-lo à Maria, uma professora:

const jose = new Pessoa('José');
const maria = uma Professora('Maria'); // Note a nova classe

maria['saudacao'](jose); // imprime "Olá, José, eu sou a Maria!"

jose['saudacao-de-volta'](maria); // imprime "Olá, Maria, prazer em conhecê-la!"

// José até sabe como `saudar-de-volta` — que chique.
Enter fullscreen mode Exit fullscreen mode

Vê como a mensagem saudacao é diferente desta vez? Comportamentos podem ser modificados com parâmetros. Este é também um ótimo exemplo do princípio de Herança: Um professor é uma pessoa, e todas as pessoas sabem como saudar. Maria, sendo professora e pessoa, sabe como saudar também.

Finalmente, vamos ensinar matemática para José:

// Verificando novamente se José sabe matemática:

jose['soma'](2, 2); // imprime "Eu sou ruim em matemática!!!" ainda!

// Nada de novo. Vamos fazer Maria ensiná-lo:
maria['ensinar'](jose, 'matemática');

jose['soma'](2, 2); // imprime "2 mais 2 são 4."
Enter fullscreen mode Exit fullscreen mode

O que aconteceu com José? Maria simplesmente enfiou matemática em seu cérebro? Vamos dar uma olhada no comportamento ensinar abaixo. Como objetos não podem mudar o estado de outros objetos, você deve passar a mensagem e deixá-los lidar com isso.

class Professor extends Pessoa {
  // ... outras lógicas vão aqui

  ensinar(pessoa, assunto) {
    pessoa['aprender'](assunto);
  }
}
Enter fullscreen mode Exit fullscreen mode

Essa regra de não mexer no estado interno de outro objeto é chamada de Encapsulamento. Apenas José pode realmente aprender — Maria só pode ajudar. José é um bom aluno e, agora que ele sabe matemática, ele se comporta de maneira diferente quando é pedido para somar dois números.

E aí está: exploramos os quatro pilares da Programação Orientada a Objetos através da Passagem de Mensagens.

Espero que tenha gostado!

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post →

Top comments (0)

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post