una - ¿Cuál es la forma preferida(mejor estilo) para nombrar un espacio de nombres en Ruby? ¿Singular o plural?
tipos de namespace (5)
En general, el enfoque que tiendo a tomar es:
module Foo
module Plugin
class Base; end
end
end
class Foo::Plugin::Bar < Foo::Plugin::Base; end
La clase Base
para complementos es una convención que se encuentra en todo el lugar en el código base de RubyOnRails, así como en muchos otros. (por ejemplo, ActiveRecord::Base
, ActionController::Base
, etc.)
No estoy de acuerdo con el enfoque de @Matheus Moreira donde Foo::Plugin
se usa como la clase base y el espacio de nombres para los complementos.
La única razón funcional por la que no se debe hacer esto tiene que ver con la convención: en la comunidad de Ruby uno encontrará muchos menos ejemplos de clases como espacios de nombres que como módulos. La única vez que realmente veo clases usadas como espacio de nombres para otra clase es cuando el propósito de dicha clase es privado a la clase de espacio de nombres y no se usa externamente.
¿Cuáles son para ti los pros y los contras de usar:
FooLib::Plugins
FooLib::Plugins::Bar
contra
FooLib::Plugin
FooLib::Plugin::Bar
¿convenciones de nombres? ¿Y qué usarías o qué estarías usando? ¿Qué se usa más comúnmente en la comunidad?
Me gustaría secundar el enfoque descrito por @jtrim.
Dado que el módulo (es decir, el complemento) se usa solo para el espacio de nombres, normalmente anulo el nuevo método en el módulo:
module Foo
module Plugin
def self.included(base)
raise "cannot be included"
end
def self.extended(base)
raise "cannot extend"
end
def self.new(*args)
Base.new(*args)
end
class Base;end
end
end
base_plugin_obj = Foo::Plugin.new(...)
Para mí, FooLib::Plugins
aparece como un módulo, utilizado como un espacio de nombres en el que se mantienen varias clases de complementos. FooLib::Plugin
parece una superclase para los complementos de FooLib.
En FooLib::Plugins::Bar
, Bar
definitivamente parece ser el nombre de un plugin. Con FooLib::Plugin::Bar
, sería dudoso que Bar
fuera una clase auxiliar utilizada por Foo::Plugin
, o el nombre de un complemento.
Suponiendo que el Plugin
es una clase base:
class FooLib::Plugin::Bar < FooLib::Plugin
Este es el que yo uso y recomiendo.
Bar
es unPlugin
enFooLib
y se hereda deFooLib::Plugin
. También mantiene los complementos proporcionados por la bibliotecaFooLib
anidados bajo el espacio de nombres de la clase general, que se lee naturalmente:# Assign the Bar Plugin of the FooLib library to p. p = FooLib::Plugin::Bar
Si tuviera que desarrollar un complemento de terceros para su biblioteca, crearía la siguiente estructura:
# Baz is a Plugin for the FooLib library provided by BarLib. class BarLib::FooLib::Plugin::Baz < ::FooLib::Plugin
Tenga en cuenta que
FooLib
jerarquía deFooLib
, pero bajo el espacio de nombres deBarLib
. No lo extendería directamente.class FooLib::Plugins::Bar < FooLib::Plugin
También he usado este, y creo que tiene más sentido.
Bar
extiendeFooLib::Plugin
y es uno de losPlugins
proporcionados porFooLib
. Sin embargo, crea un módulo potencialmente innecesario.Creo que esta sería una gran opción si
Plugins
fuera un repositorio central de complementos que implementa métodos comoPlugins.add
,Plugins.all
yPlugins.loaded
.Úsalo si puedes justificar el módulo extra.
class FooLib::Plugins::Bar < FooLib::Plugins
No tiene mucho sentido para mí.
Bar
es uno de losPlugins
enFooLib
, esa parte se ve bien. Sin embargo, hereda de losPlugins
. ¿Es heredado de más de un plugin? Me suena extraño; El nombre de la clase no debe sugerir algo que es imposible.
Utilizar:
module FooLib end
module FooLib::Plugins end
class FooLib::Plugins::Plugin; end #the base for plugins
class FooLib::Plugins::Bar < FooLib::Plugins::Plugin; end
class FooLib::Plugins::Bar2 < FooLib::Plugins::Plugin; end
o en otras palabras:
module FooLib
module Plugins
class Plugin; end #the base for plugins
class Bar < Plugin; end
class Bar2 < Plugin; end
end
end
También arregla los archivos así:
- foo_lib/
- plugins/
- plugin.rb
- bar.rb
- bar2.rb
Así es como lo hace Rails (así es como Rails Way). Es decir, el espacio de nombres de las Asociaciones y la clase Asociaciones :: Asociación de la que todas las clases forman el espacio de nombres de las Asociaciones heredadas (es decir, Associations::SingularAssociation ).