programacion objetos metodos manejo lista instanciar herencia ejemplos ejemplo clases clase ruby conventions

objetos - Donde colocar métodos privados en Ruby?



manejo de objetos en ruby (10)

Como otros ya han señalado, la convención es poner los métodos privados en la parte inferior, bajo una clase privada. Sin embargo, probablemente también deberías saber que muchos programadores usan un método de sangría doble (4 espacios en lugar de 2) para esto. La razón es que muchas veces no verá "privado" en su editor de texto y supondrá que podrían ser públicos. Vea a continuación una ilustración:

class FooBar def some_public_method end def another_public_method end private def some_private_method end def another_private method end end

Este método debe evitar que tenga que desplazarse hacia arriba y hacia abajo y hará que otros programadores se sientan más cómodos con su código.

La mayoría de los blogs o tutoriales o libros tienen métodos privados en la parte inferior de cualquier clase / módulo. ¿Es esta la mejor práctica?

Encuentro tener métodos privados cuando sea necesario y más conveniente. Por ejemplo:

public def my_method # do something minion_method end private def minion_method # do something end public def next_method end

De esta forma, encuentro que el código es más legible en lugar de desplazarse hacia arriba y hacia abajo continuamente, lo cual es muy irritante.

¿Hay algo terriblemente mal en este enfoque? ¿Tener métodos privados en la base no es solo una mejor práctica y algo más?


Creo que los métodos públicos son una especie de interfaz del objeto, y es lógico colocarlos en el lugar más destacado, es decir, en la parte superior del archivo.


Dennis tuvo la respuesta perfecta, es decir, cuando se usa ruby> = 2.1, simplemente prefija la definición con privado (o protegido, público)

Pero creo que ahora también es posible usar private as a block como en:

private begin def foo end def bar end end def zip end


Es una cuestión de gustos, supongo, pero preferiría nombrar explícitamente cada método privado en la línea después de dicho método, así:

class Example def cthulhu end def rlyeh end def foo end private :foo def bar end private :bar def baz end private :baz end


La mejor práctica en mi punto de vista es ir secuencialmente y declarar sus métodos sin mantener la privacidad en el punto de vista.

Al final, puede hacer que cualquier método sea privado simplemente agregando: private :xmethod

Ejemplo:

class Example def xmethod end def ymethod end def zmethod end private :xmethod, :zmethod end

¿Esto justifica tu pregunta?


No es necesario que publique public o private sobre cada método. Usualmente pongo todos mis métodos privados al final de mi clase. Además, no es necesario decir explícitamente public ya que los métodos son públicos por defecto. Por ejemplo:

class FooBar def some_public_method end def another_public_method end private def some_private_method end def another_private method end end


No me gusta tener que especificar pública o privada para cada método. Poner todos los métodos privados en la parte inferior me permite tener una única instancia de "privado" por archivo. Supongo que es una cuestión de gusto.


También existe la opción de anteponer privacidad a la definición de método desde Ruby 2.1.

class Example def xmethod end private def ymethod end private def zmethod end end

Al observar la definición, usted sabe instantáneamente si un método es privado, sin importar en qué parte del archivo esté definido. Es un poco más tipeo (si no se autocompleta) y no todas sus def estarán bien alineadas.


Un estilo es agrupar métodos juntos para que solo use private y protected una vez por clase como máximo. Otro estilo es especificar la visibilidad justo después de la definición del método:

class Example def my_private_method end private :my_private_method def my_public_method end end

A partir de Ruby 2.1.0 def devuelve el nombre del método como un símbolo, por lo que es posible un estilo más simplificado:

class Example private def my_private_method end def my_public_method end protected def my_protected_method end private_class_method def self.my_private_class_method end end

(Tenga en cuenta que usamos private_class_method para los métodos de clase; de ​​lo contrario, obtendríamos el NameError: undefined method porque private espera un método de instancia. Incluso cuando lo usa como una macro como en el ejemplo original, solo afecta la visibilidad de los métodos de instancia).

Me gusta más este estilo de visibilidad en línea, ya que le permite organizar los métodos que desee. Disminuye el riesgo de agregar un nuevo método en el lugar incorrecto y de hacerlo inadvertidamente haciéndolo privado.

En cuanto a la sintaxis del método de clase, puedes manejarlo de esta manera:

class Example private def my_private_method end class << self private def my_private_class_method end end end


Vengo del fondo de Java y odio tener que desplazarme para ver el tipo de método. Creo que es una locura que uno no puede especificar la visibilidad del método por método sin fealdad. Así que terminé poniendo un comentario #private antes de cada método de succión y luego declaro private :...