Tony Stark y sus múltiples estados
Published: 2024-01-17 01:09:21

#### Entendiendo los Estados en Aplicaciones Web desde la mirada de un superhéroe.

Los estados desempeñan un papel fundamental en el desarrollo de aplicaciones web, especialmente en bibliotecas y frameworks. Acá no nos limitamos verlo desde un solo lenguaje de programación, ya que el concepto es agnóstico al lenguaje que se ocupe.

Comprender cómo funcionan los estados y manejarlos correctamente es esencial para construir aplicaciones robustas y dinámicas. En este post, exploraremos qué son los estados en el contexto de las aplicaciones web, cómo se pueden gestionar en React y haremos una comparación con de como se implementaría en Elixir (gracias al crack @clsource que cordialmente propuso realizar en conjunto esta comparación entre ambas tecnologías).

**¿Qué son los Estados en Aplicaciones Web?**
En el contexto de las aplicaciones web, el "estado" se refiere a la representación instantánea de la información en un momento dado. En otras palabras, es la condición actual de la aplicación en términos de datos y la interacción del usuario. Los estados pueden cambiar en respuesta a eventos, acciones del usuario o actualizaciones de datos externos.

## Estados en Aplicaciones React
React, siendo una biblioteca de JavaScript para construir interfaces de usuario, utiliza el concepto de estados para gestionar la dinámica de las aplicaciones. En React, el estado es un objeto que representa información que puede cambiar durante la ejecución de un componente.

## ¿Cómo sería en Elixir?

> En Phoenix (Framework Web de Elixir) la gestión de estados
> es mediante la modificación de una estructura "socket" que es
> pasada como parámetro a las distintas funciones.
> Ésta estructura es creada en cada petición por Phoenix. La máquina virtual de Erlang (BEAM) crea un nuevo proceso en cada solicitud, lo que permite una alta concurrencia y robustez al crear aplicaciones web, ya que si falla un proceso no afectará a los otros.
-@clsource 

Ahora, nos vamos al universo cinematográfico de Marvel para entender todo esto.

## La Evolución del Estado de Iron Man

En el universo Marvel, Iron Man es un personaje que experimenta una transformación significativa a lo largo de su historia, lo que puede servir como una analogía interesante para entender el concepto de estados en React y de los procesos en Elixir.

**Estado Inicial - Tony Stark, el Genio Millonario**

En su estado inicial, Tony Stark, el cerebro detrás de Iron Man, es un genio millonario y egocéntrico, más preocupado por la tecnología y el éxito personal que por el bien común. Este estado inicial puede compararse con el estado inicial de un componente **React**, donde los datos y las condiciones son predefinidos.

```jsx
const IronMan = () => {
  const [estado, setEstado] = useState('Genio Millonario');

  return (
    <div>
      <p>Tony Stark está en el estado: {estado}</p>
      {/* Otros componentes y acciones aquí */}
    </div>
  );
};
```

Acá el ejemplo de como declaramos el estado inicial de Tony con **Elixir**

```elixir
defmodule Live.IronMan do
    use Phoenix.LiveView

    def mount(_params, _session, socket) do
        socket = assign(socket, :estado, "Genio Millonario")
        {:ok, socket}
    end

    def render(assigns) do
        ~H"""
            <p>Tony Stark está en el estado: <%= @estado %></p>
            <!-- Otros componentes y acciones aquí -->
        """
    end
end
```

**Cambio de Estado - Transformación de Tony Stark**
Ahora, imaginemos que un evento importante ocurre en la vida de Tony Stark, como su captura por un grupo terrorista. Este evento desencadena una transformación en su carácter y perspectiva, cambiando su estado de "Genio Millonario" a "Héroe Tecnológico".

```jsx
const IronMan = () => {
  const [estado, setEstado] = useState('Genio Millonario');

  const transformar = () => {
    setEstado('Héroe Tecnológico');
  };

  return (
    <div>
      <p>Tony Stark está en el estado: {estado}</p>
      <button onClick={transformar}>¡Transformarse!</button>
    </div>
  );
};

```

Como se ve con Elixir:

```elixir
defmodule Live.IronMan do
  use Phoenix.LiveView

  def mount(_params, _session, socket) do
    socket = assign(socket, :estado, "Genio Millonario")
    {:ok, socket}
  end

  def handle_event("transformar", _params, socket) do
    socket = assign(socket, :estado, "Héroe Tecnológico")
    {:noreply, socket}
  end

  def render(assigns) do
    ~H"""
    <p>Tony Stark está en el estado: <%= @estado %></p>

    <button phx-click="transformar">¡Transformarse!</button>
    """
  end
end
```
**Estado Final - Iron Man, el Vengador**
Después de la transformación, Tony Stark se convierte en Iron Man, un héroe que utiliza su tecnología para luchar contra el mal. Este es su estado final, que puede considerarse como el resultado de una serie de eventos y cambios de estado.

Este ejemplo utiliza **la historia de Iron Man** para ilustrar cómo los estados en las aplicaciones web pueden cambiar a lo largo del tiempo, influenciados por eventos o acciones del usuario. Al igual que Tony Stark, los componentes React y los procesos en Elixir pueden evolucionar y adaptarse a medida que cambian las condiciones en la aplicación. Si quieres conocer un poco mas sobre estados globales, para este tema realicé recientemente un [artículo](https://www.linkedin.com/pulse/comprendiendo-el-context-api-de-react-una-gu%2525C3%2525ADa-martinez-melchor-j7jxe%3FtrackingId=8s1XO9fxTzmtMEcgKuU%252BRw%253D%253D/?trackingId=8s1XO9fxTzmtMEcgKuU%2BRw%3D%3D) en mi newsletter en [linkedIn](https://www.linkedin.com/pulse/comprendiendo-el-context-api-de-react-una-gu%2525C3%2525ADa-martinez-melchor-j7jxe%3FtrackingId=8s1XO9fxTzmtMEcgKuU%252BRw%253D%253D/?trackingId=8s1XO9fxTzmtMEcgKuU%2BRw%3D%3D).

También te invito, si aún no lo haz leido, pasar por el [post](https://dev.to/javascriptchile/elixir-para-reactjs-devs-37db) de @clsource donde nos da [una cátedra](https://dev.to/javascriptchile/elixir-para-reactjs-devs-37db) sobre Elixir para desarrollo web.

Espero te haya gustado esta explicación y que sobre todo lo hayas entendido. Déjame tus comentarios para saber si te gustó o si ya manejas estados en tus aplicaciones. Nos leemos en la próxima.