Sobes.tech
Junior

За шта се користе модули у Ruby-ју?

sobes.tech АИ

Одговор од АИ

Moduli u Rubyju se koriste za dva glavna cilja:

  1. Namespaces (Prostori imena): Organizacija koda radi sprečavanja konflikata imena. Omogućavaju grupisanje povezanih klasa, metoda i konstanti pod jednim imenom. Ovo pomaže da se izbegnu situacije gde dve različite klase ili metode imaju isto ime.

    # module_for_namespace.rb
    module MojFramework
      class Validator
        def validate(podaci)
          # logika validacije
        end
      end
    end
    
    # drugi_fajl.rb
    # Za korišćenje Validatora iz MojFramework:
    validator = MojFramework::Validator.new
    validator.validate("neki podaci")
    
  2. Mixins (Mešavine): Mehanizam za deljenje funkcionalnosti (metoda) između više klasa bez korišćenja klasičnog nasleđivanja. Moduli se uključuju u klase pomoću include ili prepend.

    • include: Metode modula su dostupne u instancama klase i mogu biti prepisane u samoj klasi. Pretraga metoda prati redosled: trenutna klasa, uključen modul, superklase.
    • prepend: Umeće modul pre klase u lanac nasleđivanja. Metode modula imaju prioritet nad metodama klase.

    Primer korišćenja include:

    # mixin_module.rb
    module Loggable
      def log(poruka)
        puts "[LOG] #{poruka}"
      end
    end
    
    # class_using_mixin.rb
    class MojaKlasa
      include Loggable # Uključujemo modul Loggable
    
      def obrada_podataka
        log("Obrada podataka...") # Koristimo metodu iz modula
        # ostala logika
      end
    end
    
    objekat = MojaKlasa.new
    objekat.obrada_podataka
    

    Primer korišćenja prepend:

    # mixin_module.rb
    module MojPrependModul
      def pozdrav
        puts "Zdravo iz modula!"
      end
    end
    
    # class_with_prepend.rb
    class MojaPrependKlasa
      prepend MojPrependModul # Modul prethodi klasi u lancu nasleđivanja
    
      def pozdrav
        puts "Zdravo iz klase!"
      end
    end
    
    objekat = MojaPrependKlasa.new
    objekat.pozdrav # Ispisaće "Zdravo iz modula!" jer metoda iz modula ima prioritet
    

Moduli se ne mogu instancirati (ne može se napraviti objekat modula) i nemaju lanac nasleđivanja u istom smislu kao klase.