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.