8
votes

Que devriez-vous et ne devrait-il pas être dans un fichier d'en-tête erlang (.hrl)?

Je suis un peu confus sur quel fichier .hrl doit être utilisé pour. Je crois comprendre que les fichiers .hrl peuvent contenir n'importe quel code Erlang valide et que l'utilisation de la directive -include insérer essentiellement le code dans le .hrl . fichier dans n'importe quel module qui comprend.

Quel type de code est approprié de mettre dans ces fichiers .hrl , alors? Les règles de programmation d'Erlang indiquent les éléments suivants en matière de registres:

Si l'enregistrement doit être utilisé dans plusieurs modules, sa définition doit être placée dans un fichier d'en-tête (avec suffixe .hrl) incluse dans les modules.

En conséquence, j'ai formé l'habitude de le faire dans mon code. Cependant, j'aime mettre des choses telles que des fonctions d'instanciation et de comparaison pour des enregistrements, ainsi que des définitions de type, dans mes en-têtes également (puisque c'est le genre de chose que je ferais dans c). Est-ce mauvais forme? Les types doivent-ils être exportés à partir d'un fichier .erl plutôt, même s'ils sont utilisés dans plusieurs modules? Il semble n'y avoir aucune documentation sur les meilleures pratiques concernant les en-têtes Erlang disponibles.


0 commentaires

3 Réponses :


11
votes

Comme c, l'instruction include ajoute littéralement le contenu du fichier fourni dans le fichier ERL. Par conséquent, mettre tout code réel dans les fichiers HRL entraînera la copie de ce code partout que vous l'inclurez. Cela conduirait à une duplication inutile de la fonctionnalité dans chaque module Erlang.

Je placerais tout code Erlang réel dans son propre module ERL, ainsi que toutes les définitions d'enregistrement, les spécifications de type ou les macros courantes dans les fichiers HRL. Les définitions d'enregistrement et les spécifications de type ne sont pas compilées dans les fichiers binaires. Ils sont donc sans danger pour inclure dans plusieurs fichiers.


0 commentaires

4
votes

J'utilise des fichiers HRL pour stocker divers appareils à utiliser dans mes tests de l'unité. Je n'aime pas les utiliser dans le code de production réel pour quoi que ce soit. Avoir la même fonction importée dans différents emplacements, il est difficile de raisonner sur le code. Il est plus préférable de simplement avoir ce code dans un module séparé et de l'exporter explicitement. Les types peuvent également être exportés explicitement avec la directive -export_type.

Je n'aime même pas partager des enregistrements avec elle (même si c'est le seul moyen de partager des archives). Pour cela, je préfère avoir un module ne gérer que cette méthode avec des fonctions d'obtention et de définition appropriées. Les enregistrements partagés sont une catastrophe en attente de se produire et rend les mises à niveau de code plus délicieuses.

En bref, ne les utilisez pas pour rien d'important.


0 commentaires

5
votes

Généralement, vous mettez des choses dans un .hrl que vous souhaitez partager entre les modules, généralement les définitions d'enregistrement et les macros. Les choses qui sont censées être purement locales à un module que vous ne mettriez pas dans un fichier .hrl . Donc, une définition d'enregistrement purement locale, par exemple l'état local d'un serveur, n'irait pas dans un .hrl mais uniquement dans le module définissant le serveur. Même avec les définitions de macro. Vous devriez toujours éviter inutilement l'exposition des informations internes.

Comme le fichier Include est directement inséré dans le fichier incluant, tout code contenu dans celui-ci sera dupliqué dans chaque module qui comprend. Vous ne voulez généralement pas faire cela.


0 commentaires