usa una tipos tipo sirve que programacion pero para nombres namespace instanciar espacio como comandos codigos clase ruby module namespaces naming-conventions naming

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 un Plugin en FooLib y se hereda de FooLib::Plugin . También mantiene los complementos proporcionados por la biblioteca FooLib 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 de FooLib , pero bajo el espacio de nombres de BarLib . No lo extendería directamente.

  • class FooLib::Plugins::Bar < FooLib::Plugin

    También he usado este, y creo que tiene más sentido. Bar extiende FooLib::Plugin y es uno de los Plugins proporcionados por FooLib . 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 como Plugins.add , Plugins.all y Plugins.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 los Plugins en FooLib , esa parte se ve bien. Sin embargo, hereda de los Plugins . ¿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 ).