在Ruby中命名命名空间的首选方式(更好的样式)是什么? 单数还是复数?
什么是使用的利弊:
FooLib::Plugins FooLib::Plugins::Bar
与
FooLib::Plugin FooLib::Plugin::Bar
命名惯例? 你会用什么或者你用的是什么? 在社区中更常用的是什么?
使用:
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
或用不同的词语:
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
这就是Rails的工作方式 (所以这就是Rails方式)。 即,查看Associations名称空间和Associations :: Association类 ,其中构成Associations名称空间的所有类都从该类inheritance(即Associations :: SingularAssociation )。
对我来说, FooLib::Plugins
看起来像一个模块,用作保存各种插件类的命名空间FooLib::Plugin
看起来像FooLib插件的超类。
在FooLib::Plugins::Bar
, Bar
看起来就像一个插件的名字。 使用FooLib::Plugin::Bar
,我很怀疑Bar
是否是Foo::Plugin
使用的助手类,或者是插件的名称。
假设Plugin
是基类:
-
class FooLib::Plugin::Bar < FooLib::Plugin
这是我使用和推荐的那个。
Bar
是FooLib
的Plugin
,它inheritance自FooLib::Plugin
。 它还使FooLib
库提供的插件保持嵌套在通用类的命名空间下,该插件自然地读取:# 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
请注意,我镜像了
FooLib
层次结构,但是在BarLib
的命名空间下。 我不会直接扩展它。 -
class FooLib::Plugins::Bar < FooLib::Plugin
我也使用过这个,我觉得它最有意义。
Bar
扩展了FooLib::Plugin
,是FooLib
提供的Plugins
FooLib
。 但是,它会创建一个可能不必要的模块。我认为如果
Plugins
是一个中央插件存储库来实现插件,如Plugins.add
,Plugins.all
和Plugins.loaded
,这将是一个很好的选择。如果您可以certificate额外模块的合理性,请使用它。
-
class FooLib::Plugins::Bar < FooLib::Plugins
对我来说没有多大意义。
Bar
是FooLib
中的Plugins
之一,该部分看起来很好。 但是,它inheritance自Plugins
。 它是从多个插件inheritance的吗? 这听起来很奇怪; class级名称不应该提出不可能的事情。
我会介绍@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(...)
一般来说,我倾向于采取的方法是:
module Foo module Plugin class Base; end end end class Foo::Plugin::Bar < Foo::Plugin::Base; end
插件的Base
类是在RubyOnRails代码库中以及许多其他地方找到的常规。 (例如ActiveRecord::Base
, ActionController::Base
等)
我不同意@Matheus Moreira的方法,其中Foo::Plugin
既用作基类又用作插件的命名空间。
不应该这样做的唯一function原因与约定有关 - 在Ruby社区中,人们会发现很少的类实例作为名称空间而不是模块。 我真正看到用作另一个类的命名空间的类的唯一一次是当所述类的目的是对命名空间类是私有的并且不在外部使用时。