web-dev-qa-db-fra.com

Quelle est la différence entre «def» et «defp» dans le framework Phoenix?

Je passe en revue le livre Programming Phoenix et je me demande quelle est la différence entre def et defp.

Il y a plusieurs fonctions dans mon contrôleur - la plupart sont des actions comme celle-ci:

def new (conn, _params) do
...
end

Le livre m'a fait créer une autre fonction dans ce contrôleur qui n'est pas une action de contrôleur typique comme celle-ci:

defp user_videos(user) do
...
end

Donc, ma question est de savoir comment savoir quand utiliser defp et quand utiliser def lors de la définition d'une fonction à l'intérieur d'un contrôleur dans le Phoenix Framework.

56
Andrew Hendrie

De documentation d'Elixir sur les fonctions des modules :

À l'intérieur d'un module, nous pouvons définir des fonctions avec def/2 et fonctions privées avec defp/2. Une fonction définie avec def/2 peut être invoqué à partir d'autres modules alors qu'une fonction privée ne peut être invoquée que localement.

Si vous avez d'autres questions, n'hésitez pas à lire cette documentation.

80
josemrb

Donc, ma question est de savoir comment savoir quand utiliser defp et quand utiliser def lors de la définition d'une fonction à l'intérieur d'un contrôleur dans le Phoenix Framework.

Les fonctions def d'un module peuvent être appelées à partir d'autres modules, tandis que les fonctions defp sont privées ou ne peuvent pas être appelées à partir d'autres modules. Comment savoir quand utiliser def et quand utiliser defp? Cela dépend de ce que les autres modules peuvent ou non avoir besoin de savoir. Un modèle de conception courant consiste pour un module à fournir une fonction parent def qui encapsule tout le comportement de ses fonctions defp:

defmodule MyModule do

  def function do
    # call all the defp functions below to do something
  end

  defp function2 do
    # do something that no other module cares about or needs to know about
  end

  defp function3 do
    # do something that no other module cares about or needs to know about
  end

  defp function4 do
    # do something that no other module cares about or needs to know about
  end
end

Voici un exemple de ceci avec un analyseur pour les dépôts SEC: Analyseur de dépôts SEC . La méthode principale def enveloppe toutes les fonctions privées qu'aucun autre module n'a vraiment besoin de connaître.

5
vikram7