DROPS - Javascript e imutabilidade
Você só sofre com isso por que não conhece Javascript e também não conhece bem o conceito de instancia.
Relembrando o drops é o onde eu falo o que eu quero sem muita pesquisa, jogo um pouco do que conheço e do que acho, com base no que já vivi e lembro, posso estar enganado. Estamos aqui para aprender :)
Estou lendo um artigo onde a pessoa reclama da imutabilidade do Javascript, essa é uma reclamação constante e mostra para mim na hora quem conhece e quem não conhece Javascript. É triste alguém assim submeter uma proposta para a TC39, pelo menos eu acho, mas beleza, se quiser entender ler é sobre algumas definições que levaram a escrita do Temporal Proposal.
Instancia em Javascript
Vamos falar sobre objetos, já escrevi algo mais aprofundado e que precisar se ainda mais aprofundando quando falei sobre referencias, voltando ao ponto sobre instancia.
A instancia é um conceito que parece que se perdeu do nada e ninguém mais lembra dela, com a programação funcional a galera esquece que javascript tem o pé Orientação a Objeto e esquece objetos instancias e objetos literais. Eu sei esse conceito não aparece em outras linguagens eu acho...
Mas falando de instancia ela é quando você materializa um definição de um objeto. Um objeto literal é um dicionário pronto para ser usado, diferente de um objeto instanciado. Com esse conceito em mente, vamos lembrar que a instancia de um objeto pode ter funções que alteram as propriedades do objeto, logo ao usar uma função em que ela modifica uma propriedade, essa propriedade é mutável.
E quanto fazemos uma instancia de objeto? Quando chamamos o objeto usando o new
.
Agora indo no exemplo do artigo linkado no começo, se temos uma instancia da data, ao usar um setMonth
ele deve mudar a data do meu objeto instanciado com new Date()
.
Para ficar mais claro, segue o exemplo do artigo.
Você usou uma função que modifica a data, você esperava o que? Que o software jogasse uma flor na tela? Eu concordo que em objetos literais imutabilidade é importante, mas não na instancia.
Não compreender a instancia em Javascript causa problemas e também não compreender que objetos literais também são mutáveis. Preciso explicar? Talvez no futuro...
Resolvendo a treta de mutabilidade
Primeiro pergunto é necessário?
Vamos o ponto mais importante, se você está mudando a propriedade de um objeto, saiba lidar com isso. Mudar propriedades gera efeitos colaterais e isso é um problema que programação funcional tenta evitar, porém o paradigma de Javascript é orientado...
Mas digamos que preciso da data intacta e outra que vou mudar, então entenda os comportamentos e os efeitos colaterais. Vamos usar o exemplo acima, se queremos preservar o resultado da chamada do toISOString()
, basta declarar ele em uma constante, assim você tem a String preservada e o objeto pode ser modificado. Vamos ver código:
const date = new Date();
const isoDate = date.toISOString(); // "2017-04-05T05:57:53.350Z"
date.setMonth(11) // você modificou uma propriedade é por sua conta e risco
date.toISOString() // "2017-12-05T05:57:53.350Z"
// Porém...
const dateFixed = new Date(isoDate);
dateFixed.toISOString() // "2017-04-05T05:57:53.350Z"
Claro que o dateFixed
do exemplo ele é mutavel, mas a string isoDate não é, graças ao const
que é recente em Javascript, mas ajuda a enteder o ponto. Quando crio o new Date(isoDate)
, consigo gerar uma nova instancia que não sofre efeito colateral das mudanças do objeto date
.
Em linhas gerais a questão de imutabilidade no Javascript ela sempre vai acontecer para objetos com setters
são para isso eles server, modificar uma propriedade de um objeto. Saber trabalhar com objetos é importante também em Javascript.
No exemplo que temos com datas e setMonth
, sempre que ele é usado alteramos a instancia do date
, entender que podemos criar uma outra instancia limpa ajudar também a evitar os problemas e preservar informações.
Sabe como fazemos para transferir liquidos de dois copos cheios? Pegamos um terceiro copo. – Professora Luciana, SENAI Vicente Amato 2007, aulas de lógica de programação.
É isso galera, lembra instancias podem ser mutáveis e podem ter efeitos colaterais, saber lidar com isso evita problemas.
Se você concorda, discorda, encontrou algum erro, pode acrescentar em algo, só me falar no twitter.
https://en.wikipedia.org/wiki/Instance_(computer_science)
Photo by Daria Shevtsova from Pexels