Métodos Privados y protegidos de Ruby: Entendiendo la visibilidad del método

¿Qué es un método privado en Ruby?

Es un tipo de método que SOLO se puede llamar desde dentro de la clase donde está definido.

Esto le permite controlar el acceso a sus métodos.

Un método Ruby puede ser:

  • privado
  • público (predeterminado)
  • protegido

De forma predeterminada, TODOS los métodos son public.

¡Cualquiera puede usarlos!

Pero puede cambiar esto, haciendo un método private o protected.

¿por Qué es útil?

Porque puede hacer que estos métodos sean más fáciles de cambiar.

Imagine que está escribiendo una biblioteca de código que se va a usar en algunos proyectos diferentes en el trabajo.

Cuando estos proyectos implementen su biblioteca, llamarán a métodos en las clases que ha creado.

Ahora:

de liberar una nueva versión…

Pero decidieron cambiar el nombre de un public método.

¡Eso producirá errores en cada proyecto que use este método!

Recuerde esto:

Al tener MENOS métodos públicos, AUMENTA la libertad de cambio dentro de su clase.

¡Veamos algunos ejemplos de código!

Comprender los métodos privados en Ruby

¿Alguna vez ha visto el mensaje de error «método privado llamado»?

Este:

self.puts 123# NoMethodError: private method `puts' called

Entonces ha intentado usar un método private incorrectamente.

Solo puede usar un método privado por sí mismo.

Ejemplo:

puts 123

Es el mismo método, pero hay que llamarlo así.

Los métodos privados siempre se llaman dentro del contexto de self.

En otras palabras

Solo puede usar métodos privados con:

  • Otros métodos de la misma clase
  • Métodos heredados de la clase padre
  • Métodos incluidos desde un módulo

Esto significa que no puede llamar a métodos privados desde fuera de la clase que los define.

Porque eso requeriría un «receptor explícito».

A menos que…

Use un método como send para omitir esta regla.

send(:puts, "apple")

¿Cómo se define un método private?

def bacon "private bacon"endprivate :bacon

La palabra private en sí no es una palabra clave, es un método definido en el módulo Kernel.

Dónde colocar los Métodos Privados

Es normal que una clase tenga más de un método privado.

¿Dónde se colocan estos métodos?

Haga esto:

class Food def public_method end private def bacon end def orange end def coconut endend

Cada método de instancia después de private se convierte en un método privado.

Puede usar private_class_method :method_name si desea definir un método de clase como privado

Es un patrón común definir primero todos sus métodos públicos, luego definir sus métodos private juntos al final de la clase.

Métodos públicos

Público es la visibilidad de método predeterminada en Ruby.

Este es un ejemplo:

def orange "Vitamin C"end

Si tienes un objeto food que define orange, puedes llamarlo así:

food.orange

Si un método se ha hecho privado o protegido, puede volver a hacerlo público.

public :orange

¿Qué es Un Método Protegido?

Los métodos protegidos son menos comunes.

Son como métodos private, pero puede llamarlos en un objeto & no solo directamente.

Si prueba este ejemplo con private, obtendrá un error:

class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :nameendfood = Food.new("chocolate")puts food == food

Obtienes el error porque name sería privado, por lo que no puedes hacer other.name.

Pero con protected ¡este código funciona!

Métodos privados vs Protegidos

Esa es la diferencia, el hecho de que protected mantiene el método private, pero también le permite llamar a ese método en un objeto.

Con privado solo puedes hacer name, con protegido puedes hacer object.name.

¿Cuándo debe usar protected?

Solo si tiene un caso muy específico, como el método equals (==).

La documentación de Ruby recomienda usar private en lugar de protected siempre que sea posible.

Y hay esta nota:

«Un método protegido es lento porque no puede usar caché en línea.»

Tenía curiosidad por esto, así que corrí algunos puntos de referencia:

public: 2813891.9 i/sprivate: 2699273.8 i/sprotected: 2572122.0 i/s

Esa es una diferencia del 8,5% en el rendimiento.

Tutorial en vídeo

Resumen

Ha aprendido sobre los métodos protegidos de visibilidad, públicos y privados del método Ruby &. Estas no son palabras clave Ruby, son métodos definidos en la clase Module.



+