Sobes.tech
Junior

Pentru ce sunt folosite modulele în Ruby?

sobes.tech AI

Răspuns de la AI

Modulele în Ruby sunt utilizate pentru două scopuri principale:

  1. Namespaces (Spații de nume): Organizarea codului pentru a preveni conflictele de nume. Permite gruparea claselor, metodelor și constantelor legate sub un singur nume. Acest lucru ajută la evitarea situațiilor în care două clase sau metode diferite au același nume.

    # module_for_namespace.rb
    module FrameworkulMeu
      class Validare
        def validează(date)
          # logică de validare
        end
      end
    end
    
    # alt_fisier.rb
    # Pentru a folosi Validare din FrameworkulMeu:
    validare = FrameworkulMeu::Validare.new
    validare.validează("anumite date")
    
  2. Mixins (Amestecuri): Mecanism pentru partajarea funcționalității (metode) între mai multe clase fără a folosi moștenirea clasică. Modulele sunt incluse în clase cu include sau prepend.

    • include: Metodele modulului sunt disponibile în instanțele clasei și pot fi suprascrise în clasa însăși. Căutarea metodelor urmează ordinea: clasa curentă, modul inclus, superclase.
    • prepend: Inserează modulul înaintea clasei în lanțul de moștenire. Metodele modulului au prioritate față de cele ale clasei.

    Exemplu de utilizare a include:

    # mixin_module.rb
    module Loggable
      def log(mesaj)
        puts "[LOG] #{mesaj}"
      end
    end
    
    # class_using_mixin.rb
    class ClasaMea
      include Loggable # Inclus modulul Loggable
    
      def procesează_date
        log("Procesare date...") # Folosește metoda din modul
        # logică suplimentară
      end
    end
    
    obj = ClasaMea.new
    obj.procesează_date
    

    Exemplu de utilizare a prepend:

    # mixin_module.rb
    module ModulPrependat
      def salut
        puts "Salut din modul!"
      end
    end
    
    # class_with_prepend.rb
    class ClasaPrepend
      prepend ModulPrependat # Modul precede clasa în lanțul de moștenire
    
      def salut
        puts "Salut din clasă!"
      end
    end
    
    obj = ClasaPrepend.new
    obj.salut # Va afișa "Salut din modul!" deoarece metoda din modul are prioritate
    

Modulele nu pot fi instantiate (nu se poate crea un obiect de modul) și nu au un lanț de moștenire în același sens ca și clasele.