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

Ajuda para entender a lógica

Oi pessoal. Não estou conseguindo compreender a lógica da criação do array instanciado na classe ListaNegociacoes.

Na minha cabeça, o que está acontecendo é o seguinte: Cada instancia da classe NegociacaoController cria uma nova instância da classe ListaNegociacoes. Então para mim o que deveria acontecer na lógica é que cada negociação adicionada acabaria criando um novo objeto da ListaNegociacoes, virando um array separado. Porém o que acontece é a criação de um único array, que vai recebendo os push's de cada nova negociação. Por que isso está funcionando?

EDIT: Acho que entendi mais ou menos. Lá no index a variável negociacaoController está recebendo um novo objeto NegociacaoController, e depois a variável está sendo chamada pelo form para executar a função adiciona(event). Por isso, o objeto está sendo criado apenas uma vez, e cada vez que envio o form, ele atualiza os valores das propriedades e manda para dentro do array. É isso? Nesse caso, com um formulário eu posso ficar utilizando apenas uma instância do controller para ir adicionando as negociações.

Arquivo NegociacaoController:
class NegociacaoController {

    constructor() {

        // coletando os dados com construtor para varrer o DOM uma só vez

        let $ = document.querySelector.bind(document);
        this._inputData = $('#data');
        this._inputQuantidade = $('#quantidade');
        this._inputValor = $('#valor');
        this._listaNegociacoes = new ListaNegociacoes();

    }

    adiciona(event) {

        //evitando que o botao de refresh na pagina
        event.preventDefault();

        this._listaNegociacoes.adiciona(this._criaNegociacao());
        this._limpaFormulario();
        console.log(this._listaNegociacoes.negociacoes);

    }

    _criaNegociacao() {
        return new Negociacao(
            DateHelper.textoParaData(this._inputData.value),
            this._inputQuantidade.value,
            this._inputValor.value);

    }

    _limpaFormulario() {
        this._inputData.value = '';
        this._inputQuantidade.value = 1;
        this._inputValor.value = 0.0;
        this._inputData.focus();
      }

}

Arquivo ListaNegociacoes
class ListaNegociacoes {

    constructor() {
        this._negociacoes = [];
    }

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

    get negociacoes() {
        return this._negociacoes;
    }
}
3 respostas

Fala ai Caio, tudo bem? Vamos lá:

Cada instancia da classe NegociacaoController cria uma nova instância da classe ListaNegociacoes.

É isso mesmo.

Então para mim o que deveria acontecer na lógica é que cada negociação adicionada acabaria criando um novo objeto da ListaNegociacoes, virando um array separado

Na verdade não, isso porque dentro da função adiciona da NegociacaoController está sendo criada uma nova Negociacão e passada para a função adiciona da ListaNegociacoes que por sua vez vai realizar o push para dentro do array da mesma.

Porém o que acontece é a criação de um único array, que vai recebendo os push's de cada nova negociação. Por que isso está funcionando?

Exatamente, o array é criando ao instanciar a classe ListaNegociacoes depois disso, a função adiciona vai receber uma nova Negociacão e realizar o push para o array.

Espero ter ajudado.

Então cada vez que eu aciono o botao de cadastrar nova negociação, ele não cria uma nova instancia da Lista, apenas dá um push no array dela, isso? Tanto a instancia do controller quanto da lista são criados lá no index apenas uma vez.

Agora, se eu criar uma nova instância de ambos, ai vai gerar um novo array?

solução!

Fala Caio, vamos lá:

Então cada vez que eu aciono o botao de cadastrar nova negociação, ele não cria uma nova instancia da Lista, apenas dá um push no array dela, isso?

É isso mesmo, isso porque a função que será chamada ao clicar no cadastrar, será essa:

adiciona(event) {
        //evitando que o botao de refresh na pagina
        event.preventDefault();

        this._listaNegociacoes.adiciona(this._criaNegociacao());
        this._limpaFormulario();
        console.log(this._listaNegociacoes.negociacoes);
}

Ela usa a lista já existente, apenas cria uma nova Negociacao para a lista realizar o push.

Tanto a instancia do controller quanto da lista são criados lá no index apenas uma vez.

Exatamente, é isso mesmo.

Agora, se eu criar uma nova instância de ambos, ai vai gerar um novo array?

Sim, se você criar uma nova instância da NegociacaoController já vai gerar uma nova instância da lista e array também.

Espero ter ajudado.