2012-02-15 12 views
20

¿Cuáles son para usted los pros y los contras de la utilización:¿Cuál es la forma preferida (mejor estilo) para nombrar un espacio de nombres en Ruby? ¿Singular o plural?

FooLib::Plugins 
FooLib::Plugins::Bar 

convenciones vs

FooLib::Plugin 
FooLib::Plugin::Bar 

de nombres? ¿Y qué usarías o qué estás usando? ¿Qué se usa más comúnmente en la comunidad?

+1

Al mirar a [Rails API] (http: //api.rubyonrails .org/classes/ActiveRecord.html), veo que hay más nombres plurales en los módulos que en las clases de espacios de nombres (véase, en la segunda mitad de la página). Sin embargo, no tengo suficiente experiencia con Rails para saber cuándo usar uno y cuándo usar el otro. –

Respuesta

11

Para mí FooLib::Plugins aparece como un módulo, utilizado como un espacio de nombres en el que se guardan 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 complemento. Con FooLib::Plugin::Bar, dudaría si Bar era una clase auxiliar utilizada por Foo::Plugin, o el nombre de un complemento.

+0

Esta es una pregunta general. No apegado a lo que estoy haciendo. Tengo algunas reflexiones sobre este tema y quería ver qué piensan los demás acerca de todo esto. –

+0

¿Qué pasa con FooLib :: Plugins :: Bar vs FooLib :: Plugin :: Bar? - el segundo me parece más como un nombre de objeto -> Bar es un complemento en el FooLib, el primero se ajusta menos a este razonamiento. –

+0

@Jeznet, acabo de editar mi respuesta. –

4

Suponiendo Plugin es una clase base:

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

    Este es el que yo uso y recomiendo. Bar es un Plugin en FooLiby hereda de FooLib::Plugin. También mantiene los plugins proporcionados por el FooLib biblioteca anidada en el espacio de nombres de la clase general, que se lee de forma natural:

    # Assign the Bar Plugin of the FooLib library to p. 
    p = FooLib::Plugin::Bar 
    

    Si tuviera que desarrollar un plugin de terceros para su biblioteca, que crearía la siguiente estructura:

    # Baz is a Plugin for the FooLib library provided by BarLib. 
    class BarLib::FooLib::Plugin::Baz < ::FooLib::Plugin 
    

    Nota que reflejan la jerarquía FooLib, pero bajo BarLib espacio de nombres 's. No lo ampliaría directamente.

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

    También he utilizado éste, y creo que tiene más sentido. Bar se extiende FooLib::Plugin y es uno de los Plugins proporcionado por FooLib. Sin embargo, crea un módulo potencialmente innecesario.

    creo que esto sería una gran opción si Plugins era un repositorio de plugins central que implementa métodos como Plugins.add, Plugins.all y Plugins.loaded.

    Úselo si puede justificar el módulo adicional.

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

    no hace mucho sentido para mí. Bar es uno de los Plugins en FooLib, esa parte se ve bien. Sin embargo, hereda de Plugins. ¿Está heredando de más de un complemento? Me parece extraño; el nombre de la clase no debe sugerir algo que sea imposible.

+1

Muchos puntos buenos hechos, +1. Si los complementos no heredan de una clase base común, 'FooLib :: Plugins' parece muy atractivo. –

1

En general, el enfoque 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 los plugins es una convención encuentra en todo el lugar en los RubyOnRails código base, así como muchos otros. (Por ejemplo ActiveRecord::Base, ActionController::Base, etc.)

estoy de acuerdo con el enfoque de @Matheus Moreira donde se utiliza Foo::Plugin tanto como la clase base y el espacio de nombres para plugins.

La única razón funcional por qué esto no se debe hacer tiene que ver con la convención - en la comunidad Ruby uno encontrará muchos menos instancias de clases como espacios de nombres que los módulos. La única vez que realmente veo las clases utilizadas como espacio de nombres para otra clase es cuando el propósito de dicha clase es privado para la clase de espacio de nombres y no se usa externamente.

15

Uso:

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 unas palabras diferentes:

module FooLib 
    module Plugins 
    class Plugin; end #the base for plugins 
    class Bar < Plugin; end 
    class Bar2 < Plugin; end 
    end 
end 

organizar también los archivos de la siguiente manera:

- foo_lib/ 
    - plugins/ 
    - plugin.rb 
    - bar.rb 
    - bar2.rb 

Ésta es how Rails does it (por lo que este es el Rieles Camino) Es decir. mira el espacio de nombres Asociaciones y la Associations::Association class de la que todas las clases de formar los hereda de espacio de nombres Asociaciones (es decir Associations::SingularAssociation).

1

Me segundo el enfoque esbozado por @jtrim.

Dado que el módulo (es decir Plugin) está siendo utilizado para namespacing solamente, normalmente anular 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(...) 
Cuestiones relacionadas