Elixir - Comportements

Les comportements dans Elixir (et Erlang) sont un moyen de séparer et d'abstraire la partie générique d'un composant (qui devient le module de comportement) de la partie spécifique (qui devient le module de rappel). Les comportements permettent de -

  • Définissez un ensemble de fonctions qui doivent être implémentées par un module.
  • Assurez-vous qu'un module implémente toutes les fonctions de cet ensemble.

Si vous le devez, vous pouvez penser à des comportements comme des interfaces dans des langages orientés objet comme Java: un ensemble de signatures de fonction qu'un module doit implémenter.

Définir un comportement

Prenons un exemple pour créer notre propre comportement, puis utilisons ce comportement générique pour créer un module. Nous allons définir un comportement qui salue les gens bonjour et au revoir dans différentes langues.

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

le @callbackdirective est utilisée pour lister les fonctions que l'adoption de modules devra définir. Il spécifie également le non. d'arguments, leur type et leurs valeurs de retour.

Adopter un comportement

Nous avons défini avec succès un comportement. Nous allons maintenant l'adopter et l'implémenter dans plusieurs modules. Créons deux modules implémentant ce comportement en anglais et en espagnol.

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

Lorsque le programme ci-dessus est exécuté, il produit le résultat suivant -

Hello Ayush
Goodbye, Ayush
Hola Ayush
Adios Ayush

Comme vous l'avez déjà vu, nous adoptons un comportement utilisant le @behaviourdirective dans le module. Nous devons définir toutes les fonctions implémentées dans le comportement pour tous les modules enfants . Cela peut à peu près être considéré comme équivalent aux interfaces dans les langages POO.