Retour au cours

organisation du code : require et require_relative

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 require pour charger les gems et les fichiers de la bibliothèque standard de Ruby.
  • Utilisez require_relative pour 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::Commande devrait se trouver dans lib/ecommerce/commande.rb.

Exercices

  1. 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.rb et vérifiez que le résultat s’affiche correctement.
  2. Module partagé :

    • Créez un fichier lib/salutations.rb qui définit un module Salutations contenant une méthode dire_bonjour.
    • Créez un fichier principal app.rb qui :
      1. Charge le module avec require_relative.
      2. Définit une classe Personne qui include le module Salutations.
      3. Crée une instance de Personne et appelle la méthode dire_bonjour.
  3. 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.