はあなたのために使用しての長所と短所は何ですか:Rubyのネームスペースに名前を付けるための好ましい方法(より良いスタイル)は何ですか?単数形か複数形か?
FooLib::Plugins
FooLib::Plugins::Bar
対
FooLib::Plugin
FooLib::Plugin::Bar
命名規則?そして、あなたは何を使うのでしょうか、何を使っていますか?コミュニティでより一般的に使用されるものは何ですか?
はあなたのために使用しての長所と短所は何ですか:Rubyのネームスペースに名前を付けるための好ましい方法(より良いスタイル)は何ですか?単数形か複数形か?
FooLib::Plugins
FooLib::Plugins::Bar
対
FooLib::Plugin
FooLib::Plugin::Bar
命名規則?そして、あなたは何を使うのでしょうか、何を使っていますか?コミュニティでより一般的に使用されるものは何ですか?
私にとってFooLib::Plugins
はモジュールのように見え、さまざまなプラグインクラスが保持される名前空間として使用されます。FooLib::Plugin
はFooLibプラグインのスーパークラスのようです。
FooLib::Plugins::Bar
では、Bar
はプラグインの名前のようです。 FooLib::Plugin::Bar
では、によって使用されるヘルパークラス、またはプラグインの名前であるかどうかは疑いがあります。 Plugin
を想定し
これは一般的な質問です。私がやっていることには付きません。私はこの話題についていくつかの考えを持っており、他の人がそれについて何を考えているのかを見たいと思っていました。 –
何FooLib ::プラグイン::バー対FooLib ::プラグイン::バーはどうですか? - 2番目のオブジェクトはオブジェクト名のように見えます - > BarはFooLibのプラグインですが、最初はこの推論にあまり合いません。 –
@Jeznet、私はちょうど私の答えを編集しました。 'クラスFooLib ::プラグイン::バー
は、基本クラスである:
class FooLib::Plugin::Bar < FooLib::Plugin
これは私が使用してお勧めです。 Bar
はFooLib
およびでPlugin
であり、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
私はこの1つをも使用している、と私はそれが最も理にかなっていると思います。 Bar
はFooLib::Plugin
であり、FooLib
によって提供されるPlugins
の1つです。ただし、潜在的に不要なモジュールが作成されます。
私はPlugins
がPlugins.add
、Plugins.all
とPlugins.loaded
のようなメソッドを実装し、中央のプラグインリポジトリだった場合、これは素晴らしい選択だと思います。
余分なモジュールを正当化できる場合に使用してください。
class FooLib::Plugins::Bar < FooLib::Plugins
は私に多くの意味がありません。 Bar
はPlugins
のうちの1つで、FooLib
の部分は正常です。ただし、Plugins
から継承しています。それは複数のプラグインから継承されていますか?私には奇妙に聞こえる。クラス名は不可能な何かを示唆するべきではありません。
良い点が多く、+1。プラグインが共通の基底クラスから継承しない場合、 'FooLib :: Plugins'は非常に魅力的です。 –
一般的に、私が取る傾向にあるアプローチがある:プラグイン用
module Foo
module Plugin
class Base; end
end
end
class Foo::Plugin::Bar < Foo::Plugin::Base; end
Base
クラスが慣例では、すべてのRubyOnRailsでの場所で見つかったコードベースだけでなく、他の多くの。 (例えば等ActiveRecord::Base
、ActionController::Base
)
IはFoo::Plugin
が両方の基本クラスとプラグインの名前空間として使用される@Matheusモレイラのアプローチに同意しません。
これが慣例としなければならない行うべきではありません理由だけで機能的な理由 - Rubyコミュニティ1のモジュールよりも名前空間とクラスのあまり多くのインスタンスがあります。私が本当に別のクラスの名前空間として使用されるクラスを実際に見るのは、そのクラスの目的が名前空間クラスに対してプライベートであり、外部では使用されないときだけです。
用途:
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
これはhow Rails does itある(ので、これはRailsの道であります)。私。アソシエーション名前空間(すなわちAssociations::SingularAssociation)を継承するクラスの、そこからすべての関連付け、名前空間とAssociations::Association class見形成します。
私は第二のアプローチは、@jtrimによって概説でしょう。 //api.rubyonrails:[RailsのAPI](HTTPを見ることによって
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(...)
:
モジュール(つまり、プラグインが)だけ名前空間を使用されていることを考えると、私は通常、モジュール内の新しいメソッドをオーバーライド.ORG /クラス/ ActiveRecord.html)、私はクラスに比べてモジュールの詳細複数の名前が(ページの後半では、名前空間を参照)がある参照してください。しかし、私は、Railsをいつ使うのか、そしていつ他のものを使うのかについて十分な経験はありません。 –