Elixir - Comportamientos

Los comportamientos en Elixir (y Erlang) son una forma de separar y abstraer la parte genérica de un componente (que se convierte en el módulo de comportamiento) de la parte específica (que se convierte en el módulo de devolución de llamada). Los comportamientos proporcionan una forma de:

  • Definir un conjunto de funciones que debe implementar un módulo.
  • Asegúrese de que un módulo implemente todas las funciones de ese conjunto.

Si es necesario, puede pensar en comportamientos como interfaces en lenguajes orientados a objetos como Java: un conjunto de firmas de funciones que un módulo tiene que implementar.

Definición de un comportamiento

Consideremos un ejemplo para crear nuestro propio comportamiento y luego usemos este comportamiento genérico para crear un módulo. Definiremos un comportamiento que saluda a las personas con el saludo y el adiós en diferentes idiomas.

defmodule GreetBehaviour do
   @callback say_hello(name :: string) :: nil
   @callback say_bye(name :: string) :: nil
end

los @callbackLa directiva se usa para enumerar las funciones que los módulos de adopción necesitarán definir. También especifica el no. de argumentos, su tipo y sus valores de retorno.

Adoptar un comportamiento

Hemos definido con éxito un comportamiento. Ahora lo adoptaremos e implementaremos en múltiples módulos. Creemos dos módulos implementando este comportamiento en inglés y español.

defmodule GreetBehaviour do
   @callback say_hello(name :: string) :: nil
   @callback say_bye(name :: string) :: nil
end

defmodule EnglishGreet do
   @behaviour GreetBehaviour
   def say_hello(name), do: IO.puts("Hello " <> name)
   def say_bye(name), do: IO.puts("Goodbye, " <> name)
end

defmodule SpanishGreet do
   @behaviour GreetBehaviour
   def say_hello(name), do: IO.puts("Hola " <> name)
   def say_bye(name), do: IO.puts("Adios " <> name)
end

EnglishGreet.say_hello("Ayush")
EnglishGreet.say_bye("Ayush")
SpanishGreet.say_hello("Ayush")
SpanishGreet.say_bye("Ayush")

Cuando se ejecuta el programa anterior, produce el siguiente resultado:

Hello Ayush
Goodbye, Ayush
Hola Ayush
Adios Ayush

Como ya ha visto, adoptamos un comportamiento utilizando el @behaviourdirectiva en el módulo. Tenemos que definir todas las funciones implementadas en el comportamiento para todos los módulos secundarios . Esto puede considerarse aproximadamente equivalente a las interfaces en los lenguajes de programación orientada a objetos.