Какие для вас плюсы и минусы использования:
FooLib::Plugins
FooLib::Plugins::Bar
vs.
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). То есть посмотрите на пространство имен Ассоциаций и класс Ассоциаций :: Ассоциация , от которого все классы образуют пространство имен Ассоциаций (т. е. Ассоциации :: SingularAssociation ).
Как правило, я склоняюсь к следующему подходу:
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
используется как базовый класс и пространство имен для плагинов.
Единственная функциональная причина, по которой этого не следует делать, связана с соглашением - в сообществе Ruby можно найти гораздо меньше экземпляров классов в качестве пространств имен, чем модулей. Единственный раз, когда я действительно вижу классы, используемые в качестве пространства имен для другого класса, это когда назначение указанного класса является частным по отношению к классу пространства имен и не используется внешне.