Elixir - Comportamentos

Comportamentos em Elixir (e Erlang) são uma maneira de separar e abstrair a parte genérica de um componente (que se torna o módulo de comportamento) da parte específica (que se torna o módulo de retorno de chamada). Os comportamentos fornecem uma maneira de -

  • Defina um conjunto de funções que devem ser implementadas por um módulo.
  • Certifique-se de que um módulo implemente todas as funções desse conjunto.

Se for necessário, você pode pensar em comportamentos como interfaces em linguagens orientadas a objetos, como Java: um conjunto de assinaturas de função que um módulo deve implementar.

Definindo um comportamento

Vamos considerar um exemplo para criar nosso próprio comportamento e, em seguida, usar esse comportamento genérico para criar um módulo. Vamos definir um comportamento que cumprimente as pessoas com um alô e um adeus em diferentes idiomas.

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

o @callbackdiretiva é usada para listar as funções que os módulos de adoção precisarão definir. Ele também especifica o não. de argumentos, seu tipo e seus valores de retorno.

Adotando um comportamento

Definimos um comportamento com sucesso. Agora vamos adotá-lo e implementá-lo em vários módulos. Vamos criar dois módulos implementando esse comportamento em inglês e espanhol.

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")

Quando o programa acima é executado, ele produz o seguinte resultado -

Hello Ayush
Goodbye, Ayush
Hola Ayush
Adios Ayush

Como você já viu, adotamos um comportamento usando o @behaviourdiretiva no módulo. Temos que definir todas as funções implementadas no comportamento para todos os módulos filhos . Isso pode ser considerado aproximadamente equivalente a interfaces em linguagens OOP.