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

Quando vc passa um novo array

Eu entendi onde você quer chegar passando um array vazio e concatenando ele, mas quando você passa um novo array(no caso é a capia) vc nao vai esta alterando o do constructor ? mas depois voce chama a mesmo metodo , como ele nao chama a copia ? isso é meio confuso, pq era para ele retorna a copia! ou nao ?

10 respostas

Bom dia.

Não sei se compreendi a sua dúvida, mas essa prática se chamada programação defensiva. Quem quiser ler a lista de array recebe uma cópia da lista armazenada. Podem alterar, modificar, seja lá o que quiser que a lista original não será alterada. Então, se não podemos alterar a lista porque recebemos uma cópia, como alterá-la? Os métodos da classe serão os responsáveis por isso, porque em operações de escrita apenas eles terão acesso ao array original, encapsulado pela classe. Dessa maneira, apenas através dos métodos da classe será possível alterar o array encapsulado e não por outra forma.

mas quando ele chama o array, pq nao chama a capia ? pq vc dar return na copia, isso que eu nao entendi,...

Você pode colar o código e sinalizar onde esta sua dúvida? Assim fica mais fácil para eu explicar.

No aguardo.

class NegociacaoController{
    constructor() {
        this._inputData = document.querySelector("#data");
        this._inputQuantidade = document.querySelector("#quantidade");
        this._inputValor = document.querySelector("#valor");
        this._listaNegociacoes = new ListaNegociacao();
    }

    adicionar(event){
        event.preventDefault();
        let data = DateHelper.valorParaData(this._inputData.value);

        let negociacao = new Negociacao(data, this._inputQuantidade.value, this._inputValor.value);

        let anoMesDia = DateHelper.dataParaTexto(negociacao.data);

        this._listaNegociacoes.adiciona(negociacao);
        this._listaNegociacoes.negociacoes.push("negociacao");
        console.log(this._listaNegociacoes.negociacoes);
        this._limpaFormulario();

    }
    _limpaFormulario(){
        this._inputData.value = "";
        this._inputQuantidade.value = 1;
        this._inputValor.value = 0.0;
        this._inputData.focus();
    }
}
class ListaNegociacao{
    constructor(){
        this._negociacoes = [];
    }

    adiciona(negociacao){
        return this._negociacoes.push(negociacao);
    }

    get negociacoes(){

        return [].concat(this._negociacoes);
    }

}

esse get negociacao, ele retorna a copia certo ? mas quando vc chama ele de novo como ela sabe que nao é a copia ? pq no console logo você chama ele!

Sempre é a cópia, quem chama não tem como saber.

get negociacoes(){
       // um getters que retorna sempre um novo array com os dados do array original
        return [].concat(this._negociacoes);
    }

mas quando vc modifica a copia, quando chama ela, ela nao vem modificada ? isso que eu nao estou sabendo lidar !

sério estou com muito dificuldade para entender isso...

desanimando :(

mas quando ele chama a copia, essa mesma copia nao é uma copia do original ? sendo assim era para ele está pegando independente oq você passa ali era para ele te alterado no push

solução!

mas quando vc modifica a copia, quando chama ela, ela nao vem modificada ? isso que eu nao estou sabendo lidar !

Quando você quer modificar o array original deve fazer isso pelo método adiciona. Esse método adiciona a nova negociação no array original _negociacoes. Se você acessar o getter depois de uma chamada ao adiciona, será retornado uma nova cópia do array com o item adicionado pelo adiciona. Se você tentar alterar essa cópia, conseguirá mas isso não alterará _negociacoes encapsulado pela classe.