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 privateno parece tener ningún efecto , todavía puedo llamar Thing.privsin problemas.
ruby
private-methods
access-specifier
Daniel Beardsley
fuente
fuente

privatesolo afecta a los métodos de instancia, no a los métodos de clase. usarprivate_class_methoden su lugar:module Thing; def self.pub; end; private_class_method :pub; endRespuestas:
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
performno es el método que se supone que es privado aquí, el método privado es el método privado en laTranslatorclase (el ejemplo de @ucron no tiene ninguno, lo que es muy desafortunado).GTranslate.translatees sólo un método convenienteGTranslate::Translator#perform, no hay ninguna ganancia real que lo oculte, si es que fuera posible.self.translatedeclara 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 Writeropció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| [...] enden lugar de DEFDesafortunadamente,
privatesolo 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
.fooun método de clase privado: "privado; def self.foo ()"privateyprivate_class_methodson propiedad deModulenotClass. 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
dAquí vemos que:
1)
@@Lno se puede acceder desde el exterior pero es accesible desde casi todas partes2)
class << self ; private ; defhace que el método seadinaccesible desde afuera y desde adentro conself.pero no sin él - esto es extraño3)
private ; self.yprivate ; class << selfno 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_methodes 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
.selfen 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