39 - Objetos: modificador de acceso a métodos

Uno de los principios fundamentales de la programación orientada a objetos es el encapsulamiento, esto se logra agrupando una serie de métodos y atributos dentro de una clase.

Hay tres modificadores que podemos utilizar cuando declaramos un método: public, privare y protected.

Por defecto cuando declaramos un método si no indicamos alguno de estos modificadores se define de tipo public.

Los método públicos se pueden llamar desde donde definimos objetos de dicha clase.

Los métodos privados solo se pueden llamar dentro de la misma clase y lo protected se pueden llamar dentro de la misma clase y subclases.

Problema 1:

Plantear una clase llamada Dado. Definir un atributo valor y tres métodos uno privado que dibuje una línea de asteriscos y otro dos públicos, uno que genere un número aleatorio entre 1 y 6 y otro que lo imprima llamando en este último al que dibuja la línea de asteriscos.

Programa: ejercicio154.rb

class Dado 
  
  def tirar
    @valor = 1 + rand(6)
  end

  def imprimir
    puts @valor
    separador
  end

  private

    def separador
      puts "*" * 50
    end

end

dado1 = Dado.new
dado1.tirar
dado1.imprimir

Los dos primeros métodos de la clase Dado son públicos ya que no antecedemos a los mismos alguno de los modificadores de acceso, se podría haber codificado con esta otra sintaxis:

class Dado 

  public  

    def tirar
      @valor = 1 + rand(6)
    end

    def imprimir
      puts @valor
      separador
    end

En forma explícita disponemos la palabra clave public, luego de esto todos los métodos que indiquemos más abajo serán públicos hasta que aparezca otro modificador de acceso.

Con la palabra clave private logramos que todos los métodos que le siguen serán privados y no se pueden llamar desde fuera de la clase.

  private

    def separador
      puts "*" * 50
    end

Desde fuera de la clase solo se pueden llamar los métodos públicos de la clase:

dado1 = Dado.new
dado1.tirar
dado1.imprimir

Se producirá un error si tratamos de llamar al método "separador":

dado1.separador # private method `separador' called for # (NoMethodError)

Pero cualquier método de la clase Dado puede llamar al método separador, en nuestro ejemplo lo llamamos desde imprimir:

  def imprimir
    puts @valor
    separador
  end

Acotaciones

Hay otra sintaxis para definir si un método es de tipo públic, protected o private en Ruby:

Programa: ejercicio155.rb

class Dado 

  def tirar
    @valor = 1 + rand(6)
  end

  def imprimir
    puts @valor
    separador
  end

  def separador
    puts "*" * 50
  end

  public :tirar, :imprimir
  private :separador

end

dado1 = Dado.new
dado1.tirar
dado1.imprimir

Con esta sintaxis declaramos todos los métodos sin indicar ningún modificador de acceso y al final de la clase enumeramos cuales de esos métodos son public, protected y private:

  public :tirar, :imprimir
  private :separador