Sobes.tech
Junior

Waarvoor worden modules in Ruby gebruikt?

sobes.tech AI

Antwoord van AI

Modules in Ruby worden voor twee hoofddoeleinden gebruikt:

  1. Namespaces (Naamruimtes): Organisatie van code om naamconflicten te voorkomen. Ze stellen je in staat gerelateerde klassen, methoden en constanten onder één naam te groeperen. Dit helpt te voorkomen dat twee verschillende klassen of methoden dezelfde naam hebben.

    # module_for_namespace.rb
    module MijnFramework
      class Validator
        def validate(data)
          # validatielogica
        end
      end
    end
    
    # andere_bestand.rb
    # Om Validator van MijnFramework te gebruiken:
    validator = MijnFramework::Validator.new
    validator.validate("enkele data")
    
  2. Mixins (Mengen): Mechanisme om functionaliteit (methoden) te delen tussen meerdere klassen zonder gebruik te maken van klassieke overerving. Modules worden ingeladen in klassen met include of prepend.

    • include: De methoden van de module zijn beschikbaar in de instanties van de klasse en kunnen worden overschreven in de klasse zelf. De zoekvolgorde is: huidige klasse, ingeladen module, superklassen.
    • prepend: Plaatst de module vóór de klasse in de overervingsketen. De methoden van de module hebben prioriteit boven die van de klasse.

    Voorbeeld van gebruik van include:

    # mixin_module.rb
    module Loggable
      def log(bericht)
        puts "[LOG] #{bericht}"
      end
    end
    
    # class_using_mixin.rb
    class MijnKlasse
      include Loggable # Module opnemen
    
      def process_data
        log("Verwerking van data...") # Methode uit module gebruiken
        # overige logica
      end
    end
    
    obj = MijnKlasse.new
    obj.process_data
    

    Voorbeeld van gebruik van prepend:

    # mixin_module.rb
    module MijnPrependModule
      def groet
        puts "Hallo van module!"
      end
    end
    
    # class_with_prepend.rb
    class MijnPrependKlasse
      prepend MijnPrependModule # Module komt vóór de klasse in de overervingsketen
    
      def groet
        puts "Hallo van klasse!"
      end
    end
    
    obj = MijnPrependKlasse.new
    obj.groet # Zal "Hallo van module!" afdrukken, omdat de methode uit het module prioriteit heeft
    

Modules kunnen niet worden geïnstantieerd (je kunt geen object van een module maken) en hebben geen overervingsketen zoals klassen.