3
respostas

reescrever o getter ou o constuctor

olá, eu entendi a necessidade de utilizar a programação defensiva, mas eu não entendo por que é preciso fazer isso tanto no constructor quanto no getter. no meu codigo:

class Negociacao {
    constructor(data, quantidade, valor) {
        this._data = new Date(data.getTime());
        this._quantidade = quantidade;
        this._valor = valor;

        Object.freeze(this); // precisa tornar data um objeto blindado, tambem no get? 
    }

    get data() {
        return this._data;
    }
    get quantidade() {
        return this._quantidade;
    }
    get valor() {
        return this._valor;
    }
    get Volume() {
        return this._quantidade * this._valor;
    }
}

eu montei somente no constructor e não consigo quebrar isso, então me parece efetivo o suficiente? em casos mais complexos que seria util montar no getter tambem?

3 respostas

Oi, Lucien, tudo bem?

No construtor são inicializados nossos atributos da classe, nesse caso data, quantidade, valor, são esses atributos que serão acionados pelo gete esses atributos estão com a convenção que os impede de ser acessados fora da sua instância de classe, que o _ (uso do underline). O que o get faz é permitir o acesso desses atributos. Então, quando quiser acessar os aributos da classe Negociacao serão acessados pelo get.

Mas a programação defensiva, de fazer :

this._data = new Date(data.getTime());

o professor faz a mesma coisa no get data:

get data() {
        return new Date(this._data.getTime());
    }

e eu gostaria de saber por que, ou se ja está protegido somente no constructor.

Oi, Lucien!

No construtor, o professor define os atributos da classe, mas eles ainda são acessíveis, mesmo usando a convenção _ e o Object.freeze(this), então, para evitar qualquer tipo de mutabilidade da nossa classe, criamos um getter onde iremos retornar uma nova instância da data e por ser uma instância, não implicará em mudanças em nossa classe. Assim, quando a propriedade data for acessada, será retornada uma data igual a que foi adicionada na nossa negociação.