Objectifs
- Comprendre la nécessité de séparer son code en plusieurs fichiers.
- Charger une librairie externe (gem) ou un fichier de la bibliothèque standard avec
require. - Charger un fichier de votre propre projet avec
require_relative. - Comprendre le rôle du
$LOAD_PATH.
Le problème du fichier unique
Lorsque vous travaillez sur un projet, même petit, il devient très vite ingérable de tout mettre dans un seul et même fichier. Pour garder le code organisé, lisible et maintenable, on le sépare en plusieurs fichiers, chacun ayant une responsabilité claire (par exemple, un fichier par classe ou par module).
Ruby fournit deux commandes principales pour charger le contenu d’un fichier dans un autre.
require : Charger depuis le “Load Path”
require est la méthode la plus courante. Lorsque vous faites require 'nom_fichier', Ruby ne cherche pas n’importe où. Il parcourt une liste de dossiers prédéfinis pour trouver nom_fichier.rb. Cette liste est stockée dans une variable globale : $LOAD_PATH (ou son alias $:).
Le $LOAD_PATH contient par défaut les dossiers de la bibliothèque standard de Ruby et les dossiers où les “gems” (librairies externes) sont installées.
# Charger la librairie pour faire des requêtes HTTP (qui fait partie de la bibliothèque standard)
require 'net/http'
# Charger une gem que vous avez installée (ex: gem install colorize)
require 'colorize'
puts "Ce texte est en rouge".colorize(:red)
Point important : require est intelligent. Il ne chargera chaque fichier qu’une seule fois. Si vous appelez require 'net/http' dix fois, le fichier ne sera lu et interprété que la première fois.
require_relative : Charger par rapport au fichier courant
Pour charger les fichiers de votre propre projet, require_relative est souvent plus simple. Il ne cherche pas dans le $LOAD_PATH, mais dans un chemin relatif au fichier où la commande est écrite.
Exemple de structure de projet
mon_projet/
├── lib/
│ └── calculatrice.rb
└── main.rb
Fichier lib/calculatrice.rb :
# lib/calculatrice.rb
class Calculatrice
def additionner(a, b)
a + b
end
end
Fichier main.rb :
# main.rb
# On charge le fichier 'calculatrice.rb' qui se trouve
# dans le dossier 'lib' par rapport à notre position actuelle.
require_relative 'lib/calculatrice'
# Maintenant, la classe Calculatrice est disponible
calc = Calculatrice.new
puts calc.additionner(5, 3) # => 8
Bonnes pratiques
- Utilisez
requirepour charger les gems et les fichiers de la bibliothèque standard de Ruby. - Utilisez
require_relativepour charger les différents fichiers de votre propre application. C’est plus explicite et ne dépend pas de la configuration du$LOAD_PATH. - Organisez votre code dans un dossier
lib(pour “library”). C’est une convention très forte dans l’écosystème Ruby. - La structure de vos dossiers devrait idéalement correspondre à celle de vos modules (voir la leçon sur les modules). Par exemple, la classe
ECommerce::Commandedevrait se trouver danslib/ecommerce/commande.rb.
Exercices
-
Créer un projet multi-fichiers :
- Créez la structure de dossier et les deux fichiers (
main.rb,lib/calculatrice.rb) de l’exemple ci-dessus. - Exécutez
ruby main.rbet vérifiez que le résultat s’affiche correctement.
- Créez la structure de dossier et les deux fichiers (
-
Module partagé :
- Créez un fichier
lib/salutations.rbqui définit un moduleSalutationscontenant une méthodedire_bonjour. - Créez un fichier principal
app.rbqui :- Charge le module avec
require_relative. - Définit une classe
Personnequiincludele moduleSalutations. - Crée une instance de
Personneet appelle la méthodedire_bonjour.
- Charge le module avec
- Créez un fichier
-
Utiliser une gem :
- Ouvrez votre terminal et installez une librairie amusante :
gem install colorize. - Créez un script qui
require 'colorize'et qui affiche des chaînes de différentes couleurs, comme dans l’exemple au début de la leçon.
- Ouvrez votre terminal et installez une librairie amusante :