Articles

Ruby: Load vs. Require vs. Include

En tant que débutant dans n’importe quoi, il est important non seulement de pratiquer ce que vous pourriez commencer, mais aussi d’étudier le travail de personnes plus avancées dans le domaine. En tant que personne relativement novice en programmation, j’aime lire le code des programmeurs à tous les niveaux, juste pour découvrir différentes approches de problèmes similaires.

Une différence flagrante que j’ai remarquée entre mon code et le code des programmeurs plus avancés est la structure des fichiers et le nombre de fichiers, mais si vous voulez mettre une étiquette dessus, ils pratiquaient la séparation des préoccupations, et je ne l’étais pas.Je savais que c’était un concept important en programmation informatique, mais, pour être honnête, la chose qui me fait le plus trébucher dans la pratique du SoC est que je n’étais tout simplement pas à l’aise d’utiliser Load, Require et Include — aka, les choses qui lient les fichiers de votre programme ensemble, et rendent le SoC tellement plus facile à implémenter.

Jetons un coup d’œil en coulisses à ces trois méthodes et à la façon dont elles peuvent faire passer vos programmes au niveau supérieur.

Include

Celui-ci est assez simple. Si vous avez écrit plusieurs classes qui partagent des méthodes similaires, vous pouvez extraire ces méthodes dans un module. Une fois que les méthodes sont écrites dans le module, vous pouvez « inclure » ce module dans l’une des classes qui pourraient avoir besoin d’appeler ces méthodes. Pas besoin de garder ces méthodes en suspens. Voici un court exemple de la façon dont vous l’écririez:

class Chocolate
include IceCream
endclass Vanilla
include IceCream
endmodule IceCream
def ice_cream
end
end

Maintenant, les deux classes ont accès à la méthode ice_cream grâce à l’utilisation de include.

Load

Alors que include montre comment nous pouvons utiliser la fonctionnalité use d’une autre classe Ruby, voyons comment load a une fonctionnalité similaire, mais au lieu de spécifier des classes, nous spécifions des fichiers de notre répertoire de projet. Ceci, et notre méthode suivante, require, permettent à un programme d’avoir une séparation des préoccupations avec seulement quelques lignes supplémentaires en haut de votre fichier (s).

L’idée de base avec SoC est de résumer un aspect de votre programme afin qu’il ne fasse vraiment qu’une chose. Nous le faisons lorsque nous refactorisons le code afin que nos méthodes et fonctions ne fassent qu’une seule chose. Il en va de même pour nos fichiers.

La chose à retenir avec load est que le fichier que vous transmettez sera effectivement chargé à chaque appel. Donc, si vous avez une bibliothèque de fonctionnalités que vous espérez utiliser, rappelez-vous que chaque fois que le fichier dépendant est appelé, le fichier transmis à load est également chargé. Si, pour une raison quelconque, un fichier de votre application / programme change dynamiquement et est utilisé comme dépendance à d’autres fichiers, vous devriez envisager d’utiliser load. Sinon, load peut avoir des effets négatifs sur les performances de votre application en raison du nombre de fois où le fichier est chargé.

Require

Require ressemble beaucoup à load, mais la principale différence est que require ne chargera le fichier transmis qu’une seule fois, puis se souviendra que le fichier a été chargé. Pour cette raison, require est l’option la plus populaire lorsque vous utilisez des bibliothèques tierces dans votre programme ou application. Attendez une minute, bibliothèques tierces? Ça sonne comme… des pierres précieuses ! C’est vrai ! Une fois que vous installez une gemme dans votre répertoire ou que vous la spécifiez dans votre fichier Gemm, il vous suffit d' »exiger » cette gemme en haut du fichier en utilisant les fonctionnalités de cette gemme. C’est du gâteau.

Maintenant, je sais que requirepeut sembler un peu de magie rubis, alors découvrons le héros méconnu dans tout cela: $LOAD_PATH.

$LOAD_PATH est une variable globale fournie avec Ruby. Si vous chargez IRB à partir de votre terminal et tapez $LOAD_PATH, vous obtiendrez quelque chose qui ressemble à ceci:


C’est juste un tableau de chemins absolus. Et lorsque vous installez une gemme, Ruby ajoute les chemins absolus de ces bibliothèques de gemmes à votre $LOAD_PATH. Cela a plus de sens non? Ruby peut simplement appeler la fonctionnalité que require demande car il a déjà le chemin absolu pour le stocker dans $LOAD_PATH.

J’espérais utiliser ce post comme un moyen d’explorer davantage pourquoi nous utiliserions ces méthodes et comment elles nous aident à devenir de meilleurs développeurs. Si vous êtes intéressé par plus de « comment » ces méthodes fonctionnent, des recherches supplémentaires peuvent être nécessaires.