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