2
respostas

Programação defensiva

Olá. Eu não compreendi muito bem o uso da programação defensiva no código foi criada um instância dentro da instância para não alterar a data porém ao final da linha solicitei a alteração funcionou ( oi seja, executou a alteração da data )

usando no construtor o this._daa = new Date(data.getTime()); , não teria que manter a data orginal mesmo comandando por fora uma alteração na data? seguem as linhas de comando Obrigado

class Negociacao{  
    constructor (data, quantidade, valor){
        this._data = new Date(data.getTime()); // criando uma nova instancia a partir do tempo de uma data
        this._quantidade = quantidade;
        this._valor = valor;

        Object.freeze(this); // congela a instância do objeto 
     }

     get volume(){
         return this._quantidade * this._valor;
     }

     get data(){
         return this._data;
     }

     get quantidade() {
         return this._quantidade;

     }
     get valor(){
         return this._valor;
     }
}
var negociacao = new Negociacao(new Date(), 1, 100);
negociacao.data.setDate(negociacao.data.getDate()+2);
console.log(negociacao.data);
2 respostas

Fala Jorge, tudo bem?

Primeiramente nos desculpe pela demora da resposta, mas o que acontece é que você colocou uma nova instância de Date somente no construtor, como dito pelo instrutor, o que também deve ser feito no retorno do getter data para que nos retorne uma nova instância e não o objeto original, assim:

class Negociacao{  
    constructor (data, quantidade, valor){
        this._data = new Date(data.getTime()); // criando uma nova instancia a partir do tempo de uma data
        this._quantidade = quantidade;
        this._valor = valor;

        Object.freeze(this); // congela a instância do objeto 
     }

     get volume(){
         return this._quantidade * this._valor;
     }

     get data(){
         return new Date(this._data); //Aqui criamos uma instância
     }

     get quantidade() {
         return this._quantidade;

     }
     get valor(){
         return this._valor;
     }
}

Dessa maneira não estaremos modificando o nosso objeto original.

Espero ter ajudado, bons estudos :D

boa tarde Matehus , obrigado pela resposta