POO (Programação Orientada a Objetos) é um paradigma de programação que busca utilizar objetos para representar coisas do mundo real dentro de um programa, facilitando o entendimento e acesso a funcionalidades do código.
Um dos exemplos mais utilizados para demostrar conceitos de POO é modelar a classe Pessoa.
O que é uma classe?
Classe é como uma planta arquitetônica, assim como podemos construir diferentes casas utilizando uma mesma planta, com uma classe podemos instanciar vários objetos de Pessoa seguindo uma estrutura básica predefinida.
No Javascript podemos definir uma classe da seguinte forma:
classPessoa {constructor(nome, idade) {this.nome = nome;this.idade = idade; }seApresentar() {console.log(`Olá, meu nome é ${this.nome}.`); }}
Agora que temos uma classe Pessoa podemos instanciar (criar) objetos a partir dela.
constpessoa1=newPessoa('Josias',34);constpessoa2=newPessoa('Flávia',23);pessoa1.seApresentar();// Olá, meu nome é Josias.pessoa2.seApresentar();// Olá, meu nome é Flávia.
Princípios de POO
Encapsulamento
Encapsulamento consiste em esconder informações que não devem ser acessadas de forma direta mas sim por meio de funções auxiliares que definem regras de como essa informação deve ser manipulada e visualizada.
classPessoa {constructor(nome, idade) {this._nome = nome;this._idade = idade; }getnome() {returnthis._nome; }getidade() {returnthis._idade; }fazerAniversario() {this._idade++; }seApresentar() {console.log(`Olá, meu nome é ${this._nome} e tenho ${this._idade} anos.`); }}constpessoa1=newPessoa('Josias',34);pessoa1.fazerAniversario();pessoa1.seApresentar();// Olá, meu nome é Josias e tenho 35 anos.
No exemplo acima é possível notar o uso do carácter _ como prefixo do nome das variáveis nome e idade. É convencionado que variáveis que começam com o underline são consideradas privadas, isto é, não devem ser acessadas diretamente pelo programador, apenas pelo uso dos setters e getters.
Abstração
Abstração significa esconder detalhes de implementação, mostrando apenas o essencial para o mundo externo ao objeto.
classPessoa {constructor(nome, idade) {this._nome = nome;this._idade = idade; }getnome() {returnthis._nome; }getidade() {returnthis._idade; }fazerAniversario() {this._idade++; }seApresentar() {if (Math.random() <0.5) {console.log(`Olá, meu nome é ${this._nome} e tenho ${this._idade} anos.`); } else {console.log(`Oii, me chamo ${this._nome} e tenho ${this._idade} anos.`); } }}constpessoa1=newPessoa('Josias',34);pessoa1.fazerAniversario();pessoa1.seApresentar();// Olá, meu nome é Josias e tenho 35 anos.pessoa1.seApresentar();// Oii, me chamo Josias e tenho 35 anos.
Herança
Muitas vezes os objetos acabam sendo bem similares, compartilhando uma lógica comum, porém sem serem exatamente iguais. Uma forma de reutilizar essa lógica comum, extraindo a lógica única para uma classe à parte, é chama de herança. Esse processo consiste em criar uma classe filha que deriva de uma classe pai.
classEstudanteextendsPessoa {constructor(nome, idade, curso) {super(nome, idade);this._curso = curso; }getcurso() {returnthis._curso; }estudar() {console.log(`Estudando ${this._curso}`) }}constestudante1=newEstudante('Josias',34,'Administração');estudante1.seApresentar();// Olá, meu nome é Josias e tenho 34 anos.estudante1.estudar();// Estudando Administração.
Polimorfismo
O termo polimorfismo é originário do grego e significa "muitas formas" (poli = muitas, morphos = formas). Em POO, isso ocorre quando diferentes objetos chamam o mesmo método e recebem respostas adequadas ao contexto de cada um.
classEstudanteextendsPessoa {constructor(nome, idade, curso) {super(nome, idade);this._curso = curso; }getcurso() {returnthis._curso; }estudar() {console.log(`Estudando ${this._curso}`) }seApresentar() {console.log(`Olá, meu nome é ${this._nome}, tenho ${this._idade} anos e faço ${this._curso}.`); }}constestudante1=newEstudante('Josias',34,'Administração');constpessoa1=newPessoa('Flávia',23);pessoa1.seApresentar();// Olá, meu nome é Flávia e tenho 23 anos.estudante1.seApresentar();// Olá, meu nome é Josias, tenho 34 anos e faço Administração.