As vezes somos agraciados com algumas ideias estranhas.
Uma área que eu sempre tive muito interesse é a astronomia. Frequentemente estou consumindo conteúdos dessa esfera, seja por vídeo ou texto.
Dentre a quantidade de coisas que existem dentro da área, algo que me desperta o interesse em particular é o tempo, ou, melhor dizendo, como o tempo funciona dentro do espaço.
É um tema constantemente abordado por cientistas e criadores, com muito conteúdo espalhado por aí, como a teoria da floresta negra ou We Traveled Back in Time. Now Physicists Are Angry.
Contudo, entre as incríveis teorias já criadas, existe uma em específico que calha muito bem com o assunto desse post.
O Demônio de Laplace
Imagine ter o conhecimento da posição e velocidade de todas as partículas do universo, bem como todas as forças que atuam sobre elas. Com todas essas informações em mãos, calcule as variáveis e tenha o resultado do que seria o passado e o futuro.
Foi isso que o astrônomo francês Pierre-Simon Laplace propôs quando criou a teoria do Demônio de Laplace, um universo que pode ser determinado do começo ao fim.
Então se o passado e o futuro existem, o universo é como uma timeline linear de eventos.
Essa teoria dita o universo de uma forma determinista, controlado. Além dessa, a ideia de estarmos vivendo em uma simulação também é uma delas, visto que o “criador” pode definir os estados dos simulados.
React e o conceito de estado
O React.js surgiu trazendo diversas ideias interessantes para o desenvolvimento web. Uma dessas ideias é o conceito de controle de estado. Eventos geram um novo estado da aplicação. As informações não se transformam, elas são criadas novamente em um novo estado.
name = "Ana";
function getName() {
return name;
}
Usando como base esse pseudo-código, se alterarmos a variável Ana para Pedro, não só a viarável será alterada, mas a função getName também. Ainda é a mesma função, que faz a mesma coisa, porém agora com uma nova referência.
name = "Pedro";
// Mesmo que não tenha sido alterada, essa é uma nova função
function getName() {
return name;
}
Agora a aplicação tem um novo estado. O estado antigo é passado, e tudo a partir de agora é novo.
Isso acaba criando a ideia de uma aplicação feita de snapshots. Cada novo estado gera uma “foto” do momento atual da aplicação. Essa ideia pode ser representada de várias formas, mas podemos ver algo nesse formato:
[
{
name: "Ana",
getName: function
},
{
name: "Pedro",
getName: function
}
]
Dessa forma conseguimos entender que os estados não tem depêndencia entre si, um estado depende apenas de si mesmo para funcionar. Existe um cenário onde podemos ter todos os estados definidos do começo ao fim, e um cenário onde geramos novos estados a partir do atual via eventos, porém, sem depêndencia.
Nota: Por problemas computacionais (e com o JavaScript) existem algumas técnicas para fugir desse conceito, principalmente por causa de performance. Contudo, vamos imaginar que na estrutura do universo esses problemas já tenham sido resolvidos.
Como é feita a renderização com React
Com a ideia de snapshots em mente, imagine que cada renderização é o resultado do estado daquele momento.
Usando o navegador como exemplo, esse resultado pode ser uma página na internet. Também podemos imaginar como sendo um aplicativo, ou, em teoria, qualquer coisa.
Sempre que surgir um novo estado, a renderização será aplicada mais uma vez, criando o conceito de re-render. No nosso exemplo de uma página na internet, o resultado dessa renderização (página) seria um reflexo do novo estado.
Onde tudo se encontra
Creio que nessa altura você já tenha pegado a ideia. Se pudermos computar todas as equações do universo, teríamos uma representação do estado presente, passado e futuro.
Talvez essa ideia seja assustadora, mas, em um cenário extremamente impossível, existe a chance de nós sermos um arquivo JSON (ou Protobuf, se achar melhor).
Se colocarmos isso em termos práticos, seria algo assim:
{
...,
milkyWay: {
atomsLocation: [...]
}
}
Obviamente não faço ideia de como seria a estrutura de algo assim, mas poderia ser um objeto de tamanho (quase) infinito dizendo as posições dos átomos naquele momento.
Assim sendo, poderíamos usar o React para criar componentes e renderizar o universo.
import { BlackMatter, Galaxy } from "components/universe";
export function UniverseWrapper() {
const data = {...};
return (
<BlackMatter>
{data.galaxies.map((galaxyData) => <Galaxy data={galaxyData}>)}
</BlackMatter>
);
};
Mesmo que os estados não tenham dependência entre si, o univero não é estático.
Caso o universo fosse definido do começo ao fim, teríamos uma matriz linear de estados onde eventos acontecem um após o outro.
Caso os estados sejam criados a partir de eventos, todas as constantes do universo já estariam pré-estabelecidas e o novo estado seria calculado usando essas variáveis.
A viagem no tempo é possível?
A ideia de mesclar viagem no tempo com React não é de hoje, Redux trouxe essa ideia e vários artigos usam do termo para explicar a biblioteca.
Dessa forma, é totalmente possível imaginarmos esse cenário. Para isso, precisamos pegar os nós que até então eram independentes e ligar uns com os outros. Com os nós apontando as direções chegamos em uma estrutura de Linked List.
[
{
node: 7,
name: "Ana",
getName: function,
prevNode: 6,
nextNode: 8
},
{
node: 8,
name: "Pedro",
getName: function,
prevNode: 7,
nextNode: 9
}
]
Independente da posição dos nós, seria possível apontar o universo para algum nó específico e saber qual é o passado e o futuro a partir daquele ponto.
Usando a teoria do Demônio de Laplace é difícil imaginar a viagem no tempo, porque uma vez que todas as variáveis são conhecidas, o evento de que alguém viajaria no tempo também já foi previsto e computado.
Porém, para nosso cenário, podemos expandir o conceito e imaginar um universo simulado, onde alguém determinou um estado inicial com todas as regras do universo e deixou que as coisas fossem continuadas a partir desse ponto.
Brincadeira tem hora
De um ponto científico, é impossível disso ser verdade. De um ponto de vista estusiasta, é impossível disso ser verdade.
Talvez explicar alguns conceitos é mais legal quando aplicados em outras áreas. Isso diz bastante sobre o modelo do React, que funciona em muitos mais lugares do que só na web.
O universo ainda é um mistério, e provavelmente não vai ser resolvido com React.
…certo?