Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Encapsulamento

É listado no item 8 - "O que aprendemos", o termo "Encapsulamento". Não lembro do professor ter ensinado isso. Poderiam explicar do que se trata?

5 respostas

E aí Rodrigo, beleza?

Encapsulamento serve para deixar menos coisas acessíveis aos programadores para que não acessem uma variável interna e violem regras de negócio por engano.

Por exemplo: Uma variavel local de uma função não é acessível por fora dela. Logo, esta encapsulada:

function xpto() {
    var x = 10;
}

console.log(x); // dá erro!

Outro exemplo usando classe é:

class Pessoa {
    constructor(nome){
        this._nome = nome;
    }

    get getNome () {
        return this._nome;
    }

    set setNome (nome) {
        this._nome = nome;
    }
}

O nome só pode ser acessado fora da class "Pessoa" através dos métodos Get e Set.

Espero ter ajudado.

Bons estudo =)

Entendi a definição. Mas no exemplo dado, não seria possível alterar o valor do atributo digitando :

pessoa._atributo1 = "oi"

?? E a variável x, após executada a função, não passa a existir no escopo global? Ou seja, após executada a função, eu poderia executar o console.log(x). Ou não?

solução!

Obs.: No exemplo utilizando classe eu troquei "atributo1" por "nome", acho que assim fica mais fácil, foi mal kk

No exemplo que eu dei o seu código iria funcionar, já que deixei o nome (antigo atributo1) é público, permitindo acesso fora da classe.

Com o ES9 foi introduzido um jeito de deixar o atributo privado, colocando um # antes do nome. Então fiz mais um exemplo com o atributo privado:

Ps.: Esqueci de comentar mas ao trabalharmos com encapsulamento é comum utilizarmos atributos privados no lugar de público, para manter a integridade do sistema.

class Pessoa {
    #_nome;

    constructor(nome){
        this.#_nome = nome;
    }

    get getNome () {
        return this.#_nome;
    }

    set setNome (nome) {
        this.#_nome = nome;
    }
}

var eu = new Pessoa ('Joel');
console.log(eu.getNome); // retorna 'Joel'

eu.setNome = 'Rodrigo';
console.log(eu.getNome); // agora sim retorna 'Rodrigo'

eu.#_nome = 'Rodrigo'; 
// retorna o erro: private field '#_nome' must be declared in an enclosing class.
// proibindo a utilização e o rename do atributo

Sobre a variavél "x":

Mesmo após executar a função "xpto" o console vai dizer que x is not defined, pois ela está encapsulada dentro do escopo "xpto", fazendo com que ela não exista globalmente.

Obrigado Joel. Ficou esclarecido. Sugiro retirar "encapsulamento" da lista do que foi aprendido na aula dois, visto que o professor Ricardo só menciona o conceito na aula 4.

Oi Joel. Encontrei o trecho em que o professor fala sobre encapsulamento. É bem no final do primeiro vídeo da aula 2. No entanto mantenho minha sugestão de retirar da lista dos itens aprendidos, uma vez que ele somente menciona, mas só explica melhor na aula 4.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software