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 :...