Tengo una pregunta de dos partes
Mejores prácticas
- Tengo un algoritmo que realiza alguna operación en una estructura de datos usando la interfaz pública
- Actualmente es un módulo con numerosos métodos estáticos, todos privados excepto el método de interfaz pública.
- Hay una variable de instancia que debe compartirse entre todos los métodos.
Estas son las opciones que puedo ver, ¿cuál es la mejor ?:
- Módulo con métodos estáticos ('módulo' en ruby)
- Clase con métodos estáticos
- Módulo Mixin para su inclusión en la estructura de datos
- Refactorice la parte del algoritmo que modifica esa estructura de datos (muy pequeña) y conviértala en una mezcla que llame a los métodos estáticos del módulo de algoritmo
Parte técnica
¿Hay alguna forma de hacer un método de módulo privado ?
module Thing
def self.pub; puts "Public method"; end
private
def self.priv; puts "Private method"; end
end
El private
no parece tener ningún efecto , todavía puedo llamar Thing.priv
sin problemas.
ruby
private-methods
access-specifier
Daniel Beardsley
fuente
fuente
private
solo afecta a los métodos de instancia, no a los métodos de clase. usarprivate_class_method
en su lugar:module Thing; def self.pub; end; private_class_method :pub; end
Respuestas:
Creo que la mejor manera (y principalmente cómo se escriben las bibliotecas existentes) para hacer esto es creando una clase dentro del módulo que se ocupa de toda la lógica, y el módulo solo proporciona un método conveniente, por ejemplo
fuente
perform
no es el método que se supone que es privado aquí, el método privado es el método privado en laTranslator
clase (el ejemplo de @ucron no tiene ninguno, lo que es muy desafortunado).GTranslate.translate
es sólo un método convenienteGTranslate::Translator#perform
, no hay ninguna ganancia real que lo oculte, si es que fuera posible.self.translate
declara un método de clase / módulo.GTranslate::Translator.new.perform(text)
- ¡Enrevesado, pero no privado!También está
Module.private_class_method
, que posiblemente expresa más intención.Para el código en la pregunta:
Ruby 2.1 o más reciente:
fuente
private
?fuente
include Writer
opción!Puede usar el método "incluido" para hacer cosas elegantes cuando se mezcla un módulo. Esto hace lo que quiere, creo:
fuente
included do |base| [...] end
en lugar de DEFDesafortunadamente,
private
solo se aplica a los métodos de instancia. La forma general de obtener métodos privados "estáticos" en una clase es hacer algo como:Es cierto que no he jugado con hacer esto en módulos.
fuente
.foo
un método de clase privado: "privado; def self.foo ()"private
yprivate_class_method
son propiedad deModule
notClass
. Por cierto, este código funciona y es la alternativa a usarprivate_class_method
.Una buena forma es así
fuente
¿Qué pasa con el almacenamiento de métodos como lambdas dentro de variables / constantes de clase?
Para la prueba:
UPD: la gran actualización de este código después de 6 años muestra una forma más limpia de declarar un método privado
d
Aquí vemos que:
1)
@@L
no se puede acceder desde el exterior pero es accesible desde casi todas partes2)
class << self ; private ; def
hace que el método sead
inaccesible desde afuera y desde adentro conself.
pero no sin él - esto es extraño3)
private ; self.
yprivate ; class << self
no hace que los métodos sean privados - ambos son accesibles con y sinself.
fuente
Proc
, mientras que los métodos son de tipoMethod
.Hacer un módulo o clase privados
Las constantes nunca son privadas. Sin embargo, es posible crear un módulo o una clase sin asignarlo a una constante.
Entonces, una alternativa
:private_class_method
es crear un módulo o clase privados y definir métodos públicos en él.Uso:
Consulte los documentos de Module.new y Class.new .
fuente
.self
en las definiciones del método, incluirlo en otra clase y usarlos como método_instancia de la clase incluida. ¿Sabes si hay alguna forma de hacerlo funcionar?Este método no permitirá compartir datos con los métodos privados a menos que pase explícitamente los datos por los parámetros del método.
fuente