Skip to main content

📘 Orientação a Objetos -- Encapsulamento (+ Condicional) e Herança (Declaração e Uso)

Introdução

Observe o seguinte código de exemplo relativo à declaração da classe Pessoa, definição da visibilidade de atributos e métodos, bem como as condicionais implementadas para prover o devido encapsulamento dos atributos.


💻 Código Completo

Arquivo: Pessoa.js

// Arquivo criado em projeto no www.stackblitz.com denominado Pessoa.js
// Arquivo criado dentro de uma pasta /objetos/pessoas na raiz do projeto
// Objetivo do exemplo: demonstrar conceitos de encapsulamento adicionados de condicionais

class Pessoa {

#nome;
#email;

setNome(nome) {
if (nome) {
this.#nome = nome;
return true;
} else {
return false;
}
}

getNome() {
return this.#nome;
}

setEmail(email) {
if (email) {
this.#email = email;
return true;
} else {
return false;
}
}
getEmail() {
return this.#email;
}

}

module.exports = Pessoa;

📘 Comentários e Explicações Linha a Linha

Linhas 01--03

Apresentam informações gerais sobre o arquivo, indicando seu nome, localização no projeto e o objetivo do exemplo: demonstrar a utilização do encapsulamento aliado a estruturas condicionais para validação dos dados.

Linha 04

Declara a classe Pessoa, responsável por representar um objeto que possui atributos privados e métodos públicos para acesso controlado a esses atributos.

Linhas 05--06

Declaram dois atributos privados da classe.

Esses atributos somente podem ser acessados pelos métodos internos da própria classe, implementando o conceito de encapsulamento.

Linhas 07--14

Declaram o método setNome(), responsável por atribuir um valor ao atributo privado #nome.

Antes de realizar a atribuição, o método verifica se o parâmetro recebido possui um valor válido.

Caso a condição seja satisfeita:

  • o valor é armazenado;
  • o método retorna true.

Caso contrário, nenhuma alteração é realizada e o método retorna false.

Linhas 15--17

Declaram o método getNome(), responsável por retornar o valor armazenado no atributo privado #nome.

Como o atributo é privado, esse método é a forma correta de acessar seu conteúdo.

Linhas 18--25

Declaram o método setEmail(), responsável por atribuir um valor ao atributo privado #email.

A lógica é semelhante à utilizada no método setNome():

  • verifica se o parâmetro possui conteúdo;
  • armazena o valor somente quando a validação é satisfeita;
  • retorna true em caso de sucesso e false caso contrário.

Linhas 26--28

Declaram o método getEmail(), utilizado para retornar o valor armazenado no atributo privado #email.

Linhas 29--30

A linha 29 encerra a definição da classe.

Na linha 30, a instrução module.exports = Pessoa; exporta a classe para que ela possa ser reutilizada em outros arquivos por meio da função require().


📌 Conceitos-Chave Envolvidos


Conceito Explicação


class Define uma estrutura de objeto contendo atributos e métodos.

#atributo Declara um atributo privado da classe.

Encapsulamento Restringe o acesso direto aos atributos do objeto.

set...() Método responsável por atribuir valores aos atributos privados.

get...() Método responsável por retornar os valores dos atributos privados.

if/else Estrutura condicional utilizada para validar dados antes da atribuição.

module.exports Exporta a classe para utilização em outros módulos JavaScript.


💡 Dicas do Professor

  • Sempre utilize métodos set e get quando precisar controlar acesso aos dados.
  • Evite expor atributos diretamente.
  • Validações simples podem impedir muitos erros futuros.


Herança e Encapsulamento -- Classe PF

Observe agora a implementação da classe PF, responsável por representar uma Pessoa Física.

Ela herda atributos e comportamentos da classe Pessoa.


💻 Código Completo

Arquivo: PF.js

// Arquivo criado em projeto no www.stackblitz.com denominado PF.js (Pessoa Física)
// Arquivo criado dentro de uma pasta /objetos/pessoas na raiz do projeto
// Objetivo do exemplo: demonstrar conceitos de Herança, bem como encapsulamento adicionados de condicionais

const Pessoa = require('./Pessoa');

class PF extends Pessoa {

#cpf;

setCPF(cpf) {
if (cpf) {
this.#cpf = cpf;
return true;
} else {
return false;
}
}
getCPF() {
return this.#cpf;
}
}
module.exports = PF;

📘 Comentários e Explicações Linha a Linha

Linhas 01--03

Esses comentários apresentam informações gerais sobre o arquivo:

  • nome do arquivo;
  • localização dentro do projeto;
  • objetivo do exemplo, que consiste em demonstrar a utilização da herança juntamente com o encapsulamento e estruturas condicionais.

Linha 04

Importa a classe Pessoa, tornando-a disponível para reutilização.

Essa importação é necessária para que a classe PF possa herdar os atributos e métodos definidos na classe Pessoa.

Linha 05

Declara a classe PF.

A palavra-chave extends estabelece uma relação de herança entre as classes.

Isso significa que PF herda automaticamente todos os métodos públicos da classe Pessoa, como:

  • setNome();
  • getNome();
  • setEmail();
  • getEmail().

Além desses métodos herdados, a classe poderá implementar atributos e métodos próprios.

Linha 06

Declara o atributo privado #cpf.

Esse atributo existe apenas na classe PF e representa uma informação exclusiva de uma Pessoa Física.

Por ser privado, somente poderá ser acessado pelos métodos da própria classe.

Linhas 07--14

Declaram o método setCPF(), responsável por atribuir um valor ao atributo privado #cpf.

Antes de armazenar o valor, o método verifica se o parâmetro recebido possui conteúdo.

Caso a validação seja satisfeita:

  • o valor é armazenado no atributo #cpf;
  • o método retorna true.

Caso contrário:

  • nenhuma alteração é realizada;
  • o método retorna false.

Linhas 15--17

Declaram o método getCPF(), responsável por retornar o valor armazenado no atributo privado #cpf.

Como o atributo é privado, esse método representa a forma adequada de consultar seu conteúdo.

Linhas 18--19

A linha 18 encerra a definição da classe.

Na linha 19, a instrução module.exports = PF; exporta a classe para que ela possa ser utilizada em outros arquivos JavaScript por meio da função require().


📌 Conceitos-Chave Envolvidos


Conceito Explicação


extends Permite que uma classe herde atributos e métodos de outra classe.

Herança Reutilização de código entre classes relacionadas.

#atributo Declara um atributo privado.

Encapsulamento Protege os atributos internos da classe.

setCPF() Método responsável por atribuir um valor ao atributo privado #cpf.

getCPF() Método responsável por consultar o valor armazenado no atributo privado #cpf.

module.exports Exporta a classe para reutilização em outros módulos JavaScript.


💡 Dicas do Professor

A herança deve ser utilizada quando existe uma relação do tipo:

PF é uma Pessoa

Ou seja, uma Pessoa Física possui todas as características de uma Pessoa comum, além de características próprias.


Utilização das Classes -- Arquivo usaPessoas.js

Após criar as classes, podemos instanciá-las e testar seu comportamento.

Para executar:

node ./objetos/usaPessoas.js

💻 Código Completo

Arquivo: usaPessoas.js

 const Pessoa = require('./pessoas/Pessoa');
const PF = require('./pessoas/PF');
const x = new Pessoa();
let resposta = x.setNome('');
console.log(resposta);
if (resposta) {
console.log(x.getNome());
} else {
console.log("Nome vazio");
}
resposta = x.setEmail('vaguetti@gmail.com');
console.log(resposta);
if (resposta) {
console.log(x.getEmail());
} else {
console.log("E-mail vazio");
}
const y = new PF();
resposta = y.setNome('Pedro');
console.log(resposta);
if (resposta) {
console.log(y.getNome());
}
resposta = y.setEmail('');
console.log(resposta);
if (resposta) {
console.log(y.getEmail());
} else {
console.log("Email vazio");
}
resposta = y.setCPF('123456789-10');
console.log(resposta);
if (resposta) {
console.log(y.getCPF());
}

📘 Comentários e Explicações Linha a Linha

Linhas 01--02

Importam as classes Pessoa e PF.

A classe Pessoa representa a classe base, enquanto a classe PF representa uma classe filha que herda métodos da classe Pessoa.

Linha 03

Cria um objeto chamado x a partir da classe Pessoa.

Esse objeto será utilizado para testar os métodos setNome(), getNome(), setEmail() e getEmail().

Linhas 04--05

Executa o método setNome() passando uma string vazia como parâmetro.

Como o valor informado é vazio, o método retorna false.

A linha seguinte exibe esse retorno no terminal.

Linhas 06--10

Verifica o valor da variável resposta.

Como o retorno do método setNome() foi false, a mensagem "Nome vazio" será exibida.

Linhas 11--12

Executa o método setEmail() passando um e-mail preenchido.

Como o valor informado não está vazio, o método retorna true.

Em seguida, esse retorno é exibido no terminal.

Linhas 13--17

Verifica novamente o valor da variável resposta.

Como o retorno foi true, o método getEmail() será executado e exibirá o e-mail armazenado.

Linha 18

Cria um objeto chamado y a partir da classe PF.

Como PF herda de Pessoa, esse objeto poderá utilizar métodos herdados, como setNome(), getNome(), setEmail() e getEmail().

Linhas 19--20

Executa o método setNome() no objeto y, passando o valor "Pedro".

Esse método foi herdado da classe Pessoa.

Como o nome informado possui conteúdo, o método retorna true.

Linhas 21--23

Verifica se a variável resposta é verdadeira.

Como o retorno foi true, o método getNome() é executado e exibe o nome armazenado.

Linhas 24--25

Executa o método setEmail() da classe Pessoa, herdado pela classe PF.

Como foi passada uma string vazia, a validação implementada no método identifica que o valor é inválido e retorna false.

A linha seguinte exibe esse retorno no terminal.

Linhas 26--30

Verifica o conteúdo da variável resposta.

Como o método setEmail() retornou false, o bloco else será executado, exibindo a mensagem:

Email vazio

Esse trecho demonstra como utilizar o valor retornado pelos métodos set para controlar o fluxo do programa.

Linhas 31--32

Executa o método setCPF(), pertencente à classe PF.

Como o valor informado possui conteúdo, a validação é satisfeita, o CPF é armazenado no atributo privado #cpf e o método retorna true.

Na sequência, o retorno é exibido no terminal.

Linhas 33--35

Verifica novamente o conteúdo da variável resposta.

Como o método setCPF() retornou true, o método getCPF() é executado, retornando o CPF armazenado no atributo privado da classe.


📌 Conceitos-Chave Envolvidos


Conceito Explicação


Instanciação Criação de objetos utilizando a palavra-chave new.

Herança Permite reutilizar atributos e métodos da classe Pessoa na classe PF.

Encapsulamento Restringe o acesso direto aos atributos privados da classe.

Getter Método responsável por retornar o valor de um atributo privado.

Setter Método responsável por atribuir valores aos atributos privados.

if/else Estrutura condicional utilizada para controlar o fluxo de execução.

require() Importa módulos JavaScript previamente exportados.

console.log() Exibe informações no terminal durante a execução do programa.


💡 Resumo Final

Nesta apostila foram apresentados os conceitos fundamentais da Programação Orientada a Objetos em JavaScript:

  • Encapsulamento;
  • Atributos privados;
  • Métodos Getters e Setters;
  • Estruturas condicionais para validação;
  • Herança com extends;
  • Reutilização de código;
  • Exportação e importação de módulos;
  • Instanciação e utilização de objetos.

Esses conceitos servem como base para a construção de sistemas mais complexos utilizando JavaScript orientado a objetos.


📚 Exercícios de Fixação