Sobes.tech
Junior

À quoi servent les modules en Ruby?

sobes.tech IA

Réponse de l'IA

Les modules en Ruby sont utilisés pour deux objectifs principaux:

  1. Namespaces (espaces de noms) : Organisation du code pour éviter les conflits de noms. Ils permettent de regrouper des classes, méthodes et constantes liées sous un même nom. Cela aide à éviter la situation où deux classes ou méthodes différentes ont le même nom.

    # module_for_namespace.rb
    module MonFramework
      class Validateur
        def valider(données)
          # logique de validation
        end
      end
    end
    
    # autre_fichier.rb
    # Pour utiliser Validateur de MonFramework:
    validateur = MonFramework::Validateur.new
    validateur.valider("des données")
    
  2. Mixins (mélanges) : Mécanisme pour partager des fonctionnalités (méthodes) entre plusieurs classes sans utiliser l'héritage classique. Les modules sont inclus dans les classes avec include ou prepend.

    • include : Les méthodes du module sont disponibles dans les instances de la classe et peuvent être redéfinies dans la classe elle-même. La recherche de méthodes suit l'ordre : classe courante, module inclus, superclasses.
    • prepend : Insère le module dans la chaîne d'héritage avant la classe. Les méthodes du module ont priorité sur celles de la classe.

    Exemple d'utilisation de include :

    # mixin_module.rb
    module Loggable
      def log(message)
        puts "[LOG] #{message}"
      end
    end
    
    # class_using_mixin.rb
    class MaClasse
      include Loggable # Inclure le module Loggable
    
      def traiter_données
        log("Traitement des données...") # Utilise la méthode du module
        # autre logique
      end
    end
    
    obj = MaClasse.new
    obj.traiter_données
    

    Exemple d'utilisation de prepend :

    # mixin_module.rb
    module MonModulePrependu
      def saluer
        puts "Bonjour du module!"
      end
    end
    
    # class_with_prepend.rb
    class MaClassePrepend
      prepend MonModulePrependu # Le module précède la classe dans la chaîne d'héritage
    
      def saluer
        puts "Bonjour de la classe!"
      end
    end
    
    obj = MaClassePrepend.new
    obj.saluer # Affichera "Bonjour du module!" car la méthode du module a priorité
    

Les modules ne peuvent pas être instanciés (on ne peut pas créer un objet d'un module) et n'ont pas de chaîne d'héritage dans le même sens que les classes.