在Ruby中命名名称空间的首选方式(更好的样式)是什么?单数还是复数?

在Ruby中命名名称空间的首选方式(更好的样式)是什么?单数还是复数?,ruby,module,namespaces,naming-conventions,naming,Ruby,Module,Namespaces,Naming Conventions,Naming,使用以下各项的优缺点是什么: FooLib::Plugins FooLib::Plugins::Bar vs 命名约定?你会用什么或者你在用什么?comunity中更常用的是什么?对我来说傻瓜ib::Plugins看起来像一个模块,用作保存各种插件类的名称空间傻瓜ib::Plugin看起来像傻瓜ib插件的超类 在傻瓜ib::Plugins::Bar中,Bar显然像插件的名称。对于傻瓜ib::Plugin::Bar,我怀疑Bar是Foo::Plugin使用的助手类,还是插件的名称。假设Plugi

使用以下各项的优缺点是什么:

FooLib::Plugins
FooLib::Plugins::Bar
vs


命名约定?你会用什么或者你在用什么?comunity中更常用的是什么?

对我来说
傻瓜ib::Plugins
看起来像一个模块,用作保存各种插件类的名称空间<代码>傻瓜ib::Plugin看起来像傻瓜ib插件的超类


傻瓜ib::Plugins::Bar
中,
Bar
显然像插件的名称。对于
傻瓜ib::Plugin::Bar
,我怀疑
Bar
Foo::Plugin
使用的助手类,还是插件的名称。

假设
Plugin
是基类:

  • class-doubib::Plugin::Bar

    这是我使用和推荐的
    Bar
    傻瓜ib
    中的
    插件,它继承自
    傻瓜ib::Plugin
    。它还将
    dublib
    库提供的插件嵌套在通用类的名称空间下,该名称空间自然读取:

    # Assign the Bar Plugin of the FooLib library to p.
    p = FooLib::Plugin::Bar
    
    如果我要为您的库开发第三方插件,我将创建以下结构:

    # Baz is a Plugin for the FooLib library provided by BarLib.
    class BarLib::FooLib::Plugin::Baz < ::FooLib::Plugin
    
    #Baz是BarLib提供的傻瓜库的插件。
    类BarLib::傻瓜ib::Plugin::Baz<::傻瓜ib::Plugin
    
    请注意,我镜像了
    dublib
    层次结构,但在
    BarLib
    的命名空间下。我不会直接扩展它

  • class-傻瓜ib::Plugins::Bar<傻瓜ib::Plugin

    我也用过这个,我认为它最有意义
    Bar
    扩展了
    doubib::Plugin
    ,是
    doubib
    提供的
    插件之一。但是,它创建了一个可能不必要的模块

    如果
    Plugins
    是一个实现
    Plugins.add
    Plugins.all
    Plugins.loaded
    等方法的中央插件库,我认为这将是一个很好的选择

    如果可以证明额外模块的合理性,请使用它

  • class-doubib::Plugins::Bar

    对我来说没什么意义
    Bar
    doubib
    中的
    插件之一,该部分看起来不错。但是,它继承自
    插件
    。它是否继承了多个插件?我觉得很奇怪;类名不应该暗示一些不可能的事情


一般来说,我倾向于采取以下方法:

module Foo
  module Plugin
    class Base; end
  end
end

class Foo::Plugin::Bar < Foo::Plugin::Base; end
模块Foo
模块插件
阶级基础;结束
结束
结束
类Foo::Plugin::Bar
插件的
Base
类是RubyOnRails代码库以及其他许多代码库中随处可见的惯例。(例如,
ActiveRecord::Base
ActionController::Base
等)

我不同意@Matheus Moreira的方法,即
Foo::Plugin
被用作插件的基类和名称空间

不应该这样做的唯一功能原因与约定有关——在Ruby社区中,作为名称空间的类的实例比作为模块的要少。我唯一一次真正看到类用作另一个类的名称空间时,所述类的用途是名称空间类专用的,而不是外部使用的。

使用:

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

这是(所以这是Rails的方式)。也就是说,看看关联名称空间和所有构成关联名称空间的类所继承的名称空间。

我支持@jtrim概述的方法

鉴于模块(即插件)仅用于名称空间,我通常会覆盖模块中的新方法:

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(...)

这是一个一般性问题。不依附于我正在做的事情。我对这个话题有一些想法,我想看看其他人对这一切的看法。那傻瓜ib::Plugins::Bar和傻瓜ib::Plugin::Bar呢在我看来,第二个更像是一个对象名->Bar是傻瓜ib中的一个插件,第一个更不适合这种推理。我个人使用
傻瓜ib::Plugin
作为插件的超类,并且将所有子类都保留在它下面:
类傻瓜ib::Plugin::Bar<傻瓜ib::Plugin
。读起来感觉很自然:
Bar
傻瓜ib
中的
插件。我认为在自己的名称空间中包含特定子类的通用类非常有意义。我在我的所有代码中都使用了这个嵌套系统。有很多优点,+1。如果插件不是从公共基类继承的,
傻瓜ib::plugins
看起来非常吸引人。通过查看,我发现模块上的复数名称比类中的复数名称多(请参阅页面下半部分的名称空间)。但是,我没有足够的Rails经验来了解何时使用其中一种,何时使用另一种。
module FooLib
  module Plugins
    class Plugin; end #the base for plugins
    class Bar < Plugin; end
    class Bar2 < Plugin; end
  end
end
- foo_lib/
  - plugins/
    - plugin.rb
    - bar.rb
    - bar2.rb
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(...)