Sobes.tech
Middle

É possível implementar a mesma funcionalidade numa classe que num módulo?

sobes.tech IA

Resposta da IA

Em Ruby, os módulos (module) e as classes (class) têm propósitos diferentes, embora ambos possam conter métodos e constantes.

  • Módulos destinam-se a agrupar métodos, constantes e outros módulos sem a capacidade de criar instâncias. São frequentemente usados para mixins (incluir funcionalidades em classes através de include ou extend).

  • Classes permitem criar objetos (instâncias), têm construtores e podem ser herdadas.

Pode-se implementar a funcionalidade de um módulo numa classe, mas isso significaria que, para aceder aos métodos, é necessário criar uma instância da classe, o que nem sempre é conveniente ou lógico. Os módulos permitem adicionar métodos diretamente ao espaço de nomes ou à classe sem criar um objeto.

Exemplo:

module Greetings
  def greet
    puts "Hello!"
  end
end

class Person
  include Greetings
end

Person.new.greet # => Hello!

Se tentar substituir um módulo por uma classe, para chamar greet, precisa criar um objeto:

class Greetings
  def greet
    puts "Hello!"
  end
end

g = Greetings.new
g.greet # => Hello!

Portanto, embora seja tecnicamente possível, usar módulos para mixins e agrupamento de métodos é mais semânticamente correto e conveniente.