• Imutabilidade significa que valores uma vez criados não podem ser alterados e que identificadores uma vez atribuídos não podem ser mudados.

    • Por isso, quando precisamos mudar um valor, é necessário criar um novo valor baseado no valor anterior.
  • Imutabilidade tem um grande número de efeitos colaterais positivos, incluindo execução assíncrona segura e maior facilidade de entender a lógica de funções.

Warning: One of the key concepts of functional programming is immutability. This not only makes programs easier to reason about, but also allows for compiler optimizations. To simulate this immutability, in Go, you will tend to copy lots of structures that will lead to non optimal performance. ==The reason functional programming languages gets away with this is exactly because they can rely on the immutability and always point to the old values, instead of copying them again==. https://betterprogramming.pub/monads-for-go-programmers-6cda2b978cb1

Como no código abaixo, a lista numbers com os valores [3..1] é diferente de moreNumbers que tem os valores de [4..1] atualizados. Note que a lista original não é alterada, pois valores imutáveis nunca são mudados:

OCaml:

let numbers = [3;2;1]
let moreNumbers = 4 :: numbers

A versão idiomática em linguagens imperativas como Java é diferente: o valor de numbers pode ser modificado a qualquer hora:

Java:

var numbers = new ArrayList<int> {1,2,3};
numbers.add(4);

Em Java numbers não é a lista [1;2;3], é apenas um identificador que aponta para esses valores momentaneamente e é esse acoplamento temporal de um identificador ao seu(s) valor(es) que faz com que esse tipo de código seja perigoso, já que em Java não basta saber que esse identificador numbers é atrelado a esses valores, é necessário também saber todas as alterações feitas nesse valor para conseguir saber seu valor no atual momento.


🌱 Back to Garden